2011-11-07 65 views
0

在我們的臨時服務器,我們有被推向裸回購。這有一個接收後,掛鉤,然後做我們所有的部署的東西,這是所有被檢出到一個單獨的工作樹(其中沒有一個Git文件夾)。推的Git子模塊到一個單獨的工作樹

所以設置是這樣的:

裸露的回購協議是在

/var/www/apps/e_learning_staging/elearning_resource.git 

工作樹是

/var/www/apps/e_learning_staging/www 

這種設置目前工作正常。不過,我添加了四個子模塊的項目(實際上只使用兩個單獨的回購協議 - 每個被複制在兩個地方在項目中)。子模塊回購都在不同的服務器上。

這些裸回購的配置文件中列出的所有,它看起來像這樣:

[core] 
    repositoryformatversion = 0 
    filemode = true 
    bare = true 
    logallrefupdates=true 
    worktree = /var/www/apps/e_learning_staging/www 
    gitdir = /var/www/apps/e_learning_staging/elearning_resource.git 
    [submodule "public/assets/players/virgin_lesson_viewer"] 
    url = [email protected]:/home/charangadh/source_code/git/virgin_lesson_viewer.git 
    [submodule "public/assets/players/virgin_lesson_viewer_staging"] 
    url = [email protected]:/home/charangadh/source_code/git/virgin_lesson_viewer_staging.git 
    [submodule "public/assets/dvd_files/Virgin_lesson_viewer"] 
    url = [email protected]:/home/charangadh/source_code/git/virgin_lesson_viewer.git 
    [submodule "public/assets/dvd_files/Virgin_lesson_viewer_staging"] 
    url = [email protected]:/home/charangadh/source_code/git/virgin_lesson_viewer_staging.git 

如果git的文件夾是工作樹內這將是很容易 - 我只想做

git submodule add [email protected]:/home/charangadh/source_code/git/virgin_lesson_viewer.git public/assets/dvd_files/Virgin_lesson_viewer 

每個子模塊,然後做「混帳子模塊更新」更新它們。但是,我無法弄清楚如何從單獨的git文件夾中完成它。任何人都可以設置我嗎?

回答

0

如果我理解你的問題很好,你基本上要做到在deploy目錄git submodule update,但你不能,因爲它不是一個真正的工作目錄。

我的解決辦法是實現一個自定義git submodule update般的命令:

  1. 確定哪個子模塊版本由supermodule
  2. 結帳這個版本到目標目錄引用。您可以像檢出超級模塊一樣執行此操作。

比方說,你有你的服務器上的以下設置:

  • 裸露的庫存儲在/opt/repos/supermodule.git/opt/repos/submodule.git
  • 當你推supermodule,要在supermodule簽入/var/www/supermodule,和子模塊到/var/www/supermodule/assets/submodule

您必須在的接收後掛機中執行以下操作:

# Checkout supermodule 
export GIT_WORK_TREE=/var/www/supermodule git checkout -f 

# Determine submodule version 
submodule_version=$(git ls-tree HEAD assets/submodule | awk '{print $3}') 

# Checkout submodule 
export GIT_DIR=/opt/repos/submodule.git 
export GIT_WORK_TREE=/var/www/supermodule/assets/submodule 
git checkout -f $submodule_version 

可能有更簡單的解決方案(例如,破解git submodule update命令周圍的一些環境變量),但我經常使用git ls-tree反正來確定所引用的子模塊的版本。

如果按子模塊到不同的服務器,你仍然可以使用此解決方案,用少許修改:

  • 克隆的子模塊/opt/repos/submodule.git目標服務器
  • 之前添加一個git fetch命令git checkout

所以結果如下:

# Checkout submodule 
export GIT_DIR=/opt/repos/submodule.git 
export GIT_WORK_TREE=/var/www/supermodule/assets/submodule 
git fetch 
git checkout -f $submodule_version