2009-08-20 47 views
17

我們以前在我們的主要存儲庫中使用了許多子模塊,但爲了增加項目的可維護性,我們開始了一個實驗分支,我們用子樹替換它們。將更新合併到我的子樹中時Git混淆

這很好 - 但現在當我試圖更新其中一個子樹時,它錯誤地將更新合併到完全錯誤的目錄中,甚至不是子樹。

主要倉庫,那裏的分支「子樹」包含了實驗分支,是:的git://github.com/hugowetterberg/goodold_drupal.git

存儲庫中更新文件的合併:混帳://github.com/voxpelli/drupal-oembed.git

合併這樣做:混帳合併-s子樹透過oEmbed /主

路徑的更新應該被合併到:網站/所有/模塊/透過oEmbed/

它們合併到該路徑:模塊/匯聚/譯/

任何人都具有如何獲得更新到子樹的想法或者是什麼錯誤可?

回答

18

不幸的是,這是「git merge -s subtree」代碼中的一個bug(或缺少的功能)。它實際上猜想你想合併的子樹。通常,這奇蹟般地證明是正確的,但是如果你的子樹包含很多變化(或者最初是空的,或者其他),那麼它可能會失敗壯觀。

解決它的最好辦法是:

  1. 合併文件如同上面一樣。

  2. 手動將所有生成的文件移動到應該已經去除的位置。

  3. git commit -a --amend糾正合並提交。

未來的合併可能會正常工作,除非這個目錄經常有難以置信的流量。

實驗性的「git subtree」命令有一個--prefix參數,應該讓你覆蓋這個參數,但不幸的是它目前不工作(因爲它需要解決「git merge -s subtree」功能,而且還沒有是時候做到了)。

無論如何,這應該是一種罕見的情況,即使將來合併同一個項目也不需要解決方法。

+7

我剛剛提交git的補丁,可以讓你覆蓋子樹明確使用'-Xsubtree ='選項,並被接受。在git 1.7.0左右找它。 – apenwarr 2009-12-03 22:53:51

+2

當您從源回購庫中引入單個文件夾(例如,'git read-tree --prefix = dest/-u source_repo/master:folder_in_repo /')而不是整個東西時,將即使很小的更改合併到回購看起來似乎導致整個文件夾被放入回購站的新位置(即重複)。 – 2012-01-09 10:45:22

+0

非常罕見的情況下,事實上:-( – 2012-04-11 11:05:45