我用git的子树添加,而不壁球选项合并一棵树到我的仓库。 一个Git日志显示提交成功添加到库中。 但是,如果我做了git log --follow filename
,历史上停在合并和不显示先前提交。 我尝试使用-M
代替--follow
和,不能正常工作。 我怎样才能得到一个特定的文件或文件日志提交的从合并之前?
Answer 1:
其实, git log --follow
应与子树合并工作,但它被称为是hackish的很长一段时间[1-3]。
人们可以用树合并坚持和休息asured,该策略是有效的跟踪多个历史记录,并耐心等待不可避免的事件git log --follow
将得到改善。 这实际上可能是一个可行的决定,因为目前git log --follow
可以看到一些历史非常有用的情况。 假设你从移动顶层回购文件到子回购,那么它可以跟踪完整的移动。 当你要跟踪的历史特定于子回购,你真的必须有一个独立的副本,或检查出一个子分支回购。
备选方案和解决办法
你可以得到日志这样的[1]的文件:
git log -- '*filename' # from the toplevel
此图,各自提交感动他的名字与结尾的文件filename
。 它不会跟着实际的重命名,并可能表现出假阳性,如果你有相同的基本名称[1]几个文件。
您也可以采用不同的策略合并的存储库。 参考文献[4]可见的方式来做到这一点,这是非常接近你所拥有的定期子树合并,但追溯历史。 基本上,你:
- 添加,获取每个子库的顶层库合并为一个普通遥控器,没有git的子树或readtree。 起初,这将polute你的根目录,就好像是他们的,所以这是在一个项目的生命的开始做。
-
git mv
子回购文件到单独的文件夹
然后:
- 上游的变化可以被撷取并正常合并,但与
-Xsubtree
标志与git合并。 - 其他情况应该是相似的。 我测试过上游推动和它的作品,看到评论[4]。
参考
[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
一直在代码中的谷歌暑期https://git.wiki.kernel.org/index.php/SoC2011Ideas#Better_git_log_--follow_support
[4] https://saintgimp.org/2013/01/22/merging-two-git-repositories-into-one-repository-without-losing-file-history
Answer 2:
提交所创造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