2013-02-13 3 views
2

Я хочу узнать, какая фиксация введена в файл. Я сейчас делаю:Какой фиксатор ввел файл?

git log --reverse --pretty="%h" <filename> | head -n 1 

но я понимаю, что это очень дорого. Есть ли способ сделать это быстрее (используя более дешевые команды plubming)? Возможно, путем деления пополам истории?

+0

Я сомневаюсь. История Git хранится как связанный список, поэтому вы можете отслеживать только путь от фиксации до начала. Чтобы разделить историю, вам нужно сначала отследить историю, которую вы совершаете за один раз, и у вас уже есть O (n). Лучшее, на что вы можете надеяться, это посмотреть дерево каждого фиксации во время прохождения и прекратить работу до достижения корня. – vhallac

ответ

1

Возможно, вам не нужно 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.

2

Это должно сделать трюк:

git log --oneline <filename> | tail -1 
+1

Во-первых, '--oneline' является только сокращением для' --pretty = oneline -abbrev-commit': он не избегает красивой обработки каким-либо образом и, следовательно, не быстрее. Во-вторых, ограничение фиксации, использующее '- ', возможно, лучше, чем создание другой утилиты командной строки (в этом случае' tail -1') и подключение к ней. – artagnon

+0

Да, но это решение действительно работает. Это должно что-то учитывать? :) Ах, я вижу, вы отредактировали команду хвоста в свой вопрос. Рад помочь! – JosefAssad

+0

К сожалению: отредактированный вопрос для использования 'head -n 1', так как' -1' применяется до '--reverse'. – artagnon

0

Если у вас есть общее представление о том, когда вы добавили файл, вы можете попробовать

git log --reverse --until 2012-06-01 -n 1 -- <filename> 

если вы достаточно уверены, что файл WASN» t введено после 2012-06-01. Комбинация --reverse и -n 1 показывает только первую фиксацию раньше указанной даты. Если вы не получите никаких результатов, ваша оценка слишком ранняя, и вам нужно попробовать более позднюю дату.

С учетом пути git хранит историю (с использованием ориентированного ациклического графика), я не думаю, что git log выполняет значительно большую работу, чем вам нужно было бы, строя вместе команды водопровода нижнего уровня.

+0

Хм, дата-фиксация ограничивает скорость движения вверх.Однако, как вы могли догадаться, я выполняю это из сценария. Означает ли это, что я должен хранить свои догадки, соответствующие каждому файлу для моего сценария? Каковы ваши мысли о программной дезактивации истории? – artagnon

+0

Уродливый. Я думаю, что любая попытка, так как потребуется несколько вызовов в git, будет медленнее, чем ваша оригинальная идея. См. Мой другой ответ, просто заменив 'git log' на' git rev-list'. – chepner

0

Используйте дифф-фильтр = A

git log --reverse --format=%H --name-status --diff-filter=A -- file1 file2 | grep ^A | cut -f2 

Для любого количества файлов, вы получите требуемый порядок в одном обходе.

Смежные вопросы