簡體   English   中英

如何遞歸檢出包括所有子模塊的舊git commit?

[英]How to checkout old git commit including all submodules recursively?

我有一個帶有多個子模塊的git repo。 這些子模塊之一具有自己的多個子模塊。 我要做的就是在主存儲庫上簽出舊的提交,並從所有子模塊中簽出適當的提交,以在那時獲得正確的代碼狀態。

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

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

反正有這樣做嗎?

您需要兩個命令來實現此目的:

git checkout *oldcommit*
git submodule update --recursive

更新:截至2018年,此答案已過時-有關更多最新信息,請參見下面的VonC答案

注意:如果您有多個子模塊(以及子模塊中的子模塊),則Git 2.14(2017年第3季度)將有所幫助(較2013年的OP更新)

git checkout --recurse-submodules

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

git checkout --recurse-submodules ”與本身具有子模塊的子模塊不太兼容。 它將與Git 2.14一起使用。


注意:在Git 2.19(Q3 2018)中, git checkout --recurse-submodules another-branch更加健壯。
以前,它沒有報告未能在哪個子模塊中更新工作樹,這導致了無用的錯誤消息。

參見Stefan Beller( stefanbeller )的 commit ba95d4e (2018年6月20日
(由Junio C gitster - gitstercommit 392b3dd中合並 ,2018年7月24日)

submodule.c :報告子模塊發生錯誤

當更新submodule_move_head中的submodule_move_head的工作樹時發生錯誤時,請告訴用戶該錯誤發生在哪個子模塊上

read-tree的調用包含一個超級前綴,因此read-tree將正確報告任何與路徑相關的問題,但是某些錯誤消息不包含路徑,例如:

 ~/gerrit$ git checkout --recurse-submodules origin/master ~/gerrit$ fatal: failed to unpack tree object 07672f31880ba80300b38492df9d0acfcd6ee00a 

提示哪個子模塊有問題。

根據舊簽出中是否還有更多子模塊,您可能必須執行以下操作來初始化新提交中不再存在的子模塊:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM