2011-05-05 91 views
19

我試圖使用git的子樹合併stategy我想要合併的子目錄嵌套相當深 - 目前四個級別深。Git:子樹合併到深嵌套子目錄中?

我按照指示here將模塊存儲庫添加爲遠程,運行git讀取樹以將遠程代碼獲取到本地回購的子目錄中,並提交這些更改。

當我嘗試從遠程將更改合併到主項目的主分支中時,出現問題。上面的第5步表明使用-s子樹開關的git pull。這適用於我當我的子目錄是一個,兩個或三個深層次,但不是四個正確的。

這是將子目錄合併到2個子級的結果。您可以看到sites/all /中的README文件已經正確更新。在我的遠程回購中,自述文件位於根目錄中。

$ git pull -s subtree REMOTE_REPO master 
remote: Counting objects: 5, done. 
remote: Compressing objects: 100% (3/3), done. 
remote: Total 3 (delta 2), reused 0 (delta 0) 
Unpacking objects: 100% (3/3), done. 
From /path/to/my/REMOTE_REPO 
* branch   master  -> FETCH_HEAD 
Merge made by subtree. 
sites/all/README | 2 ++ 
1 files changed, 2 insertions(+), 0 deletions(-) 

這裏的子目錄是3級深:sites/all/modules /。這也可以正常工作,拉動更新並更新文件。

$ git pull -s subtree REMOTE_REPO master 
remote: Counting objects: 5, done. 
remote: Compressing objects: 100% (3/3), done. 
remote: Total 3 (delta 2), reused 0 (delta 0) 
Unpacking objects: 100% (3/3), done. 
From /path/to/my/REMOTE_REPO 
* branch   master  -> FETCH_HEAD 
Merge made by subtree. 
sites/all/modules/README | 2 ++ 
1 files changed, 2 insertions(+), 0 deletions(-) 

但是現在我的代碼位於4級深的子目錄中:sites/all/modules/my_module /。 Git似乎從REMOTE_REPO中提取更改,但它不更新文件,而是告訴我它已經是最新的。

$ git pull -s subtree REMOTE_REPO master 
remote: Counting objects: 5, done. 
remote: Compressing objects: 100% (3/3), done. 
remote: Total 3 (delta 2), reused 0 (delta 0) 
Unpacking objects: 100% (3/3), done. 
From /path/to/my/REMOTE_REPO 
* branch   master  -> FETCH_HEAD 
Already up-to-date! 
Merge made by subtree. 

如果我馬上再運行它,它不會拉動更新或更新文件。

$ git pull -s subtree REMOTE_REPO master 
From /path/to/my/REMOTE_REPO 
* branch   master  -> FETCH_HEAD 
Already up-to-date. 

查看git的日誌在這一點上會告訴我從遠程回購和合並在我結賬的變化,但文件尚未更新。

這是一個錯誤,還是我做錯了什麼?

更新:克里斯·約翰森提供了以下選項,它拋出一個錯誤:

$ git pull -X subtree=sites/all/modules/my_module/ REMOTE_REPO master 
remote: Counting objects: 5, done. 
remote: Compressing objects: 100% (3/3), done. 
remote: Total 3 (delta 2), reused 0 (delta 0) 
Unpacking objects: 100% (3/3), done. 
From /Users/jeff/work/checkouts/compass_suite 
* branch   master  -> FETCH_HEAD 
fatal: entry not found in tree 173d4f16af4d2d61ae5c4b3446c392e8b49cc57d 

回答

10

subtree合併策略人爲地限制了其搜索的深度,其中子樹「配合」到整個樹。不幸的是,這個限制是硬編碼的(見match-trees.c:267)。

幸運的是,Git 1.7.0將subtree=…選項添加到(默認)recursive合併策略。這個選項可以讓你精確地指定前綴,以便Git不必猜測(儘可能多)。

使用Git 1.7.0或更高版本,試試這個:

git pull -X subtree=sites/all/modules/my_module REMOTE_REPO master 
+0

謝謝你的回答,克里斯。我剛剛嘗試了一個錯誤。由於我無法在註釋中發佈代碼,因此我已更新我的問題以顯示命令的輸出。 – Jeff 2011-05-06 17:59:20

+30

我應該多加註意。結果是斜線導致了錯誤。我使用subtree = sites/all/modules/my_module /而不是子樹= sites/all/modules/my_module。沒有尾隨斜線,它的工作原理!再次感謝。 – Jeff 2011-05-06 19:49:41

+0

感謝您的回答。我用它將一個大的git repos分割成多個較小的git repos。 – 2012-09-13 01:00:43

54

明確爲未來的讀者,解決的辦法是在克里斯·約翰森的迴應意見。如果您看到「致命的:樹中未找到的條目」錯誤,請刪除子樹前綴末尾的斜線。

例如,如果你正在試圖拉GitHub的頁面子樹如下命令

git subtree --prefix gh-pages/ pull origin gh-pages 

和有衝突,你會得到像

* branch   gh-pages -> FETCH_HEAD 
fatal: entry not found in tree 6e69aa201cad3e5888f1d12af0d910f8a10a8ec3 

錯誤只是刪除尾隨斜槓從GH-頁面目錄

git subtree --prefix gh-pages pull origin gh-pages 

這會工作,並會嘗試合併。你可以得到最糟糕的情況是,當自動合併失敗,你會得到這樣的錯誤

Automatic merge failed; fix conflicts and then commit the result. 

但你必須手動解決衝突,和你做。

+0

Yikes!這是一條有用的錯誤消息。 – 2012-12-12 10:55:26

+4

+1 lifesaver,同樣的問題出現在git-subtree做一個合併和相同的答案。 – Amoss 2013-10-21 19:00:44

+1

這解決了我的問題。什麼是被接受的談論? – bentford 2014-03-31 22:11:14