В общем случае, вам на самом деле придется проверять каждый коммит, потому что у вас нет возможности узнать, есть ли у вас огромный дифференциал в одном, маленький дифференциал в следующем, затем другой огромный, затем средний....
Лучше всего будет ограничиться определенными файлами.Если вы рассматриваете только один файл, это не займет много времени, чтобы перебрать все версии этого файла (используйте git rev-list <path>
, чтобы получить список, так что вам не нужно тестировать каждый коммит).Для каждого коммита, который изменил файл, вы можете проверить размер diff и довольно быстро найти минимум.Сделайте это для нескольких файлов, надеюсь, они согласятся!
Лучший способ настроить себя для сравнения - сделать временный коммит, просто скопировав в свой tarball, чтобы вы могли иметь ветку с именемtarball
для сравнения.Таким образом, вы можете сделать это:
git rev-list path/to/file | while read hash; do echo -n "$hash "; git diff --numstat tarball $hash path/to/file; done
, чтобы получить хороший список всех коммитов с их размерами различий (первые три столбца будут SHA1, количество добавленных строк и количество удаленных строк),Тогда вы можете просто передать его в awk '{print $1,$2+$3}' | sort -n -k 2
, и у вас будет отсортированный список коммитов и их размеры различий!
Если вы не можете ограничиться небольшим количеством файлов для тестирования, яможет возникнуть искушение вручную реализовать что-то похожее на git-bisect
- просто попытайтесь сузить свой путь до небольшого различий, делая предположение, что, по всей вероятности, коммиты, близкие к вашему лучшему случаю, также будут иметь меньшие разности, а коммиты далеки отэто будет иметь большие различия.(Где-то между методом Ньютона и полным бинарным / сеточным поиском, возможно?)
Редактировать: Другая возможность, предложенная в Дуглас 'ответ , если вы думаете, что некоторые файлы могут быть идентичный тем, которые есть в некоторых коммитах, состоит в том, чтобы хэшировать их с помощью git-hash-object
, а затем посмотреть, какие коммиты в вашей истории имеют этот BLOB-объект.Есть вопрос с несколькими отличными ответами о том, как это сделать.Если вы сделаете это с несколькими файлами - желательно с частыми изменениями - вы сможете довольно быстро сузить целевой коммит.