2016-06-13 86 views
1

我正在處理一個大型的現有倉庫,它有許多子模塊。我注意到,當我做git如何選擇提交在其子模塊中籤出?

git submodule update --checkout 

一些模塊檢出特定提交(不分支的負責人)

git submodule update --checkout --force 
Submodule path 'build/cmake': checked out '8ed3354a70974ec775eee94cdce57810deeda65f' 

我的問題是:爲什麼會選擇那些承諾?

我的.gitmodules沒有指定提交或分支,也沒有.git/config。

+0

更多信息:事實證明,提交確實指向特定的分支,但沒有一個我已經在任何配置文件中跟蹤過 – Ben

+0

*每個*子模塊都通過ID指定了一個特定的提交。這是Git子模塊的本質。該ID被記錄在實際提交中。如果超級項目在分支'master'上並且'master'目前提交'a1234567',則Git檢查'a1234567:build/cmake',它是一個類型爲「gitlink」並且名稱爲'8ed335 ...'的樹條目,這就是在子模塊中檢出的提交(作爲分離的HEAD)。 – torek

回答

1

當前存儲庫中子模塊的引用既適用於子模塊,也適用於特定的提交。該提交SHA存儲在索引中。

如果您要更改HEAD所在的子模塊的提交內容,您會在父存儲庫中看到未完成的更改。如果你不同意這個改變,你會發現子模塊引用的提交是不同的,而不是子模塊中的任何差異。

例如 cd submodule git reset --hard HEAD~4 cd .. git status

將產生 -Subproject commit <old submodule HEAD SHA> +Subproject commit <SHA of 4 commits before old HEAD>

其實,這就是爲什麼子模是一種痛苦使用的。你不能指定它應該遵循分支,或者是一個特定的標籤。如果您在子模塊中進行了更改並將其推送到那裏,那麼提交併推入父存儲庫以更新所引用的SHA。如果您忘記推送子模塊,但推送父模塊,則其他人將嘗試更新子模塊時會出錯。如果您忘記提交更改以更新子模塊提交到父級,則其他人不會將更改提交到其子模塊。