2009-12-14 169 views
57

當使用git checkout切換分支時,我會假定大部分時間您想要更新子模塊。爲什麼git子模塊在git checkout上不會自動更新?

  • 在什麼情況下你不希望切換後更新子模塊?
  • 如果這是通過git checkout自動完成的,會破壞什麼?

已更新,例如:

  • 分公司A在3852f1
  • 科乙子模塊S具有子模塊S中fd72d7

在分支A,GIT中結帳乙將導致分支B的工作副本與子模塊S在3852f1(帶有修改的S)。 git子模塊更新將在fd72d7結帳。

+2

相關:http://stackoverflow.com/questions/4611512/is-there-a-way-to-make-git-pull-automatically-update-submodules – philfreo 2011-01-06 03:41:18

+1

我同意你的意見。我正在與子模塊項目工作,並在每次拉後我應該執行git子模塊更新,但它在大多數時間是沒有必要的。只有這樣做的理由 - 當子模塊之一實際更新時不要錯過。 – 2011-02-04 08:39:25

回答

19

我相信子模塊不會自動更新符合Git的開發目標。 Git旨在以分佈式模式工作,並且不會假定您甚至無法連接到非本地存儲庫,除非您明確告訴它。當想到這種方式時,Git不會自動刷新子模塊。如果你知道你總是希望這些子模塊被引入,並且你知道你永遠不會將這些子模塊分支到另一個本地存儲庫,那麼它不應該破壞任何東西,如果你結帳後自動刷新它們。

+37

我認爲git checkout應該只是抱怨,如果子模塊的提交不可用,而不是默認情況下將工作目錄置於不一致的狀態。然後你可以做git子模塊更新來獲取引用的提交。同樣,通常提交將可用,並且結賬可以在沒有任何網絡訪問的情況下完成。接受你的答案,因爲它聽起來是合理的(但我不喜歡它) – serbaut 2009-12-14 15:25:34

+1

我第二個概念,git應該嘗試做一個子模塊初始化和更新初始結帳和抱怨,並顯示狀態如果存在一個子模塊hasn'第一次被拉到當地。有了它之後,需要明確更新的概念纔有意義,因爲回購是不同的,並且子模塊會引用特定的提交。但即使在分佈式的世界裏,它可能已經不可用了,你很可能會在某個時候想要它,並且git應該讓你知道它從來沒有被拉過。 – cclark 2012-02-01 01:08:35

+4

'git fetch'可以選擇自動*提取*子模塊,所以我認爲結賬應該有一個類似的選項來自動更新/簽出子模塊。 – 2014-06-23 13:48:01