У вас есть другие пакеты для интеграции git с Emacs , как описано здесь ( maggit , git-emacs или egg (старый форк от maggit).
Что нужно проверить, в git.el или в других реализациях, это как они реализуют git log :
Только git log -M -C
сможет найти переименования и копии файла (*) (или, по крайней мере, git log --follow
).
(Также, проверьте вашу версию git )
(*): Не совсем для один файл: --follow - это правильный вариант при отображении журнала для один файл.См. Последнюю часть этого ответа, чтобы узнать, почему.
При этом, не меняя ничего в своем текущем пакете, вы можете проверить свой локальный git config
и попробовать:
git config diff.renames copies
и посмотрите, меняет ли это результат по умолчанию git.el log
.
OP WinWin сообщает:
--follow
- это правильная опция, используемая для обнаружения переименования и копирования для одного данного файла. - , изменяющего
C:\emacs-23.2\lisp\vc-git.el
(и удаляющего vc-git.elc
в той же папке , это важно!), добавление "--follow
" к (defun vc-git-print-log ...
части достаточно для того, чтобы указанная опция была активной.
Примечание: чтобы понять разницу между -C
и -M
опциями и --follow
, см. эту тему
Jakub Narębski , упомянутый в мае2010 (и это все еще кажется точным в июле 2011 года):
'-M/-C
' полезно с "git diff
" без pathspec, включая, например, "git show -C
".
Проблемаm с "git log -M -- <filename>
" заключается в том, что упрощение истории, которое требуется для хорошей производительности, происходит до того, как механизм diff сможет выполнить обнаружение переименования.До того, как появилась опция --follow
для git-log
(которая поддерживает только случай с одним файлом и не очень хорошо работает с более сложной историей), вы были вынуждены сделать:
$ git log -M -- <filename> <oldname> <oldername>...
Кроме того, есть ли способ установить это значение по умолчанию для 'git log
'?
Я так не думаю.Также обратите внимание, что «--follow
» работает только с одним файлом и не работает, например, (в настоящее время) со спецификацией пути к каталогу.
К чему Эли Барзилай добавляет:
ОК, так что просто чтобы прояснить это:
-C
и -M
(и --find-copies-harder
) для 'diff
', а --follow
для 'log
' с одним файлом (и каждый передаст его другому)?
Джефф Кинг ответы:
Да (ну, diff
никогда не сможет передать --follow
на log
, поскольку diff
никогда не вызывает журнал, но да,-commit diff, показанный в log, использует -C
и -M
, заданные для log).
О настройках конфигурации Джефф Кинг упоминает:
обнаружение копирования может быть очень * медленным.Есть причина, по которой он не включен по умолчанию.
Попробуйте "git log -1000 -p
" против "git log -1000 -p -C -M --find-copies-harder
" в некоторых репозиториях.
В простом git.git
тесте он почти в 5 раз медленнее (примерно 1секунда против 5 секунд на моей машине).
Для больших репозиториев это может быть намного хуже, потому что теперь каждый diff равен O(size of repository)
вместо O(size of changes)
.
Тем не менее, я понимаю, что выВозможно, вы захотите это делать постоянно, если у вас достаточно маленький репо.Существует «diff.renames
», чтобы постоянно включать обнаружение переименования.
Но я думаю, что log.follow option
не имеет смысла на этом этапе :
$ git config log.follow true
$ git log foo.c ;# ok, follow foo.c
$ git log foo.c bar.c ;# uh oh, now what?
Неужели последний только раздражает и заставляет вас сказать "git log --no-follow foo.c bar.c
"?
Он тихо выключает --follow
, заставляя пользователя догадываться, почему "git log foo.c
" находит какую-то историю, которая "git log foo.c bar.c
"нет?