做为一名程序员,大家对 ** Git ** 肯定都不陌生,最近项目中用到了 Git 子模块,今天,给大家讲一下 ** Git ** 子模块。
通常,一个大型工程总会被分拆为一些子工程。这既有利于工程开发难度的降低,也有利于使用现成的方案或者第三方方案作为子工程。git submodule
就是完成这样一种子工程拆分与整合的工具。下面开始简单介绍一下 git submodule
的用法。
什么是 Submodule?
git Submodule
是一个很好的多项目使用共同类库的工具,他允许类库项目做为 ** repository ** ,子项目做为一个单独的 git 项目存在父项目中,子项目可以有自己的独立的 ** commit ,push , pull 。而父项目以 Submodule 的形式包含子项目,父项目可以指定子项目 header,父项目中会的提交信息包含 Submodule 的信息,再 ** clone 父项目的时候可以把 **Submodule **初始化。
在项目中使用Submodule
- 在项目中添加 Submodule,使用 git submodule add + 仓库地址,例如
git submodule add git@github.com:jjz/pod-library.git pod-library
- 查看当前状态
git status
On branch master
Changes to be committed:
new file: .gitmodules
new file: pod-library
可以看到多了两个需要提交的文件:.gitmodules 和 pod-library
**.gitmodules ** 内容包含 Submodule 的主要信息,指定 reposirory 的路径
[submodule "pod-library"]
path = pod-library
url = git@github.com:jjz/pod-library.git
可以看到记录了子项目的目录和子项目的 git 地址信息。
- 另外,这两个文件都需要提交到父项目的git中。
git add .gitmodules pod-ibrary
git commit -m "pod-library submodule"
git submodule init
-
修改Submodule
首先需要确认有对Submodule的commit权限,如果没有权限,则不能提交提交代码到父项目上。
进入 Submodule 目录里面
cd pod-library/
- 修改其中的一个文件,并且查看改动
git status
modified: pod-library/UseAFHTTP.h
- 提交Submodule的更改内容
git commit -a -m'test submodule'
- 然后 push 到远程服务器
git push
- 然后再回到父目录,提交Submodule在父项目中的变动
cd ..
git status
modified: pod-library (new commits)
可以看到 pod-library 中已经变更为 Submodule 最新的 commit id
Subproject commit 330417cf3fc1d2c42092b20506b0d296d90d0b5f
- 需要把 Submodule 的变动信息推送到父项目的远程服务器
git commit -m'update submodule'
git push
这样就把子模块的变更信息以及子模块的变更信息提交到远程服务器了,从远程服务器上更新下来的内容就是最新提交的内容了。
- 更新 Submodule
更新Submodule有两种方式
- 在父项目的目录下直接运行
git submodule foreach git pull
- 在Submodule的目录下面更新
cd pod-library
git pull
- 克隆 Submodule
clone Submodule 有两种方式 一种是采用递归的方式 clone 整个项目,一种是 clone 父项目,再更新子项目。
- 采用递归参数 --recursive
git clone git@github.com:jjz/pod-project.git --recursive
执行结果
loning into 'pod-project'...
remote: Counting objects: 57, done.
remote: Compressing objects: 100 % (45 / 45), done.
remote: Total 57(delta 13), reused 49(delta 8), pack - reused 0
Receiving objects: 100 % (57 / 57), 18.79 KiB | 0 bytes / s, done.
Resolving deltas: 100 % (13 / 13), done.
Checking connectivity...done.
Submodule 'pod-library' (git @github.com: jjz / pod - library.git) registered
for path 'pod-library'
Cloning into 'pod-library'...
remote: Counting objects: 34, done.
remote: Compressing objects: 100 % (25 / 25), done.
remote: Total 34(delta 8), reused 30(delta 7), pack - reused 0
Receiving objects: 100 % (34 / 34), 12.95 KiB | 0 bytes / s, done.
Resolving deltas: 100 % (8 / 8), done.
Checking connectivity...done.
Submodule path 'pod-library': checked out '330417cf3fc1d2c
42092 b20506b0d296d90d0b5f '
可以看到 init Submodule 会自动被 clone 下来
- 先 clone 父项目,再初始化 Submodule
执行
git clone git@github.com:jjz/pod-project.gitcd pod-project
git submodule init
会看到
Submodule 'pod-library' (git@github.com:jjz/pod-library.git)
registered for path 'pod-library'
然后更新 Submodule
git submodule update
看到输出结果为
Cloning into 'pod-library'...
remote: Counting objects: 34, done.
remote: Compressing objects: 100 % (25 / 25), done.
remote: Total 34(delta 8), reused 30(delta 7), pack - reused 0
Receiving objects: 100 % (34 / 34), 12.95 KiB | 0 bytes / s, done.
Resolving deltas: 100 % (8 / 8), done.
Checking connectivity...done.
Submodule path 'pod-library': checked out '330417cf3fc1d2c42092b20506b0d296d90d0b5f'
所以,用两种方法都能初始化 Submodule
- 删除 Submodule
git 并不支持直接删除 Submodule,需要手动删除对应的文件:
cd pod-project
git rm --cached pod-library
rm -rf pod-library
rm .gitmodules
更改 git 的配置文件 config
vim .git/config
可以看到 Submodule 的配置信息:
[submodule "pod-library"]
url = git@github.com:jjz/pod-library.git
删除submodule相关的内容,然后提交到远程服务器
git commit -a -m 'remove pod-library submodule'
Submodule 有在项目开发的过程中有很大的用处,希望文章对大家有帮助。