為什么
為什么要將代碼倉作為子模塊?有什么優勢?
- 精確版本控制:父倉記錄子倉的commit哈希值,確保代碼版本固定,避免隱式升級導致的兼容性問題
- 模塊化管理:將獨立倉庫作為子模塊嵌入父倉,實現代碼物理隔離,支持多團隊寫作與獨立開發
- 代碼復用與共享:同一模塊可被多個項目引用,避免重復代碼,確保一致性
- 權限與協作分離:子模塊獨立管理,父倉開發者無需介入子模塊開發流程
父子倉項目結構
主倉庫:Project/
├── 子模塊A (通過submodule鏈接倉庫)
├── 子模塊B
└── 子模塊C
相關操作
1. 添加子倉
git submodule add <repo> <Current_DIR Path>
添加以后,git會在父倉create兩個文件:
? ? ? ? 1. new file------> .gitmodules (保存子倉作為子模塊所在的路徑以及repo_url)
? ? ? ? 2. new file -------> repo_file(子倉,由于是通過哈希值鏈接,所以是以file的形式存儲而不是dir)
2. 更新子倉commit
在開發過程中,子倉會不斷commit,所以父倉要隨時或者定期的進行update submodule。
update 子倉commit:
git submodule update --remote <Current_DIR Path>
執行完上面操作后,本地submodule更新了,但是父倉remote尚未更新,所以需要單獨push一下repo_file(保證父倉commit哈希與子倉最新commit一致):
git add <Current_DIR Path>git commit -m "update submodule"git push origin cc/appworld
3. 相同路徑更換子倉
有時候我們可能需要在相同路徑下更換不同的倉庫作為submodule,該操作需要
刪除:
- 該路徑下submodule的git索引?
- 徹底刪除子模塊的內部 Git 配置目錄
- 刪除物理文件
code options:
# 查看該submodule是否被git追蹤
git ls-files | grep <submodule_path>
# 刪除git索引
git rm --cache <submodule_path>
# 徹底刪除子模塊的配置信息 確保路徑干凈
rm -rf .git/modules/<submodule_path>
# 將新倉庫作為子倉鏈接 (忽略沖突)
git submodule add -f <new_repo_url> <submodule_path>
補充:
-->git的索引是暫存區,記錄了哪些文件需要被提交到倉庫,--cache選項表示從索引中移除該文件不再追蹤,但是物理文件還是在的,所以需要手動刪除一下物理文件然后重新submodule add?
--> git子模塊本質是一個嵌套的git倉庫,其配置和對象都存儲在.git/modules/<submodule_path>,rm -rf會強制遞歸刪除路徑下所有內容。相當于徹底清除子模塊與git的聯系。
--> git submodule add -f 中 -f是強制重新添加,避免忘記刪除物理文件導致的existing error(忽略沖突)
還有一個更為便捷的方法,直接更新子模塊的url:
git submodule set-url <path> <new-url>
該操作僅僅更新倉庫url并不會將原有倉庫的文件進行更替或者刪除?
4. 子模塊中包含其他子模塊
如果你需要添加的子倉中也潛逃了子倉,那么需要執行下面命令進行添加
# 初始化并更新嵌套子模塊
git submodule update --init --recursive# 克隆主倉庫時自動初始化嵌套子模塊
git clone --recurse-submodules --recursive <main-repo-url>