我正在使用 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.
...
为什么会这样,我可以配置不同的东西以防止这种情况发生吗? 我知道它需要检查父项目的提交,但我希望它只是从子树的最后一次成功提取的点。
答案 0 :(得分:10)
我没有在我的日常工作流程中使用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]。
真的很糟糕吗?这打印出来真好。打印完每一行回车后,我得到了很好的“动画”,从0到n(单行 - 不输出,你粘贴在你的问题中)。也许您的终端无法识别回车(我猜这可能是Windows或OS X上的问题)?你用什么操作系统?
如果您无法使用-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
吗?
提交是双向流动,还是仅以单个仓库创建?