Может ли Emacs отображать всю историю git файла, не требуя git.el? - PullRequest
5 голосов
/ 13 июля 2011

Мой проект прошел несколько переименований каталогов и разделение каталогов.gitk очень хорошо справляется с этим и способен отследить файл от головы до всех версий файла, вплоть до самой первой.

Однако Emacs, похоже, натыкается на первое переименование.Это только перечисляет несколько последних изменений при выполнении Ctrl-x v l (Tools > Version Control > Show History в меню, vc-git-print-log функция в vc-git.el ):

commit 13172930ab094badeab81cd2e05119d2a4c1f58a
Author: WinWin <winwin@example.com>
Date:   Tue Jul 12 18:17:27 2011 -0600

    commit comment 

commit 0b52ca957a79a26e51bdd6f7193ef913c4abdc7b
Author: WinWin <winwin@example.com>
Date:   Tue Jul 10 10:39:12 2011 -0600

    commit comment 

commit 8ca577e532849203646867527921b66aa1162dbd
Author: WinWin <winwin@example.com>
Date:   Tue Jul 10 08:01:59 2011 -0600

    commit comment 

commit 9e623a23ad485d0937fe5409162f07434be8ca63
Author: WinWin <winwin@example.com>
Date:   Tue Jul 10 01:50:39 2011 -0600

    commit comment 

Так как япривык к тому, как в Emacs встроенная поддержка контроля версий работает (привычки пальцев из дней CVS ...), мне интересно, возможно ли включить его для отслеживания всей истории изменений, несмотря на переименованиятак же, как gitk, без , использующий совершенно другой пакет ?

1 Ответ

2 голосов
/ 13 июля 2011

У вас есть другие пакеты для интеграции 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 "нет?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...