[英]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
- gitster
在commit 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.