我在没有squash选项的情况下使用git子树添加将一棵树合并到我的存储库中。 git日志显示提交已成功添加到存储库。但是,如果我执行git log --follow filename
,则历史记录在合并处停止,并且不会显示先前的提交。我尝试使用-M
代替--follow
,但这也不起作用。如何在合并之前获取特定文件或文件的提交日志?
答案 0 :(得分:15)
由git subtree merge
或git subtree add
创建的提交对来自子树的文件执行“添加”,而不是“移动”。这意味着无法像其他合并或移动那样跟踪其历史记录。
通过在合并之前直接查看子树,仍然可以显示所需文件的历史记录。如果您的工作区是git subtree
创建的合并提交,那么它的第二个父级(HEAD^2
)将是原始子树的最后一次提交。从这里您可以看到原始子树的内容:
# Display the contents of the original subtree
git ls-tree HEAD^2
通过此提交,您可以跟踪您感兴趣的文件的更改。请注意,文件的路径在工作区中的子树中是不同的。您需要移除--prefix
给git subtree
才能获得正确的文件路径。
git log HEAD^2 --follow -- path-in-subtree/file
答案 1 :(得分:5)
实际上,git log --follow
应该使用子树合并,但已知很长时间以来都是hackish [1-3]。
可以坚持使用子树合并和休息,以确保该策略对于跟踪多个历史记录是有效的,并耐心地等待git log --follow
将改善的不可避免的事件。这实际上可能是一个可行的决定,因为目前git log --follow
可以在非常有用的情况下看到一些历史。假设您将文件从顶级仓库移动到子仓库,然后它可以跟踪完整的移动。当您想要跟踪特定于子仓库的历史记录时,您必须拥有单独的副本或签出子仓库分支。
您可以获取这些文件的日志[1]:
git log -- '*filename' # from the toplevel
这会查看触及名称文件的每个提交
以filename
结尾。它不会遵循实际的重命名,并且可能显示为false
如果您有多个具有相同基名[1]的文件,则为肯定。
您还可以使用不同的策略合并存储库。 Ref [4]显示了一种方法,它与常规子树合并非常接近,但具有可追溯的历史。基本上,你:
git mv
子仓库文件分隔文件夹然后:
-Xsubtree
标记进行git merge。[1]来自git邮件列表 http://git.661346.n2.nabble.com/Bug-Files-are-losing-history-after-subtree-merge-td7597197.html
[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