Почему git log может не отображать историю перемещенного файла и что я могу с этим сделать?


91

Я переименовал пару файлов, используя git mv, использовал git stash, быстро взглянул на HEAD (не меняя его), а затем сделал, git stash popчтобы вернуть все обратно. Мои ходы исчезли из списка коммитов, поэтому я переделал их, git rmи в сообщении коммита утверждалось, что git обнаружил, что переименование было переименованием. Так что я больше не думал об этом.

Но теперь, после фиксации, я не могу получить доступ к истории перемещенных файлов! Вот что git говорит о рассматриваемой фиксации:

~/projects% git log --summary
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime

 delete mode 100644 test/R_DebugUI_iOS.h
 delete mode 100644 test/R_DebugUI_iOS.m
 create mode 100644 system/runtime/src/R_DebugUI_iOS.h
 create mode 100644 system/runtime/src/R_DebugUI_iOS.m

 <<snip older commits>>
 ~/projects%

Сейчас я пытаюсь получить историю одного из этих перемещенных файлов, чтобы посмотреть старую версию, но не получаю ничего очень полезного:

~/projects/system/runtime/src% git log --follow --find-copies-harder -M -C R_DebugUI_iOS.m
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime
~/projects/system/runtime/src% 

(Я также пробовал без -M, -Cи --find-copies-harder, но безрезультатно.)

Я могу получить его историю под его старым именем, которое останавливается в том месте, где оно было удалено из старого местоположения:

~/projects% git log --summary --follow --find-copies-harder -M -C -- test/R_DebugUI_iOS.m
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime

 delete mode 100644 test/R_DebugUI_iOS.m

commit 32a22d53c27e260714f759ecb3d3864e38b2e87f
Author: brone
Date:   Tue Dec 7 23:52:51 2010 +0000

    Can set debug UI's alpha.

<<snip older commits>>
~/projects%

Так что на этот раз я не застрял полностью, но мне бы не хотелось, чтобы мне приходилось делать такие вещи все время. (Я ожидаю, что у меня будет изрядное количество файлов, которые будут перемещены хотя бы раз в жизни.)

Я делаю что-то неправильно? Старая копия файла и новая копия на 98,8% совпадают (изменены 2 строки из 166). Насколько я понимаю, git должен иметь возможность отслеживать файл в этом случае, потому что он подразумевает операции переименования, а не их явное сохранение, и файлы достаточно похожи, чтобы я считаю, что он должен считать их одинаковыми.

Что я могу сделать, чтобы это исправить?


Угадайте: это сработает, если вы выполните команду внутри ~ / projects / вместо ~ / projects / system / runtime / src?
Дуглас,

Нет, я получаю тот же результат. (В общем, git кажется неплохим, позволяя вам быть в любой папке ...)

Это дало мне представление, и я обновил вопрос своими выводами. Спасибо за комментарий!

Я использую tortoiseGit 1.5.8.0 вместе с 1.7.3.1.msysgit.0 в mswindows. Когда я переименовываю + фиксирую файл в проводнике, я вижу в своем интерфейсе «status = Rename». Я недостаточно знаю о git, как это сделать в командной строке, чтобы ответить «как это сделать», но tortoiseGit сделал для меня кое-что, что сработало так, как вы ожидали.
k3b

Ответы:



28

Ну, я вижу свои переименования с git log -M --summary..


git log -M --summaryне дает никакой информации о переименовании, если вы просто просматриваете историю некоторого данного файла, то есть с аргументом файла.
vinc17

17

Отвечая на свой вопрос, поскольку мне удалось развеять мои опасения, даже если я не решил свою проблему в точности. ( git log --followхотя все еще не работает для меня.)

Во-первых, в --summaryжурнале фиксации переименования есть deleteстрока со старым именем файла. Так что, если его легко обнаружить, вы можете найти его старое название и git logоттуда.

Если это часть какого-то большого коммита и, следовательно, его труднее обнаружить - а эта ситуация была одной из моих проблем - git blame -Cможно использовать с новым именем файла в первой ревизии после переименования. Предположительно строки остались от исходного файла! - поэтому git должен найти их источник и показать старое имя файла (и хеш фиксации для хорошей меры). Затем вы можете продолжить путь с помощью git log.

Итак, если вас интересует история файла как единицы (по какой-либо причине), то, похоже, это можно сделать относительно просто. Хотя у меня сложилось впечатление, что git предпочел бы, чтобы вы использовали его правильно.


6
Я думаю, вам нужна опция -M, чтобы показывать переименования, а не удалять / добавлять,
Адриан Корниш

1
У меня была такая же проблема, и вы заметили, что ваш рабочий каталог имеет значение, git log --follow .где рабочий каталог в новом месте не работает, в то время как git log --follow path/to/new/dir, выполняемый из общего родительского каталога старого и нового местоположения, работает
akraf

1
--followПараметр делает работу, но вам нужно сделать:git log --follow -- ./path/to/file
Drumm

У меня проблема, которая git -log filename.csостанавливается при фиксации перемещения файла (текущий каталог установлен в папку с файлом). Однако в окне истории VS отображается весь журнал изменений файла. Также я вижу, что файл был перемещен с рабочего стола Github. Но также git log -10 --follow filename.csпоказывает журнал перед фиксацией перемещения.
oleksa

12
git log --follow ./path/to/file

Я считаю, что это то, что вы ищете.


3
Эта информация содержится в ответе за пять лет до этого.
dotancohen
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.