为什么'git subtree push'总是列出数百个提交?

时间:2014-11-14 10:50:37

标签: git version-control git-subtree

我正在使用 git子树在项目之间共享源代码的子文件夹。这工作正常,但每次执行git子树推送时,终端都会显示一个不断增长的提交列表:

git subtree push --prefix=public/js/engine engine-remote master --squash git push using: engine-remote master -n 1/ 1193 (0) -n 2/ 1193 (1) -n 3/ 1193 (2) ... -n 1193/ 1193 (1152) Counting objects: 176, done. ...

为什么会这样,我可以配置不同的东西以防止这种情况发生吗? 我知道它需要检查父项目的提交,但我希望它只是从子树的最后一次成功提取的点。

1 个答案:

答案 0 :(得分:10)

回答0

我没有在我的日常工作流程中使用git-subtree,所以我不得不对此进行一些研究,但是你要去了:

git subtree push git subtree split后跟git push。显示此提交列表的命令实际上是git subtree split。如果split在提交消息中找不到标记有适当“git-subtree-dir:”行的提交,那么它将遍历整个项目历史记录并创建新历史记录,修剪为单个目录 - 在您的情况下必须是这样做。

如何避免?

成功git subtree push后,您可以执行git subtree split --rejoin [1]。这将创建空的合并提交,将子树的历史记录与项目的历史记录相结合;未来对git subtree的调用将在分割subdir [2]的历史时使用来自该合并提交的消息。 相同的信息应该在git subtree pull之后放置在合并提交中,但通常不是(有时是)[3];您可以在git subtree split之后git subtree pull进行,但结果图看起来很难看。请参见[3]。

答案1

真的很糟糕吗?这打印出来真好。打印完每一行回车后,我得到了很好的“动画”,从0到n(单行 - 不输出,你粘贴在你的问题中)。也许您的终端无法识别回车(我猜这可能是Windows或OS X上的问题)?你用什么操作系统?

答案2

如果您无法使用-q|--quiet,则可以使用split --rejoin隐藏此内容,此输出确实让您感到困扰。

参考资料和我的评论

[1]但请注意!手册页说:

  

如果您使用'--squash'进行所有合并,请不要在拆分时使用'--rejoin',因为您不希望子项目的历史记录成为您的一部分无论如何都是项目。

因此,如果适合您的特定情况,请使用--rejoin

[2] 可以说这可以更好地实现,但是git-subtree不能将它存储在提交对象本身中,因为它不是git的本机特性(还是?)。它是bash脚本,你可以在contrib /目录中找到它:https://github.com/git/git/blob/master/contrib/subtree/git-subtree.sh 这可能是原因,为什么这个功能的文档很少(嘿,但是手册页很棒)。

[3] 我进行了一些实验,有时看到正确的合并提交出现 - 当git subtree pull导致冲突时,它似乎与情况有关。这可能表明git-subtree.sh中存在错误;给我更多信息,所以我可以进一步调查(并希望修复它)。我查看了该文件的历史记录,没有看到相关的修复程序......

你使用的是什么版本的git? (我的是1.9.3)。 您使用该共享目录的工作流程是什么? 是git subtree add吗? 提交是双向流动,还是仅以单个仓库创建?