Emacs可以显示文件的整个git历史记录而无需git.el吗?

Win*_*Win 5 git emacs

我的项目经历了多个目录重命名和目录拆分.gitk处理非常好,能够跟踪从头到文件修订的文件到第一个文件.

然而,Emacs似乎偶然发现了第一次重命名.它只列出了一些最近的修订Ctrl-x v l(Tools > Version Control > Show History在菜单上,vc-git.el中的vc-git-print-log函数):

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 
Run Code Online (Sandbox Code Playgroud)

由于我习惯了Emacs 内置支持版本控制的方式(CVS时代的手指习惯......),我想知道是否有可能使它能够跟踪整个修订历史,尽管重命名,就像gitk确实,使用完全不同的包

Von*_*onC 2

您还有其他用于将 git 与 Emacs 集成的软件包,如此处所述maggitgit-emacsEgg,来自 maggit 的旧分支)。

\n\n

您需要在 git.el 或其他实现中检查的是它们如何实现git log
\n只有一个git log -M -C意愿找到重命名和副本一个文件的(*)(或至少一个git log --follow)。
\n(另外,检查你的 git 版本)

\n\n

(*):不完全适用于一个文件:--follow 是显示一个文件的日志时的正确选项。请参阅此答案的最后部分以了解原因。

\n\n

话虽这么说,无需对当前包进行任何更改,您就可以检查本地git config,然后尝试:

\n\n
git config diff.renames copies\n
Run Code Online (Sandbox Code Playgroud)\n\n

看看是否会改变默认值git.el log结果。

\n\n
\n\n

OP双赢报道:

\n\n
    \n
  • --follow是用于重命名和复制检测的正确选项
  • \n
  • 修改(并在同一文件夹中删除,这很重要!),C:\\emacs-23.2\\lisp\\vc-git.el”添加到该部分vc-git.elc--follow(defun vc-git-print-log ...该选项处于活动状态。
  • \n
\n\n
\n\n

-C注意:要了解和-M选项之间的区别--follow,请参阅此线程

\n\n

雅库布·纳尔\xc4\x99bski在 2010 年 5 月提到过(在 2011 年 7 月这似乎仍然准确):

\n\n
\n

\' \' 对于没有路径规范的 " "-M/-C很有用,包括例如 "git diffgit show -C ”。

\n\n

“”的问题git log -M -- <filename>在于,良好性能所需的历史简化发生在 diff 机制有机会执行重命名检测之前。之前有 \' --follow\' 选项git-log之前(它仅支持单个文件的情况,并且对于更复杂的历史记录效果不佳),您被迫执行以下操作:

\n
\n\n
$ git log -M -- <filename> <oldname> <oldername>...\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n
\n

另外,有没有办法将其设置为“ git log\”的默认值?

\n
\n\n

我不这么认为。另请注意,\' --follow\' 仅适用于单个文件,例如(当前)不适用于目录路径规范。

\n
\n\n

Eli Barzilay补充道:

\n\n
\n

好的,所以只是为了澄清这一点:
\n -C-M(and --find-copies-harder) 分别代表 \' \' 和\' \'diff并带有单个文件(并且每个文件都会将其传递给另一个文件)?--followlog

\n
\n\n

杰夫·金回答:

\n\n
\n

是的(嗯,diff永远不能传递--followlog,因为diff从不调用日志,但是,是的,日志显示的每次提交差异使用-C-M赋予日志)。

\n
\n\n
\n\n

关于配置设置,Jeff King 提到:

\n\n
\n

复制检测可能真的很慢。默认情况下它未打开是有原因的。
\n 在某些存储库中尝试“ git log -1000 -p”与“ git log -1000 -p -C -M --find-copies-harder”。
\n 在一个简单的git.git测试中,它几乎慢了 5 倍(大约 1 秒,而我的机器上是 5 秒)。
\n 对于大型存储库,情况可能会更糟,因为现在每个 diffO(size of repository)都不是O(size of changes).

\n\n

不过,我明白你的观点,如果你有一个足够小的回购协议,你可能会一直想要它。一直有“ diff.renames”开启重命名检测。
\n 但我认为 alog.follow option在这一点上没有意义

\n
\n\n
$ git config log.follow true\n$ git log foo.c ;# ok, follow foo.c\n$ git log foo.c bar.c ;# uh oh, now what?\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

最后一个是不是只是呕吐,让你说“ git log --no-follow foo.c bar.c”?
\n 它是否会悄悄关闭--follow,让用户猜测为什么“ ”找到了一些“ ”没有找到的git log foo.c历史记录?git log foo.c bar.c

\n
\n