背景:為什么要用子模塊?
在開發項目中可能會遇到這種問題:在你的項目中使用另一個項目,也許這是一個第三方開發的庫,或者是你獨立開發的並在多個父項目中使用的。簡單來說就是A同學開發了一個模塊,被B\C同學共同調用,,可能就形成了這種模塊調用關系。
然后就產生了一個問題:我想將兩個項目單獨處理。但是又需要再其中一個中使用另一個。
解決方案
git給了一個處理方案--子模塊
- 子模塊允許將一個git倉庫作為另一個git倉庫的子目錄,他能讓你將另一個倉庫克隆到自己的項目中區去,並且保持提交的獨立。
- 子模塊關鍵字:
git submodule
如何使用子模塊
假如我有兩個倉庫,module
(目標倉庫)和submodule
(子模塊倉庫)。
在現有的倉庫中加入子模塊
git submodule add https://gitee.com/Hancoson/submodule.git module
- 現在在module項目子目錄中就會有一個submodule子模塊。
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: .gitmodules
new file: submodule
我們會發現多兩個新的文件,首先是.gitmodules文件。這個文件是一個配置文件,保存了項目URL和已經拉取的本地目錄之間的映射
- 查看
.gitsubmodule
文件cat .gitsubmodule
[submodule "submodule"]
path = submodule
url = https://gitee.com/Hancoson/submodule.git
如果有多個子模塊,文件里會有多個條目。但是這個文件個其他文件一樣也是處於版本管理控制之下的,就像.gitignore
文件一樣,這樣該子模塊是和其他們文件一樣可以被推送和拉取。這也是克隆該項目獲知子模塊項目來源的途徑。
- 提交增加的子模塊到該項目的遠程倉庫中
commit
方式和普通提交的方式相同
- 克隆一個帶有子模塊的項目
git clone <url>
克隆這個項目時,默認會包含該子模塊的所有目錄,但是目錄中不會有任何文件,這是需要運行兩個命令:
git submodule init
用來初始化本地配置文件;git submodule update
用來拉取module目錄中的所有數據,並檢測出你上層項目所列的合適的提交。
$ git submodule init
Submodule 'submodule' (https://gitee.com/Hancoson/submodule.git) registered for path 'submodule'
$ git submodule update
Submodule path 'submodule': checked out '471741e958c2ef0096ad5971c264041a9295ce3b'
- 修改子模塊
切換到要修改代碼的子模塊,修改代碼,push方式和普通方式相同。