减少增加推送子树的时间

时间:2013-04-21 18:54:26

标签: git github git-subtree

我在我的项目中使用,该项目由几个子项目组成。使用命令在主项目中“链接”每个子项目。这是我在中实现“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

有没有办法“清理”子树,从而减少推动更改的时间?

5 个答案:

答案 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个选项可以解决这个问题。

  1. 重新设置

  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^..

这有助于缩短时间,但不方便。