没有壁球的git-subtree:查看日志

Bry*_*sen 13 git git-subtree

我使用git子树添加而不使用squash选项将树合并到我的存储库中.git日志显示提交已成功添加到存储库.但是,如果我这样做git log --follow filename,则历史记录在合并时停止,并且不会显示先前的提交.我尝试使用-M而不是,--follow这也不起作用.如何在合并之前获取特定文件或文件的提交日志?

Lop*_*Sae 15

对来自子树的文件创建git subtree mergegit subtree add执行"添加" 的提交,而不是"移动".这意味着无法像其他合并或移动一样跟踪其历史记录.

在合并之前直接查看子树,仍然可以显示所需文件的历史记录.如果您的工作区是git subtree创建的合并提交,那么它的第二个父项(HEAD^2)将是原始子树的最后一次提交.从这里您可以看到原始子树的内容:

# Display the contents of the original subtree
git ls-tree HEAD^2
Run Code Online (Sandbox Code Playgroud)

通过此提交,您可以跟踪您感兴趣的文件的更改.请注意,文件的路径在工作区中的子树中是不同的.您需要删除--prefix给定的to git subtree才能拥有正确的文件路径.

git log HEAD^2 --follow -- path-in-subtree/file
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.由于这个问题,我们最终没有使用子树合并 - 如果我们使用两个单独的存储库,则其他人更容易理解发生了什么.非高级git用户可以将子树合并*几乎*视为单个存储库,但是像这样的小差异可能会让人感到震惊.所以我没有测试你的答案,但绝对值得一个upvote. (4认同)

rfa*_*bri 6

实际上,git log --follow 应该与子树合并一起使用,但是很长一段时间以来它一直是骇人听闻的[1-3]。

可以坚持子树合并,并确保该策略对于跟踪多个历史记录是有效的,并耐心地等待不可避免的情况git log --follow会有所改善。这实际上可能是一个可行的决定,因为目前git log --follow在非常有用的情况下可以看到一些历史记录。假设您将文件从顶级存储库移到了子存储库,那么它可以跟踪整个移动。当您想跟踪特定于子仓库的历史记录时,您确实必须拥有单独的副本或签出子仓库分支。

替代方法和解决方法

您可以获取以下文件的日志[1]:

git log -- '*filename'          # from the toplevel
Run Code Online (Sandbox Code Playgroud)

这将查看与文件名以结尾的文件的所有提交filename。它不会遵循实际的重命名,如果您有多个具有相同基名[1]的文件,则可能会显示误报。

您也可以使用不同的策略合并存储库。参考文献[4]显示了一种执行此操作的方法,该方法与常规子树合并非常相似,但具有可追溯的历史记录。基本上,您:

  1. 将每个子存储库添加,获取和合并为顶级远程存储库,而不是常规的远程git子树或readtree。首先,这将污染您的根目录,就像它是他们的根目录一样,因此,这应在项目生命周期的开始进行。
  2. git mv 子仓库文件到单独的文件夹

然后:

  • 上游的更改可以正常获取和合并,但带有-Xsubtreegit merge 的标志。
  • 其他情况应该相似。我已经测试了向上游推送的方法,它可以工作,请参见[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已在Google Summer of Code 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