-->

git的子树不壁球:查看日志(git-subtree without squash: view lo

2019-06-25 06:32发布

我用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]可见的方式来做到这一点,这是非常接近你所拥有的定期子树合并,但追溯历史。 基本上,你:

  1. 添加,获取每个子库的顶层库合并为一个普通遥控器,没有git的子树或readtree。 起初,这将polute你的根目录,就好像是他们的,所以这是在一个项目的生命的开始做。
  2. 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 mergegit subtree add并“添加”从树传来的文件,而不是一个“移动”。 这意味着,他们的历史不能被跟踪与其他合并或者变动。

你想要的文件,历史记录仍然可以通过直接在合并之前的子树找显示。 如果您的工作区是合并提交的是git subtree ,然后创建它的第二父( HEAD^2 )将是最后一次提交的原始子树。 从这里你可以看到原来的子树的内容:

# Display the contents of the original subtree
git ls-tree HEAD^2

从这个承诺,你可以跟踪你感兴趣的文件的变化。 小心,你的文件的路径将会在工作区的子树内的不同这一点。 你将需要删除--prefixgit subtree ,以便为您的文件的正确路径。

git log HEAD^2 --follow -- path-in-subtree/file


文章来源: git-subtree without squash: view log