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

84 git history dvcs rename git-log

我已经重命名了几个文件git mv,使用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%
Run Code Online (Sandbox Code Playgroud)

我现在正试图获取其中一个移动文件的历史记录,所以我可以看一个旧版本,但我没有得到任何非常有用的东西:

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

(我也尝试过没有-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%
Run Code Online (Sandbox Code Playgroud)

所以这次我并没有完全陷入困境,但我不想一直这样做.(我预计会有相当数量的文件在他们的生活中至少移动一次.)

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

有什么办法可以解决这个问题吗?

小智 109

请试试git log --follow你的文件.我从这里学习是否可以在git中移动/重命名文件并保持其历史记录?

  • 如果你得到`fatal:ambiguous argument'file.txt':未知版本或路径不在工作树中`,请尝试git log --follow - file.txt (4认同)

use*_*515 25

好吧,我确实看到了我的重命名git log -M --summary...


小智 16

回答我自己的问题,因为我已经设法减轻了我的担忧,即使我没有完全解决我的问题.(git log --follow但仍然不适合我.)

首先,--summary重命名提交的日志包括delete具有文件旧名称的行.因此,如果它很容易被发现,你可以git log从那里找到它的旧名称.

如果它是一些大型提交的一部分,因此有点难以发现 - 这种情况是我的担心之一 - git blame -C可以在第一次重命名后修订时使用文件的新名称.据推测,原始文件中的行仍然存在! - 所以git应该找到它们的源代码,并显示旧的文件名(和一个提交哈希值以获得良好的衡量标准).然后你可以拿起小道git log.

因此,如果您对文件的历史感兴趣(无论出于何种原因),那么它似乎可以相对简单地完成.虽然我得到的印象git更喜欢你正确使用它.

  • 我认为您需要-M选项来实际显示重命名而不是删除/添加 (6认同)

jan*_*kuo 8

git log --follow ./path/to/file
Run Code Online (Sandbox Code Playgroud)

我相信这就是你要找的东西.

  • 五年前的答案就有此信息。 (2认同)