2013-04-21 50 views
12

我在我的項目中使用,該項目由幾個子項目組成。每個子項目都使用命令在主項目中「鏈接」。這是我在中實現「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 

有什麼辦法來「清理」的子樹,從而減少推動變化時推壓的變化?

+3

子模塊不適合每個人,問題是關於子樹。 – 2015-03-09 18:34:07

回答

1

注意,如果你決定切換到git submodule,你現在可以,since git1.8.2(2013年3月8日)跟蹤子模塊回購的最新提交。

請參閱git externals

「混帳子模塊」開始學習一種新的模式與遠程分支的頂端集成(而不是與此提交記錄在上層項目的gitlink整合)。

這可能是使更快推動,而從附加信息中受益的子模塊擁有的子樹(即特定的一個輕量級的記錄提交的子模塊)

您可以更新子模塊的最新給定的分支,通過:

git submodule update --remote 

此選項僅適用於update命令。
而不是使用超級項目的記錄的SHA-1更新子模塊,請使用子模塊的遠程跟蹤分支的狀態。

+3

不錯的選擇,但這個問題是關於子樹。一個答案。 – 2015-03-09 18:34:57

5

不,不幸的不是。當您運行git subtree push時,它將重新創建該子樹的所有提交。它必須這樣做,因爲它們的SHA依賴於以前的提交,並且需要這些SHA能夠將新提交與舊提交相關聯。它可以緩存,但它不會。

我想這是你使用子樹與子模塊支付的價格。 Subtree在你的倉庫中是非常無狀態的,這很好,但另一方面卻導致了這麼長的計算。子模塊存儲他們所有的信息,這需要你管理它,但也使這樣的東西快很多。

+3

令人驚訝的是,'git subtree'不能(不?)只是緩存這些信息,所以在第一次'git子樹推入'之後,所有事情都變得相當活潑。 – davidg 2014-07-03 06:40:54

+0

@davidg它當然可以。 – Chronial 2014-07-03 10:21:24

+1

特別是在Windows上,這太慢了。在我的情況下,當你達到600的斷言數時,每次推動git都會花費一分鐘的時間,使得git在那個時候無用。 – 2015-03-10 15:11:40

11

嘗試使用--rejoin標誌,以便在拆分後將子樹正確地合併回您的主存儲庫。這樣每個分裂都不需要經歷所有的歷史。

git subtree split --rejoin --prefix=<prefix> <commit...> 

original subtree documentation

分開後,合併新制作的合成 歷史回到你的主要項目。這樣,未來 拆分可以搜索自最近一次以來已添加 的歷史部分 - 重新加入。

+2

並用哪個?我試着用該子樹的一端,雖然它做了分裂/重新加入(甚至不知道這意味着什麼),但我的下一個子樹的推動也一樣長:( – 2015-03-09 19:59:42

0

也許這可以幫助:我想你可以告訴git subtree split只回去N乘做

git subtree split --prefix XXX HEAD~n.. 

或通過指定提交你要開始與例如

git subtree split --prefix XXX 0a8f4f0^.. 

承諾這有助於縮短時間,但這不方便。