2013-02-27 42 views
14

我有一個與多個子​​模塊的git回購。其中一個子模塊有其自己的多個子模塊。我所要做的就是檢查主repo上的舊提交,並讓它檢出所有子模塊的相應提交,以便當時獲得正確的代碼狀態。如何檢出包括所有子模塊的舊git提交遞歸?

我知道git包含必要的信息,因爲ls-tree命令可以告訴我每個子模塊在哪個提交上。但是,我必須手動檢查每一個,這是非常耗時的。

我正在尋找像git checkout --recursive這樣的東西,但似乎並不存在這樣的命令。

有沒有辦法做到這一點?

+0

注意:'git checkout --recurse-submodules'現在確實存在(2017)。但只有即將推出的Git 2.14才能正常工作。請參閱[我的答案](https://stackoverflow.com/a/44249558/6309)。 – VonC 2017-05-29 19:52:14

回答

17

你需要兩個命令來實現這一目標:

git checkout *oldcommit* 
git submodule update --recursive 
+1

非常感謝!當然,結果很簡單。 – 2013-02-27 23:34:15

4

取決於是否有更多的子模塊在舊結賬時,你可能需要做以下初始化不存在任何更多的子模塊新提交:

git checkout *oldcommit* 
git submodule init 
git submodule update --recursive 
6

注意:如果你有多個子模塊(和子模塊內的子模塊),Git的2.14(Q3 2017)將有助於(更近,從2013年OP)

git checkout --recurse-submodules 

使用--recurse-submodules將根據記錄在超級項目中的提交更新所有已初始化的子模塊的內容。
如果子模塊中的本地修改將被覆蓋,則使用-f時,結帳將失敗。

git checkout --recurse-submodules」沒有相當的工作與 子模塊本身有子模塊。它將與Git 2.14。

+0

我不明白爲什麼'-f'總是有必要的。沒有'-f'它不會更新子模塊。 – linquize 2017-08-06 05:31:40

+0

@linquize只有在子模塊中有任何本地修改時,'-f'纔有必要。 – VonC 2017-08-06 05:38:02