我在我的项目中使用git,该项目由几个子项目组成。使用git-subtree命令在主项目中“链接”每个子项目。这是我在git中实现“svn externals”的方式。我几周以来一直在使用它,但是在每次提交期间,将我的更改从子树推送到远程位置的时间都会增加。当我使用命令
推送更改时,它看起来像这样git subtree push -P platform/rtos rtos master
git push using: rtos master
1/ 215 (0)2/ 215 (1)3/ 215 (2)4/ 215 (3)5/ 215 (4)6/ 215 (5)7/ 215 (6)8/ 215 (7)9/ 215 (8)10/ 215 (9)11/ 215 (9)12/ 215 (10)13/ 215 (11)14/
....
20 more lines
....
(204)209/ 215 (205)210/ 215 (206)211/ 215 (207)212/ 215 (208)213/ 215 (209)214/ 215 (210)215/ 215 (211)To https://github.com/rtos/rtos.git
64546f..9454ce 9a9d34c5656655656565676768887899898767667348590 -> master
有没有办法“清理”子树,从而减少推动更改的时间?
答案 0 :(得分:13)
尝试使用--rejoin
标志,以便在拆分后将子树正确合并回主存储库。这样,每次拆分都不需要查看所有历史记录。
git subtree split --rejoin --prefix=<prefix> <commit...>
来自original subtree documentation:
拆分后,合并新创建的合成 历史回到你的主要项目。那样,未来 拆分只能搜索具有的历史部分 自最近的一次添加--rejoin。
答案 1 :(得分:4)
不,不幸的是没有。运行git subtree push
时,它将重新创建此子树的所有提交。它必须这样做,因为它们的SHA依赖于先前的提交,并且需要这些SHA能够将新提交链接到旧提交。它可以缓存,但它没有。
我猜这是你使用子树与子模块支付的价格。子树在您的存储库中是非常无状态的,这在手上很好但另一方面导致这个长计算。子模块存储了他们所有的信息,这需要你管理它,但也可以更快地制作这样的东西。
答案 2 :(得分:1)
@LopSae的答案有效,但是如果您使用壁球进行合并/拉动,它将使您的存储库充满大量提交
这是避免这种情况的方法
git subtree split --rejoin --prefix=<subtree/path> --ignore-joins
执行此操作时,您要向后推从中拉出的分支。否则,您将无法创建拉取请求。
至少有2个选项可以解决这个问题。
重新设置
在远程项目上创建一个新分支,并将其拉出并推回到该分支。
答案 3 :(得分:0)
请注意,如果您决定切换到git submodule
,现在可以since git1.8.2(2013-03-08)跟踪子模块库的最新提交。< / p>
请参阅git externals。
“git submodule”开始学习一种新模式与远程分支的尖端集成(而不是与超级项目的gitlink中记录的提交集成)。
这可以更快地推送,同时受益于子模块对子树的附加信息(即子模块的特定提交的轻量级记录)
您可以使用以下命令将该子模块更新为给定分支的最新内容:
git submodule update --remote
此选项仅对
update
命令有效 不使用超级项目记录的SHA-1来更新子模块,而是使用子模块远程跟踪分支的状态。
答案 4 :(得分:0)
也许这会有所帮助:我认为你可以告诉git subtree split
只能通过
git subtree split --prefix XXX HEAD~n..
或指定您要开始的提交,例如
git subtree split --prefix XXX 0a8f4f0^..
这有助于缩短时间,但不方便。