2013-05-06 107 views
3

請注意,我是Git的新手。Git:從現有的存儲庫中創建Git子模塊並將父級更改反映到子存儲庫

我有兩個回購協議:

  1. Libgdx REPO
  2. gdx-sqlite REPO

主要倉庫是Libgdx回購和我的所有作品進入這個倉庫,主要在gdx-sqlite project。因爲我想GDX-sqlite的項目顯示爲一個獨立的存儲設備,我所做的就是:

  1. 創建GitHub上(GDX-sqlite的REPO)的新回購
  2. 創建一個本地回購(嵌套在本地libgdx內回購)我的機器
  3. 上推動了當地的嵌套式回購的所有代碼遠程GDX-sqlite的REPO

這導致了一切去錯了,我認爲嵌套庫是主要的罪魁禍首。後來我刪除了本地嵌套的存儲庫,並恢復到之前的提交。我發現這種問題的解決方案是Git Submodules,但是我完全喪失了我想要實現的內容,如下所示。

現在我怎麼在下面的光來實現這一點:

  1. 我想創建位於「GDX-sqlite的回購」一個新的回購,應始終反映更改我做出位於https://github.com/mrafayaleem/libgdx/tree/master/extensions/gdx-sqlite
  2. 任何項目誰發送拉請求「GDX-sqlite的回購」應該能夠把所有的依賴關係(也就是完整的libgdx REPO),這樣他就可以在有效的立即延長。

這怎麼能成爲possbile?

回答

6

你說得對。這種情況的好方法是使用Git submodules。這是處理Git中依賴關係的最好方法。

由於gdx-sqlite是你的主要項目Libgdx的擴展,你可以做這種方式將其添加爲一個子模塊:

git clone [email protected]:mrafayaleem/libgdx.git libgdx 
cd libgdx 
# remove the old directory 
rm -rf extensions/gdx-sqlite 
git add extensions/gdx-sqlite 
# add the submodule (note the read-only URL) 
git submodule add git://github.com:mrafayaleem/gdx-sqlite.git extensions/gdx-sqlite 
# commit the changes 
git commit -m 'Add submodule for the gdx-sqlite extension' 

然後克隆項目(及其所有子模塊):

git clone --recursive git://github.com/mrafayaleem/libgdx.git 

或爲您(寫訪問):

git clone --recursive [email protected]:mrafayaleem/libgdx.git 
+0

子模塊是不是他想要的所有條款的內容。他希望子模塊的變化也反映在超級模塊中。只有這樣,如果他同時在兩個回購中進行更改。一個用於更改子模塊,另一個用於更新「超級」項目中的修訂標記。它不像svn中的外部工作。還有其他的解決方案,像[git subtree](https://github.com/apenwarr/git-subtree),但是這些還有其他的缺點。 – Larusso 2013-05-16 20:25:43

+0

這裏引用:[git submodules doku](http://git-scm.com/book/en/Git-Tools-Submodules)「這是子模塊的一個重要點:你將它們記錄爲確切的提交,你不能在master或其他符號引用處記錄子模塊。「 – Larusso 2013-05-16 20:29:46

2

你應該看看git subtree。 這使您可以將一個或多個git存儲庫添加爲子樹。

其中一個缺點是,您需要對您的提交進行嚴格的處理。如果您對不同子樹中的文件進行了多處更改,那麼所有存儲庫都會在其歷史記錄中進行此提交。如果您試圖在一個回購庫中找到更改並且無法找到日誌中提到的文件,這可能非常令人討厭,因爲該文件從未屬於此回購。一個解決方案是將提交拆分到不同的存儲庫。

相關問題