经常碰到这种情况:当你在一个Git 项目上工作时,你需要在其中使用另外一个Git 项目。也许它是一个第三方开发的Git 库或者是你独立开发和并在多个父项目中使用的。这个情况下一个常见的问题产生了:你想将两个项目单独处理但是又需要在其中一个中使用另外一个。 这时候 submodule 就上场了!
添加子模块
1 2 3 4 5 6 7 8 9 10 11
| $ git submodule add <submodule_url> [path/submoduleName]
$ git submodule init
$ git submodule update
$ git clone --recurse-submodules <main_project_url>
|
查看 & 更新
1 2 3 4 5 6 7 8
| $ git submodule
$ git submodule update
$ git submodule update --remote
|
删除子模块
1 2 3 4 5 6 7 8 9 10
| $ git rm --cached <submodule> $ rm -rf <submodule>
$ rm -rf .git/modules/<submodule>
|
同步
向上同步
1 2 3 4 5
|
$ git add submodule $ git commit -m "message"
|
向下同步
注意点
- 当子模块有提交的时候,没有push到远程仓库, 父级引用子模块的commit更新,并提交到远程仓库, 当别人拉取代码的时候就会报出子模块的commit不存在
fatal: reference isn’t a tree
。 - 如果你仅仅引用了别人的子模块的游离分支,然后在主仓库修改了子仓库的代码,之后使用
git submodule update
拉取了最新代码,那么你在子仓库游离分支做出的修改会被覆盖掉。 - 我们假设你一开始在主仓库并没有采用子模块的开发方式,而是在另外的开发分支使用了子仓库,那么当你从开发分支切回到没有采用子模块的分支的时候,子模块的目录并不会被Git自动删除,而是需要你手动的删除了。