Возможно, вам не нужно git log
, но только git rev-list
:
git rev-list HEAD -- <filename> | tail -n 1
или
git rev-list --reverse HEAD -- <filename> | head -n 1
В принципе ту же команду, как git log
, но он возвращает только в SHA-1 из фиксаций , поэтому теряются служебные данные форматирования сообщения журнала . Независимо от того, насколько значительны эти накладные расходы по сравнению с ходьбой, это еще один вопрос.
Можно использовать git rev-list --bisect
реализовать свой собственный бинарный поиск, но повторяющиеся вызовы git rev-list
необходимой почти , конечно, будет происходить медленнее, чем просто обжигающе один вызов либо head
или tail
.
Я сомневаюсь. История Git хранится как связанный список, поэтому вы можете отслеживать только путь от фиксации до начала. Чтобы разделить историю, вам нужно сначала отследить историю, которую вы совершаете за один раз, и у вас уже есть O (n). Лучшее, на что вы можете надеяться, это посмотреть дерево каждого фиксации во время прохождения и прекратить работу до достижения корня. – vhallac