1. Git submodule
1.1. submodule常用命令
在项目中的.gitmodules文件中查看当前submodule设置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
git clone <repository> --recursive #递归的方式克隆整个项目 git submodule add <repository> <path> #添加子模块 #示例:git submodule add https://github.com/c-ares/c-ares.git third_party/cares/cares -b cares-1_12_0 git submodule init #初始化子模块 git submodule update --init --recursive #初始化并更新子模块 git submodule foreach git pull #拉取所有子模块 git pull --recurse-submodules #拉取所有子模块中的依赖项 git submodule sync #将新的URL同步更新,该步骤适用于git submodule add或修改.gitmodules文件之后 git submodule status third_party/ModuleA #查看子模块状态,即该子模块切入的提交节点位置,即某HASH值 #删除子模块,然后删除对应资源库所有文件 git rm --cached ModuleA rm -rf moduleA git submodule set-url third_party/ModuleA https://XXX.git #,更新子模块URL,该功能在1.8.3.1以上版本 git submodule set-branch --branch dev third_party/ModuleA #设置子模块项目采用的分支,该功能在1.8.3.1以上版本 |
若希望每次clone拉取新的submodule到指定分支指定节点,需要在提交时将子模块checkout到指定指针位置,然后提交该子模块所在目录git add third_party/ModuleA;git commit xxx;
(其实是提交子模块中的.git所在commit指针中位置HASH值e6fd72ad).
1.1. 删除和更新子模块
-
删除一个submodule
1.删除 .gitsubmodule中对应submodule的条目
2.删除 .git/config 中对应submodule的条目
3.执行 git rm --cached {submodule_path}。注意,路径不要加后面的“/”。例如:你的submodule保存在 supports/libs/websocket/ 目录。执行命令为:git rm --cached supports/libs/websocket -
更新submodule的URL
1.更新 .gitsubmodule中对应submodule的条目URL
2.更新 .git/config 中对应submodule的条目的URL
3.执行 git submodule sync
2. 问题解决
2.1.引用不是一个树
fatal: 引用不是一个树:a27a43eafa8f4dd514e89984f5394260a36ea4f6
无法在子模组路径 'src/lib/ecl' 中检出 'a27a43eafa8f4dd514e89984f5394260a36ea4f6'
1 2 3 4 |
#解决方法为git添加子模块的位置: git add src/lib/ecl #下载子模块命令为: git submodule update --init --recursive |
2.2. Needed a single revision
fatal: Needed a single revision
将出错的文件夹删除后,重新执行git submodule update命令
2.3. 未在.gitmodules中发现路径’boringssl’的子模组映射
1 2 |
#虽然优化,但是没有优化删除缓存中库 git rm --cached boringssl |
2.4. 在项目中子模块总是提示新提交
- 报错如下:
1 2 3 4 5 |
尚未暂存以备提交的变更: # (使用 "git add <file>..." 更新要提交的内容) # (使用 "git checkout -- <file>..." 丢弃工作区的改动) # # 修改: third_party/grpc (新提交) |
- 解决方法
这个问题是因为子模块中引用的HASH节点与子模块中实际的子节点HASH不一致导致,需要更正实际目录中的子节点HASH;
1 2 3 4 5 6 7 8 |
#查看该子项目实际引用节点 $ git submodule ee5b762f33a42170144834f5ab7efda9d76c480b third_party/grpc (v1.12.1-14788-gee5b762) #这一步将子模块中HASH节点重置 $ cd third_party/grpc $ git reset --hard ee5b762f3 $ cd .. |
2.5. 子模块改为无git管理的代码添加到项目中
因网络限制问题有些代码可能无法快速下载,需要将子模块改为已下载好的代码。首先clone好子模块代码;
1 2 3 4 5 6 7 8 9 10 11 |
#1.删除子模块 git rm --cached third_party/protobuf #2.删除.gitignore中url 删除文件中third_party/cares/cares并对其进行管理同步 git submodule sync #3.删除子模块中的.git管理文件,也可能是.github目录 rm -rf third_party/protobuf/.git #4.添加子模块中所有代码到现有项目 git add third_party/protobuf/* |
参考文章 GIT Submodule的使用
参考文章 Git Submodule管理项目子模块
微信赞赏
支付宝赞赏