我回答我的問題,研究一點點後,可能會有所幫助給其他人:
理解git子模塊是一件很痛苦的事情,但一旦你明白了,一切都開始有意義了!
以下後顯示:
- 添加子模塊,讓別人用你的子模塊同步。
- 更新子模塊並讓其他人與您的子模塊同步。
- 刪除子模塊並讓其他子模塊同步。
- 更新已移除的子模塊。
添加子模塊
git的子模塊添加-b
在.gitmodules(名稱,路徑,網址,分支)下載由
git submodule update --init
這各子模塊的入口有三個重要的事情,其中前兩個對用戶隱藏:
更新的.git /配置一個額外的條目(子模塊)
下載下的.git /模塊裸形式的儲存庫。這意味着,.git中有.git。
將.git/modules中的git子模塊檢出到父目錄中。現在
,第2天,在commiter,誰COMMITED子模塊實現,他應該改變子模塊其他一些承諾,而不是HEAD。所以,他會去他的本地倉庫,然後去子模塊路徑,然後簽了承諾,他希望通過簡單地調用
git checkout <hash>
cd <parent dir>
git submodule status
在這一點上,git的子模塊的狀態仍然沒有顯示新的哈希值。新的散列只有在更改進行時纔可見。現在,提交者只需要執行(添加),提交和推送更改,以便所有其他開發人員都可以看到它。
更新添加子模塊
在第3天,其他開發人員,將僅通過調用命令
git pull # this is to get the latest commit of the parent git repository.
git submodule update --force # update the submodule with latest hash
基本上更新自己的倉庫,這裏的要點很簡單:子模塊不直到並且除非被告知這麼做。只要做git拉,不會更新git子模塊。開發人員可以繼續在本地子模塊上工作,而不會將其同步到「永久」服務器上。子模塊更新會在顯式調用git子模塊更新命令時發生。
刪除子模塊
現在,在第四天的提交者,決定徹底刪除git的子模塊。這裏的步驟也不簡單,因爲沒有任何東西叫做git submodule rm,它應該已經相當於git submodule add。這隻能做且僅當下面的順序如下:
git submodule deinit submodulename
這將刪除的.git/config條目。
這將清除子模塊目錄!在此命令之後,您將在submdoule目錄中看到任何內容。
但是,子模塊的內容仍在git的可用/模塊
因此混帳狀態-u這裏仍然會顯示Everyting是高達日期!
所以顯示清除,
git rm submodulepath
此時git的狀態將返回.gitmodules已經改變(子模塊已被刪除)和子模塊路徑已被刪除。提交併推送更改。
去掉子模塊
在第五天更新,開發商要刪除的子模塊「自動」喜歡用git子模塊的更新一樣。所以他們先做一個混帳拉,這成功地刪除所有指標到GIT子模塊
git submodule status # shows nothing
,但.git的/ config中仍然包含有效的子模塊條目和子模塊文件夾有與它的所有內容和純倉庫在.git/submodules下!沒有命令可以刪除它們。所有這些都必須通過手工明確刪除。(請糾正我,如果我錯了)
明白了!有幾個教程指的是用來改變你的.gitmodule文件。他們都失敗了,因此混亂。最簡單的方法是克隆整個分支(不管提交ID如何),然後在所需提交ID的子模塊中執行git checkout,然後在父分支中執行git commit,然後推送。 –
infoclogged
還有一件事。其他已經下載完整代碼(包括子模塊)的開發人員需要調用git pull,然後調用git submodule update或git submodule update --remote以與最新的子模塊更改同步。 – infoclogged
是的,每次更改子模塊引用時,在父回購庫上執行'git pull'時,子模塊將顯示爲'modified'。要將子模塊更新爲新引用,只需在主要的回購庫上運行'git submodule update'即可。 –