Подтвердить что ты не робот

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

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

Но теперь, post-commit, я не могу попасть в историю перемещенных файлов! Здесь 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 alpha.

<<snip older commits>>
~/projects%

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 3

Хорошо, я вижу, что мои имена переименовываются с git log -M --summary..

Ответ 4

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

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