git version 2.11.0 (Apple Git-81)
工作中会遇到这种情况,多个项目引用了同一套代码 A,这套代码A修改后还需要在多个项目中同步,如果项目是 git 管理,那就需要在每个项目中嵌入一个子模块,这个子模块就是 A
git 子模块允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。 它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立。
1:添加子模块
如果我们要嵌入一个子模块,就必须调用 submodule add 命令,并制定该模块的 仓库路径和模块所在的目录名
> git submodule add [email protected]:langzuxiaozi/ExtractSms.git sub
这样一来,模块版本库就会被完整地克隆到制定的目录中(并且它也会创建属于它自己的.git目录),主版本库中的.gitmodules文件也将被同步创建或更新
然后还需要将新的子模块注册到.git/config文件中.
>git submodule init
目前子模块指向的是默认分支的 HEAD, 如果需要选择子模块的版本, 那就需要用 checkout 命令来选择一下相应的版本
>cd sub
>git checkout v1.0
>cd ..
然后将.gitmodules 文件和子目录添加到提交中
>git add .gitmodules
>git add sub
>git commit -m "Submodule added"
>git push
2:克隆带有子模块的项目
要克隆一个带有子模块的项目需要在执行 git clone 命令之后 需要初始化子模块和更新子模块,要不子模块的目录内容是空的
>git submodule init
>git submodule update
现在子模块目录就有内容了.当然也可以执行递归命令
>git clone --recursive [email protected]:langzuxiaozi/ExtractSms.git
3:子模块仓库有更新,要用最新的子模块代码
在许多开发项目中,我们通常都希望主项目所集成的始终是子模块的当前最新版本.
git 的子模块不支持这种想法,子模块引用的只是模块版本库中的某一次提交,模块版本库中随后的新提交并不会自动记录到主版本库中.所以需要我们显示的修改
更新子模块
>cd sub
>git fetch
>git checkout v1.0
>cd ..
最后将新提交更新到模块目录中.
>git add sub
>git commit -m "New version of the submodule"
>git push
4:修改子模块文件内容后,提交更新
如果在工程中修改了子模块的文件,那就进入到主版本库中的子模块目录提交并推送>cd sub
>git add jni_common.h
>git commit -m "Changed submodule"
>git push
>cd ..
这个时候去子模块的仓库看,就能看的这次的修改了,但是还没完,主板本的仓库还没更新呢,
先看一下当前主版本中子模块被引用的散列值
>git submodule status
+447ff22adb9ed9a72e4be7cdfa7ebe4f5ba2af0a sub (heads/master)
这个散列值是和子模块中仓库中最新提交的散列值是一致的.下面更新主版本的仓库
>git add sub
>git commit -m "New version of submodule"
>git push
5:修改子模块的 url
打开目录下的.gitmodules文件,修改对应模块的 url,然后执行命令
>git submodule sync
>git commit -am "Update submodule url."
>git push
6:删除子模块
首先逆初始化子模块目录,执行后目录内容为空
>git submodule deinit sub
然后删除.gitmodules中的sub模块信息 然后提交
>git rm --cached sub
>git git commit -am "Remove a submodule."
>git push
7:Jenkins配置 git 子模块
首先 git 的证书 是在 Jinkens 上配的才可以
Additional Behaviours -> Add -> Advanced sub-modules behaviours 选中
Recursively update submodules 和 Use credentials from default remote of parent repository
完成.