Для поиска дубликатов фиксаций фиксации $hash
, за исключением слияния совершает:
git rev-list --no-merges --all | xargs -r git show | git patch-id \
| grep ^$(git show $hash|git patch-id|cut -c1-40) | cut -c42-80 \
| xargs -r git show -s --oneline
Для поиска дубликата слияния совершить $mergehash
, замените $(git show $hash|git patch-id|cut -c1-40)
выше одним из двух идентификаторов патча (1-й столбец), указанных git diff-tree -m -p $mergehash | git patch-id
. Они соответствуют различиям в объединении с каждым из двух его родителей.
Чтобы найти дубликаты всех фиксаций, за исключением слияния совершает:
git rev-list --no-merges --all | xargs -r git show | git patch-id \
| sort | uniq -w40 -D | cut -c42-80 \
| xargs -r git log --no-walk --pretty=format:"%h %ad %an (%cn) %s" --date-order --date=iso
Поиск дубликатов фиксаций может быть расширен или ограничено путем изменения аргументы git rev-list
, который принимает многочисленные варианты. Например, чтобы ограничить поиск определенной веткой, укажите его имя вместо опции --all
; или для поиска в последних 100 совершениях передают аргументы HEAD ^HEAD~100
.
Обратите внимание, что эти команды бывают быстрыми, так как они не используют цикл оболочки, а пакетный процесс совершает.
Чтобы включить коммиляцию, снимите опцию --no-merges
и замените xargs -r git show
на xargs -r -L1 git diff-tree -m -p
. Это намного медленнее, потому что git diff-tree
выполняется один раз за фиксацию.
Пояснение:
Первая строка генерирует карту идентификаторов патча с совершающими хешами (данные 2-колонок, по 40 символов в каждом).
Вторая строка сохраняет только хэши фиксации (2-й столбец), соответствующие идентификаторам повторяющихся патчей (1-й столбец).
Последняя строка печатает пользовательские данные о дублировании.
Это увлекательная функция. Из любопытства, как далеко в прошлом вы намереваетесь смотреть? Я видел, как некоторые творческие возможности интеграции для этого (т. Е. «Мой вкладчик не знает, как переустанавливать»), но в течение долгой истории это было бы менее эффективно ...? – Christopher
Проблема появилась в недельной истории одной ветви, поэтому мой прецедент был довольно нежным (git log -p было достаточно). Комментарий патча-идентификатора мне любопытно, хотя ... Поиск всей истории может быть болезненным. – bsb