我使用不带squash选项的git subtree add将一个树合并到我的存储库。git日志显示提交已成功添加到存储库。但是,如果我执行git log --follow filename,历史记录将在合并时停止,并且不显示以前的提交。我尝试使用-M而不是--follow,同样也不起作用。如何从合并前获取特定文件或文件的提交日志?
发布于 2016-11-01 03:22:03
实际上,git log --follow应该与子树合并一起工作,但众所周知,它在很长一段时间内都是黑客行为。
人们可以坚持使用子树合并,并断定该策略对于跟踪多个历史是有效的,并耐心地等待git log --follow将会改进的不可避免的事件。这实际上可能是一个可行的决定,因为目前git log --follow可以在非常有用的情况下看到一些历史。假设您将一个文件从顶层存储库移动到子存储库,那么它可以跟踪整个移动过程。当您想要跟踪特定于子存储库的历史记录时,您确实需要有一个单独的副本或签出子存储库分支。
替代方案和变通方法
您可以获取文件的日志,如下所示
git log -- '*filename' # from the toplevel此视图中的每个提交操作都会接触到名称以filename结尾的文件。它不会跟随实际的重命名,并且如果您有几个文件具有相同的基名1,则可能会显示误报。
您还可以使用不同的策略合并存储库。参考文献4展示了这样做的一种方法,它非常接近于常规的子树合并,但具有可追溯的历史。基本上,你:
中完成的
然后:
可以正常获取和合并
-Xsubtree标志进行git合并。中的评论
参考文献
来自git邮件列表http://git.661346.n2.nabble.com/Bug-Files-are-losing-history-after-subtree-merge-td7597197.html的%1
2从git邮件列表http://git.661346.n2.nabble.com/gsoc-Better-git-log-follow-support-td6188083.html#a6188352
3 git log --follow已经参加了Google Summer of Code https://git.wiki.kernel.org/index.php/SoC2011Ideas#Better_git_log_--follow_support
发布于 2013-01-22 06:00:23
由git subtree merge或git subtree add创建的提交对来自子树的文件执行“添加”,而不是“移动”。这意味着它们的历史记录不能像其他合并或移动那样被跟踪。
在合并之前,通过直接查看子树,仍然可以显示所需文件的历史记录。如果您的工作区是git subtree创建的合并提交,那么它的第二个父级(HEAD^2)将是原始子树的最后一个提交。在这里,您可以看到原始子树的内容:
# Display the contents of the original subtree
git ls-tree HEAD^2从这次提交中,您可以跟踪您感兴趣的文件的更改。请注意,您的文件在子树中的路径与在工作区中的路径不同。您需要删除指定给git subtree的--prefix,才能获得正确的文件路径。
git log HEAD^2 --follow -- path-in-subtree/filehttps://stackoverflow.com/questions/10918244
复制相似问题