我的项目经历了多个目录重命名和目录拆分.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确实,不使用完全不同的包?
您还有其他用于将 git 与 Emacs 集成的软件包,如此处所述(maggit、git-emacs或Egg,来自 maggit 的旧分支)。
\n\n您需要在 git.el 或其他实现中检查的是它们如何实现git log:
\n只有一个git log -M -C意愿找到重命名和副本一个文件的(*)(或至少一个git log --follow)。
\n(另外,检查你的 git 版本)
(*):不完全适用于一个文件:--follow 是显示一个文件的日志时的正确选项。请参阅此答案的最后部分以了解原因。
\n\n话虽这么说,无需对当前包进行任何更改,您就可以检查本地git config,然后尝试:
git config diff.renames copies\nRun Code Online (Sandbox Code Playgroud)\n\n看看是否会改变默认值git.el log结果。
OP双赢报道:
\n\n--follow是用于重命名和复制检测的正确选项。C:\\emacs-23.2\\lisp\\vc-git.el“ ”添加到该部分vc-git.elc--follow(defun vc-git-print-log ...该选项处于活动状态。-C注意:要了解和-M选项之间的区别--follow,请参阅此线程
雅库布·纳尔\xc4\x99bski在 2010 年 5 月提到过(在 2011 年 7 月这似乎仍然准确):
\n\n\n\n\n\' \' 对于没有路径规范的 " "
\n\n-M/-C很有用,包括例如 "git diffgit show -C”。“”的问题
\ngit log -M -- <filename>在于,良好性能所需的历史简化发生在 diff 机制有机会执行重命名检测之前。之前有 \'--follow\' 选项git-log之前(它仅支持单个文件的情况,并且对于更复杂的历史记录效果不佳),您被迫执行以下操作:
$ git log -M -- <filename> <oldname> <oldername>...\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n\n\n\n另外,有没有办法将其设置为“
\ngit log\”的默认值?我不这么认为。另请注意,\'
\n--follow\' 仅适用于单个文件,例如(当前)不适用于目录路径规范。
Eli Barzilay补充道:
\n\n\n\n\n好的,所以只是为了澄清这一点:
\n
\n-C和-M(and--find-copies-harder) 分别代表 \' \' 和\' \'diff并带有单个文件(并且每个文件都会将其传递给另一个文件)?--followlog
杰夫·金回答:
\n\n\n\n\n是的(嗯,
\ndiff永远不能传递--follow给log,因为diff从不调用日志,但是,是的,日志显示的每次提交差异使用-C并-M赋予日志)。
关于配置设置,Jeff King 提到:
\n\n\n\n\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).不过,我明白你的观点,如果你有一个足够小的回购协议,你可能会一直想要它。一直有“
\ndiff.renames”开启重命名检测。
\n 但我认为 alog.follow option在这一点上没有意义:
$ 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?\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n最后一个是不是只是呕吐,让你说“
\ngit log --no-follow foo.c bar.c”?
\n 它是否会悄悄关闭--follow,让用户猜测为什么“ ”找到了一些“ ”没有找到的git log foo.c历史记录?git log foo.c bar.c
| 归档时间: |
|
| 查看次数: |
1013 次 |
| 最近记录: |