Git —— submodule 操作說明
1. add 添加子模塊
# git submodule add -b master https://github.com/coolsnowwolf/lede.git ./lede
git submodule add -b <branch-name]> <git-repository-url> [local-path]
# 本地提交
git commit -m "add submodule xxxx"
# 推送到遠(yuǎn)程倉庫
git push
2. checkout 子模塊檢出
# 有兩種方式:
# 1. 使用 --recursive 參數(shù),跟隨主倉庫遞歸 clone
git clone <your main repository url> --recursive # 此時 clone 下來的主項目會直接 clone 遠(yuǎn)程倉庫中記錄的 commit id 版本的子模塊
# 2. 單獨 checkout 子模塊
git clone <your main repository url> # 不帶 --recursive 遞歸參數(shù)時,submodule 無法被一起 clone 下來
git submodule update --init --recursive # 將 submodule 更新到遠(yuǎn)程倉庫中記錄的 commit id 版本
3. update 更新/切換子模塊 commit id 和當(dāng)前分支
這里存在一個較大的坑,默認(rèn)檢出的子模塊并不屬于任何分支,而是一個 “detached head” ,雖然可以提交更改,但是并沒有本地分支跟蹤提交的更改,這意味著下次更新子模塊會丟失這些更改。
因此在對子模塊進(jìn)行開發(fā)修改前,請先切換其所屬分支和對應(yīng)的 commit id。
# 默認(rèn)添加的 submodule 的 commit id 是 add 時默認(rèn)分支當(dāng)前的一個 commit id,當(dāng)子模塊原始倉庫更新后,期望切換到指定的 commit id 版本,或者像要切換分支
git pull
git submodule update # 更新本地倉庫,避免出現(xiàn)沖突
cd <submodule dir>
git checkout <branch name> # 切換分支
git pull # 拉取新分支源碼
git checkout <commit id> # 更新子模塊版本
# 回到主倉庫目錄,提交子模塊的引用版本修改
cd ..
git add . # 暫存 submodule 的引用版本修改
git commit -m "update submodule xxx from xxx to xxx" # 提交
git push # 推送到遠(yuǎn)程倉庫
4. commit 提交子模塊
git pull
git submodule update # 確保提交前已將本地倉庫更新到遠(yuǎn)程倉庫最新版本,避免提交出現(xiàn)沖突
cd <submodulde dir>
git add .
git commit -am "submodule modify"
git push # 將子模塊提交的更改推送至遠(yuǎn)程倉庫
由于子模塊和主模塊是獨立的兩個倉庫,主模塊僅僅應(yīng)用了子模塊的 url 和 commit id。因此當(dāng)子模塊推送更改后,生成新的 commit id,但是主模塊對子模塊的引用配置并未發(fā)生更改,因此需要在主模塊中同步進(jìn)行提交更改。
cd ../ # 回到主模塊目錄
git add .
git commit -am "submodule reference modify"
git push # 推送主模塊對子模塊的引用記錄更改到遠(yuǎn)程倉庫
可以看到對于子模塊的修改,我們需要分別提交和推送子、主木塊的更改,當(dāng)然我們也可以將 “推送至遠(yuǎn)程倉庫” 這一步合并:
cd <main module dir> # 進(jìn)入主模塊目錄
# 使用 --recurse-submodules=on-demand 選項,可以在推送主模塊更改時,自動推送未推送的子模塊
git push --recurse-submodules=on-demand
如果出現(xiàn)子模塊提交了更改記錄,但是未推送到遠(yuǎn)程倉庫,主模塊提交了子模塊引用記錄的變更,并完成了推送到遠(yuǎn)程倉庫的操作。此時拉取主模塊沒問題,但是在拉取子模塊時,會出現(xiàn) “not our ref” 的報錯。這是因為主模塊引用了一個遠(yuǎn)程倉庫未記錄的 commit id 版本的子模塊。需要在提交了變更記錄的子模塊中完成 push 即可。為了避免忘記推送子模塊修改,僅推送了主模塊的引用記錄變更,可以將主模塊的推送命令修改為:
# 使用 --recurse-submodule=check 選項可以自動檢查子模塊未 push 的錯誤
git push --recurse-submodule=check
當(dāng)使用 “–recurse-submodule=check” 選項時,如果子模塊存在未 push 情況,則當(dāng)前 push 操作會報警;并且如果子模塊存在 push 失敗的情況時,也同樣會報錯??梢灾苯訉⑵鋵懭?git 配置,減少重復(fù)勞動:文章來源:http://www.zghlxwxcb.cn/news/detail-752181.html
git config push.recurseSubmodules check
5. modify 修改 submodule 遠(yuǎn)程倉庫 url
cd <main module dir> # 進(jìn)入主模塊目錄
# 修改主模塊中 .gitmodules 中的 url
# 使用 sync 命令同步修改至 .git/config 中
git submodule sync
git commit -am "modify submodule url" # 提交修改
git push # 推送到主模塊遠(yuǎn)程倉庫
如果時別人修改了子模塊 url,則拉取主模塊的更新后,使用 sync 命令同步到本地 .git/config 中即可:文章來源地址http://www.zghlxwxcb.cn/news/detail-752181.html
cd <main module dir> # 進(jìn)入主模塊目錄
git pull # 拉取主模塊更新,即獲取 .gitmodule 中 url 的修改
git submodule sync # 將 .gitmodule 中的修改同步到本地倉庫的配置中 .git/config
6. deinit 移除已有的 submodule
git submodule deinit <submodule name>
git rm <submodule dir>
git commit -am "remove submodule xxx"
git push
參考資料
- 《Git - 使用git submodule的規(guī)范操作》
- 《Git submodule 知識總結(jié)》
- 《來說說坑爹的 git submodule》
到了這里,關(guān)于Git —— submodule 操作說明的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!