2012-11-25 186 views
4

我有一個標準庫爲我的項目多個Git倉庫

/home/repo/.git 

這是我克隆得到新的網站 基本代碼庫即我克隆這

/var/www/site1 

我也有幾個模塊,我創建了作爲存儲庫,一些網站將使用這些模塊,有些不會。

/home/modules/mod1/.git 
/home/modules/mod2/.git 

有沒有一種方法可以將這些模塊克隆到同一個站點文件夾中?

/var/www/site1 

模塊的目錄都設置了相同的文件夾結構作爲主回購,當我克隆它們在主回購克隆他們應該合併/替換現有文件的頂部。 (很少的任何文件重疊)

我的最佳解決方案將被命名回購在某種程度上,這樣當我部署一個新的網站,我做這樣的事情:

cd /var/www/newsite 
git clone /home/repo/.git 
git clone /home/modules/mod1/.git 
git clone /home/moudles/mod2/.git 

,當我有更新,以對現場我可以做這樣一個拉:

git pull origin master 
git pull mod1 
git pull mod2 

或較好的是:

git pull origin master 

也ç所有在mod1mod2的拉動。

我一直在看git子模塊和分支,但無法弄清楚,如果他們是我所需要的。

+0

請用4個空格標識代碼/命令並進行一些拼寫檢查。順便說一句,用英語,'我'總是大寫。 – tiago

回答

4

這裏有您想要的部署命令的建議略有變化:

cd /var/www/ 
git clone /home/repo/.git newsite 
git remote add mod1 /home/modules/mod1/.git 
git remote add mod2 /home/moudles/mod2/.git 

cd newsite 
git merge mod1/master 
git merge mod2/master 

說明:

正如你所說,你的主要模塊(/家/回購)和您mod1mod2等有同一文件夾結構。因此子模塊不適合使用,因爲子模塊必須位於主回購庫的子目錄中。在這個版本中,你的本地git倉庫(由clone創建)知道三個遠程倉庫。在merge操作之後,其狀態將不會與它們中的任何一個相同。 mod1的merge將引入由mod1「擁有」的任何新文件。如果home/repo中的任何文件與mod1等中的文件具有相同的名稱,您可能會遇到合併衝突。您可以提供一個標誌,以mergemod1始終選擇版本,我相信您說的是您想要的行爲。

+0

在添加遙控器之前,您必須先進入存儲庫。另外,你必須首先獲取,然後才能合併;) - 但我認爲這對於OP來說不會有效,因爲問題提到「很少有任何文件重疊」(它告訴我,有重疊)。 – knittl

+0

我認爲這對項目會很好。當你說我可以「提供一個標誌來合併從mod1始終選擇版本」,那麼除了重疊文件外,是否會包含mod2中的所有文件?或者完全消除合併中的mod2? – Jamie

1

總之,你不能有一個git倉庫作爲另一個倉庫的sudirectory。

這個規則有一個例外:你可以有一個git倉庫作爲另一個倉庫的submodule,但是這有很多限制和不便。

一般的做法是有一個主git回購,它沒有自己的實際修改,但只跟蹤少數git回購作爲其子模塊。

或者,我會建議使用由Android項目開發的repo工具來完成此目的。它涉及創建一個只包含一個XML文件(稱爲manifest)的小型git存儲庫,該文件可以跟蹤您的子項目檢出的位置以及它們如何粘在一起。這在Linux和Mac上運行得非常好,但不幸的是不支持Windows(repo需要OS支持符號鏈接)。

從某種意義上說,git子模塊和android回購解決基本相同的任務,但使用略有不同的手段。

+0

「這條規則有一個例外」 - ** 2 **。和git樹是一個很好的替代子模塊 –

+0

git子樹,對不起 - http://github.com/apenwarr/git-subtree –

+0

和git-subtree一樣好,它仍然不能取代外部git回購你需要和完全不在你的控制範圍之內(不需要改變提交ID和來回合併的必要性)。另外,即使在最新的git中,它也沒有默認啓用 – mvp

1

vcsh工具允許在同一個目錄中維護多個倉庫。