为什么git log可能不显示移动文件的历史记录,我该怎么办?


90

我使用git mv,used 和重命名了几个文件,git stash快速浏览了HEAD(不进行更改),然后又git stash pop重新取回了很多文件。我的举动已从提交列表中消失,因此我用它们进行git rm了重新命名,并且提交消息声称git发现该重命名为重命名。所以我不再想了。

但是现在,提交后,我无法了解已移动文件的历史记录!这是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's alpha.

<<snip older commits>>
~/projects%

因此,这次我并没有完全陷入困境,但是我不想一直都在做这种事情。(我预计会有相当数量的文件在它们的生命中至少会移动一次。)

难道我做错了什么?文件的旧副本和新副本相同,为98.8%(更改166中的2行)。我的理解是,在这种情况下git应该能够跟踪文件,因为git会推断出重命名操作而不是显式存储它们,并且文件足够相似,我认为它应该认为它们相同。

有什么我可以解决的吗?


猜猜:如果您在〜/ projects /而不是〜/ projects / system / runtime / src内执行命令,是否可行?
道格拉斯2010年

不,我得到相同的结果。(总的来说,git对于让您位于任何文件夹中似乎都非常不错...)

但这给了我一个主意,我用我的发现更新了这个问题。感谢您的评论!

我在mswindows上使用“ tortoiseGit 1.5.8.0”和“ 1.7.3.1.msysgit.0”。当我在资源管理器中重命名并提交文件时,我在GUI中看到“状态=重命名”。我对git如何在命令行中回答“如何做到这一点”一无所知,但是tortoiseGit为我做了一些符合您期望的工作。
k3b

Answers:



28

好吧,我确实看到了以git log -M --summary..


git log -M --summary如果仅查看某些给定文件的历史记录(即带有文件参数),则不会提供任何重命名信息。
vinc17

17

回答我自己的问题,因为即使我没有完全解决我的问题,也可以缓解我的疑虑。(git log --follow不过,对我来说仍然无效。)

首先,--summary用于重命名提交的日志包括delete带有文件旧名称的行。因此,如果很容易找到它,则可以从中找到它的旧名称git log

如果它是大型提交的一部分,因此很难发现-这种情况是我担心的问题- git blame -C可以在第一次重命名后的修订版中将文件的新名称与该名称一起使用。大概行仍然保留在原始文件中!-因此git应该找到其源代码,并显示旧文件名(以及良好的提交哈希值)。然后,您可以使用接上小径git log

因此,如果您对文件历史记录有一个整体的兴趣(无论出于何种原因),那么似乎可以相对直接地完成它。尽管我得到了印象,git还是希望您正确使用它。


6
我认为你需要-M选项实际显示重命名,而不是删除/添加的
阿德里安康沃尔

1
刚刚遇到了同样的问题,并注意到您的工作目录有所不同git log --follow .,其中工作目录为新位置不起作用,而git log --follow path/to/new/dir从旧位置和新位置的公共父目录执行则起作用
akraf

1
--follow参数确实有效,但是您需要执行以下操作:git log --follow -- ./path/to/file
DrumM

我刚刚遇到了git -log filename.cs文件移动提交停止的问题(当前目录设置为文件的文件夹)。但是,VS历史记录窗口会显示整个文件更改日志。我还可以看到该文件已随Github桌面一起移动。但是也git log -10 --follow filename.cs显示移动提交之前的日志。
oleksa

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.