作者:shede333
主页:http://my.oschina.net/shede333
版权声明:原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | [Creative Commons BY-NC-ND 3.0][]
##1.添加submodule库
git submodule add {subLib path}
前提是 submodule库已经在本地{sublib path}了;
注意: {sublib path}的格式,如果就在根目录,使用./文件夹名
的格式 项目中主要有3个改变:
- modified:.git/config
- add:.gitmodules
- add:submodule的文件夹
git submodule status
此时已经可以看到submodule库hash信息
git st
.gitmodules和库名文件夹,需要commit. 此时 .git/config 和 .gitmodules 中都出现了关于submodule的信息
git commit -m "add submodule"
加载submodule步骤完成
##2.clone 带submodule的项目
**强烈推荐:**有个简单快捷的方法:
git clone {项目路径} --recurse
这个命令就是递归clone主库以及相关的submodule,所有库的代码都被下载下来
如果用git clone {项目路径}
,步骤就稍微麻烦点,但是能一步步看看原理
git clone {项目路径}
只clone主库,submodule库的代码并没有下载下来 可以看到:
- .gitmodules存在,里面包含了submodule的信息;
- submodule文件夹存在,但是文件夹是空的; 3..git/config 里没有submodule库的信息
git st
没有发现有更改的地方.
git submodule status
可以看到submodule库hash信息,但是前面带有减号"-",就是说submodule还没有检出, 下面我们就开始下载submodule库
git submodule init
实际上是利用当前目录下的.gitmodules
文件里的信息,修改了.git/config文件,在该文件内注册了submodule库
cat .git/config
查看该文件,可以看到出现了submodule库的相关信息
git submodule update
将submodule库下载check out出来
##3.submodule 改动、上传
先假设submodule 有修改,但未commit,
则在主库 git status
可以看到:“submodule的更改,需要 git add (modified content)”
接着在子库 git commit了修改,
则在主库git status
可以看到:“submodule的更改,需要git add (new commits)”
接着 git submodule status :
看到submodule前面有加号"+",而且submodule库的hash信息改为最新。
git add .
接着 git submodule status:
看到submodule前面加号"+"消失了。
git commit -m "submodule modified"
这样就把submodule库的修改添加到主库。
但是还没完,还没push呢,这个很重要。
submodule修改commit完成后,尽早push, 因为,submodule的修改添加到了主库,而submodule没push,但主库push了,那么,其他人把主库pull之后,会找不到submodule,因为submodule库还在本地,没push到服务器,其他人拿不到。 所以submodule修改commit之后就尽早push到服务器 这时候主库再push就不会给别人造成麻烦了
##4.submodule库与主库,更新,协作
现在假设,同事对submodule库做了更改,submodule库也push,主库对submodule库的更改也push了, 我应该怎样更新项目。下面是我对自己库的部分操作
git pull
根据命令行的输出,可以看见,主库和submodule库都从服务器拉取了最新的代码, 但是submodule库,并没有把最新信息合并到master分支上.
我怀疑,主库使用了git pull
,但对submodule库只用了git fetch
git st
submodule库有modified: *** (new commits)
git submodule status
看到submodule库的hash信息没变,而且前有加号"+",说明主库记录的关于submodule库的信息, 与submodule库的当前信息不符,主库记录的信息过时,需要更新submodule库
进入submodule库
git st
提示当前master分支 落后于主分支一个commit.
回到主库
git submodule update
这个操作会把submodule信息更新,即主库会指向子库的最新commit信息,与服务器上的一样。
git submodule status
submodule库已经指向了最新的,
但是仔细看看最后的部分,其实submodule库目前指向的并不是master分支,还是一个游离分支 但这不影响主库的状态,主库看到的依然是submodule库最新的代码。
进入submodule库
git branch
发现当前的分支并不是master,而是游离分支,该分支的head-hash信息,与主库记录的submodule库的hash信息相同,说明,虽然两个库都拉取了最新的代码,但是submodule库的指向并没有自动改变,这个需要我们收到来更新submodule信息
##题外话
如果你想更改submodule库,则需要进入submodule库,执行一下命令,更新submodule库的master分支信息,同时不影响主库
git checkout master
git pull
这样操作后,submodule库的当前分支就从游离分支切换到master,但是之前的游离分支和现在的master分支的head指向同一个commit,所以不会对主库造成影响。
##参考