2017-03-13 75 views
1

我可以使用哪些函數將遠程分支中的所有子模塊(本地回購)同步/初始化/更新到版本?git - 檢出分支和子模塊

「同步」(讓我們稱呼它,我的意思不是混帳同步!)也必須工作時:

  • 子模塊已添加只內的遠程分支
  • 文件子模塊已在本地添加/刪除/修改。跟蹤或未跟蹤。
  • 子模塊被刪除(可選)

從本質上講,我想當地的回購永遠是在完全相同的版本作爲遠程分支。每當我改變子模塊中的某些東西時,不需要太多的擺弄。因此,沒有手動ssh到服務器初始化一個新的子模塊,只爲部署腳本工作...

這可以實現而無需克隆(又名。傳輸)整個存儲庫?我選擇了git來安全快速地部署我的源代碼。但我能想到的唯一選擇是完成一個完整的git clone --recursive並在其各自的標籤處檢查子模塊。在這種情況下,rsync可能會更好地同步文件。

+0

每個子模塊也是它自己的存儲庫,所以如果頂級存儲庫R有三個子模塊S0,S1,S2,那麼您有* 4 *存儲庫需要擔心。但是,如果您使用*參考克隆*,存儲庫便宜 - 不像分支便宜,但仍相當便宜。不過,子模塊在patootie中仍然很痛苦。 :-) – torek

回答

2

git submodule update --init --recursive怎麼樣?它會將子模塊更新爲正確的提交,並在需要時對其進行初始化,並對所有子模塊執行此操作,即使它們位於其他子模塊中。如果沒有放棄更改,請先嚐試git submodule foreach --recursive git reset --hard

+0

我在部署分支中籤出了一個子模塊@ v1並推送了它。git submodule update --init --recursive可以工作,但是當我在推送到子模塊repo之後再次運行它時,在tag v1之後,子模塊更新 – NoMad

+0

也可以獲得該更改嗎?您可以詳細說明您希望發生什麼以及實際發生了什麼發生?你在什麼地方和子模塊發生了什麼? – oyvind

+0

嗯,我的評論沒有發佈......我現在已經解決了這個問題,在'git submodule update --init --recursive'之後,子模塊的頭部是''v2',但它應該已經在''v1',這個版本在myrepo中被檢出。請參閱下面的答案 – NoMad

0

首先,在需要的位置和版本上手動添加和檢出所需的子模塊。要更新所有子模塊,但保留已簽出的回購包含它們各自的版本,可以使用

git submodule update --init --recursive --rebase --force 

--rebase會造成的git檢查出確切的承諾,該子模塊簽出在包含回購。

如果本地回購對子模塊文件進行了更改,則會失敗,因此我們必須先重置所有子模塊。對於腳本的使用:被直取自git undo all uncommitted changes

git submodule foreach 'git reset --hard && git checkout . && git clean -fdx' 
git submodule update --init --recursive --rebase --force 

復位命令 - 讓我知道如果別的更適合這個用例。

不需要額外的配置,只需檢查子模塊@期望的提交或標籤並推送包含回購中的更改。

這些命令滿足我的前兩個初始要求:只要git跟蹤子模塊,所有更改將完全同步到運行命令的「客戶端」。如果刪除了子模塊,則可以在包含子模塊的存儲庫上運行git clean以刪除已組裝的子模塊文件。