Git submodule 子模块的管理和使用
使用前提
场景: 当你在一个Git 项目上工作时,你需要在其中使用另外一个Git 项目。也许它是一个第三方开发的Git 库, 比如公司内部自己开发的公用代码库, 并在多个父项目中使用的。这个场景下,常见的问题产生了:你想将两个项目单独处理, 但是又需要在其中一个中, 使用另外一个。
在Git 中, 可以用子模块submodule来管理这些项目,submodule允许将一个Git 仓库当作另外一个Git 仓库的子目录。这允许克隆另外一个仓库到你的项目中, 并且保持你的提交相对独立。
添加子模块
此文中统一将远程项目https://github.com/zhangHulk//Android/HulkDemo.git克隆到本地HulkDemo文件夹。
$ git submodule add --force https://github.com/zhangHulk//Android/HulkDemo.git HulkDemo
添加子模块后运行git status, 可以看到目录有增加1个文件.gitmodules, 这个文件用来保存子模块的信息。
hulk@hulk-PC:~/byod/code/byod_new2$ git status On branch hulk/yj-git-submodules Your branch is up to date with 'origin/custom/yjglb-3.0.1606-sm'.
Changes to be committed: (use "git reset HEAD <file>..." to unstage)
new file: .gitmodules //如果之前有.gitmodules这个文件,不会列出来 new file: HulkDemo
查看子模块
hulk@hulk-PC:~/byod/code/byod_new2$ git submodule 97d8c55aabdb89a6111230c74f4519667ff2d1f6 HulkDemo (custom-police/trustunit-police-3.0.2002.23/59)
p>
更新子模块
更新项目内子模块到最新版本
$ git submodule update
更新子模块为远程项目的最新版本
$ git submodule update --remote
克隆包含子模块的项目
克隆包含子模块的项目有二种方法:一种是先克隆父项目,再更新子模块;另一种是直接递归克隆整个项目。
克隆父项目,再更新子模块
克隆父项目
$ git clone https://github.com/zhangHulk//Android/HulkDemo.git HulkDemo
查看子模块
$ git submodule -97d8c55aabdb89a6111230c74f4519667ff2d1f6 HulkDemo
子模块前面有一个-,说明子模块文件还未检入(空文件夹)。
初始化子模块
$ git submodule init Submodule 'HulkDemo' (https://github.com/zhangHulk//Android/HulkDemo.git) registered for path 'HulkDemo'
初始化模块只需在克隆父项目后运行一次。
更新子模块
hulk@hulk-PC:~/byod/code/byod_new2
$ git submodule update
Cloning into 'HulkDemo'... remote: Enumerating objects: 309, done.
remote: Counting objects: 100% (85/85), done.
remote: Compressing objects: 100% (42/42), done.
remote: Total 309 (delta 44), reused 67 (delta 36), pack-reused 224
Receiving objects: 100% (309/309), 7.15 MiB | 51.56 MiB/s, done.
Resolving deltas: 100% (120/120), completed with 5 local objects.
更新子模块为远程项目的最新版本
需要输入git代码库的账户密码
hulk@hulk-PC:~/byod/code/byod_new2$ git submodule update --remote
Username for 'https://git-biz.qianxin-inc.cn': zhanghao
Password for 'https://zhanghao@git-biz.qianxin-inc.cn':
remote: Enumerating objects: 309, done. remote: Counting objects: 100% (85/85), done. ................
From https://github.com/zhangHulk//Android/HulkDemo
97d8c55..ee8c648 develop -> origin/develop
-
[new branch] TrustUnit -> origin/TrustUnit
-
..........
-
[new tag] custom-jianhang-debug/$version_name/10 -> custom-jianhang-debug/$version_name/10
Submodule path 'HulkDemo': checked out 'ee8c64838f681c3509317eb43ee52e576d83410f'
至此,整个添加/更新子模块就结束了.
递归克隆整个项目
git clone https://github.com/zhangHulk//Android/HulkDemo.git HulkDemo --recursive
递归克隆整个项目,子模块已经同时更新了,一步到位。
修改子模块
在子模块中修改文件后,直接提交到远程项目分支。
$ git add . $ git ci -m "commit" $ git push origin HEAD:master
删除子模块文件夹
删除子模块 删除子模块比较麻烦,需要手动删除相关的文件,否则在添加子模块时有可能出现错误 同样以删除CustomAPK文件夹为例
$ git rm --cached HulkDemo
$ rm -rf HulkDemo
删除.gitmodules文件中相关子模块信息
[submodule "HulkDemo"] path = HulkDemo url = https://github.com/zhangHulk//Android/HulkDemo.git
删除.git/config中的相关子模块信息 [submodule "HulkDemo"] url = https://github.com/zhangHulk//Android/HulkDemo.git
删除.git文件夹中的相关子模块文件 $ rm -rf .git/modules/HulkDemo