概述
目前基本上绝大多数的公司均废弃了同步时的SVN,转而拥抱分布式的git。为了开发和管理的方便,往往会将一个大的项目拆分成多个子项目进行独立开发,子项目之间的依赖和引用通过子模块的方式使用,对于刚从SVN转过来的用户,使用git管理子模块会碰到各种坑,这里进行一个汇总。
添加子模块工程
将子模块加到submodule
git submodule add url path # url 为git库的地址,path表示子模块存放的路径,可以是单极文件夹,可以是多级文件夹。
执行成功后,在当前项目下可以看到.gitmodules,通过vim打开,可以看到如下内容:
[submodule "sm"]
path = sm
url = http://github/xx/sm.git
表示添加了一个子项目sm,存放在当前项目根目录sm下。
提交子模块到远程
git commit
子模块使用
方法一:
git submodule init
git submodule update
方法二:
git submodule update --init --recursive
git submodule update –remote # 将子仓库的更新拉取下来
删除子模块
手动删除法(以sm项目为例):
rm -rf <sm> # 删除子模块文件
vim .gitmodules # 在.gitmodules找到对应记录并删除
vim .git/config # 在config中找到对应记录并删除
rm .git/modules/<sm> # 删除模块下的子模块,每个子模块对应一个目录
git rm --cached <sm>
命令删除法
git submodule deinit -f sm # 反向初始化submodule, 加上-f会同时删除子仓库数据
vim .gitmodules # 打开文件,删除对应的记录, 需手动删除
rm .git/modules/<sm> # 手工删除对应目录, 需手动删除
rm sm # sm 对应 添加子模块“git submodule add url path” 中path的文件, 需要手工删除
git rm --cached <sm>