为什么Git子树总是处理每个提交?

15

我正在使用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.
...

为什么会这样,我能否配置一些内容来防止这种情况发生? 我知道它需要检查父项目上的提交记录,但我希望它只检查子树最后一次成功拉取的地方。


你尝试过传递“-q”给它吗? - Andrew C
1个回答

15

答案 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 时,将使用该合并提交的消息来拆分子目录的历史记录 [2]。 在 git subtree pull 之后,同样的信息应该被放置在合并提交中,但通常没有(有时是)[3]; 你可以在 git subtree pull 后执行 git subtree split,但是结果图形看起来很丑。请参阅 [3]。

答案 1

真的很糟糕吗?将其打印出来很好。每个换行符后都会打印回车符,所以我可以获得漂亮的“动画”,从0到n(在单行中 - 不是你在问题中粘贴的输出)。也许您的终端不识别回车符(我想这可能是 Windows 或 OS X 上的问题)?你用的是什么操作系统?

答案 2

如果你不能使用 split --rejoin 并且这个输出真的困扰你,那么你可以使用 -q|--quiet 将其隐藏。

参考和我的评论

[1] 但要注意!手册上说:

如果您使用“--squash”执行所有合并操作,请不要在拆分时使用“--rejoin”,因为您不希望子项目的历史记录成为您的项目的一部分。 根据情况适当使用“--rejoin”。 可能有更好的方法实现此功能,但是git-subtree不能将其存储在提交对象本身中,因为这不是git的原生特性(尚未?)。它是bash脚本,可以在contrib/目录中找到:https://github.com/git/git/blob/master/contrib/subtree/git-subtree.sh 这可能是文档稀缺的原因(但手册非常棒)。 我进行了一些实验,有时会出现正确的合并提交 - 这似乎与“git subtree pull”导致冲突的情况有关。这可能表示git-subtree.sh中存在错误;给我更多信息,以便我可以进一步调查(并希望解决它)。我查看了该文件的历史记录,并没有看到相关的修复... 您使用的git版本是什么?(我的是1.9.3)。 您在共享目录中使用的工作流程是什么? 是否已经进行了“git subtree add”? 提交是否双向流动,还是仅在单个存储库中创建?

首先非常感谢您的详细回答,Patryk。一开始我每天都在检查,但直到最近才注意到您的回答。 - Micros
1
关于您的陈述,我有一个问题:如果分割在提交消息中没有找到标记为适当的“git-subtree-dir:”行的提交,您是什么意思?我该如何标记我的提交?针对您的评论: 1)我正在使用带有ohmyzsh的OSX。 2)您在[3]中描述的情况听起来很像我一直遇到的情况。部分原因可能是因为有两个人提交和推送到主项目。 3)我也在使用1.9.3版本。 4)关于我的工作流程,请参见下一条评论。 - Micros
我怎样可以标记我的提交信息呢?例如:将文件 foo/foo 添加到您的 repo 中,然后运行命令 git subtree split --rejoin --prefix=foo -b foo_b 并查看合并提交中的信息。您可以自己创建这样的提交信息,但不应该这样做。subtree 命令在 subtree pull期间应该会为您创建它,但有时可能不会。 - Patryk Obara
太好了,我会试一下。关于我们的工作流程:我们有多个项目共享 public/js/engine 文件夹,但拥有自己的 public/js/app 文件夹和其上层所有内容。两个人在项目上工作并将项目推送/拉取到各自的远程仓库。当改进功能时,有时会有包含对项目和引擎文件更改的提交。我们在 .git/config 文件中关闭了变基。只有当我们完成一个完整的功能时,才将引擎文件夹中的更改推回引擎的远程子树。这种工作流程可能是问题的一部分吗? - Micros
7
"这真的很糟糕吗?"哦,是的!当你处理一个几年前的代码库时,情况确实很糟糕。我刚刚在一个有8525个先前提交的代码库上工作,需要花费22分钟才能完成! - selfthinker
1
“它真的很糟糕”是指打印输出——你是宁愿没有任何输出并在黑暗中坐上22分钟吗?话虽如此——22分钟太长了,测量为什么git需要这么长时间是有益的。你的repo是否公开,我可以调查一下吗? - Patryk Obara

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接