做者:shede333
主页:http://my.oschina.net/shede333
版权声明:原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | [Creative Commons BY-NC-ND 3.0][]git
##1.添加submodule库服务器
git submodule add {subLib path}
前提是 submodule库已经在本地{sublib path}了;
注意: {sublib path}的格式,若是就在根目录,使用./文件夹名
的格式 项目中主要有3个改变:工具
git submodule status
此时已经能够看到submodule库hash信息fetch
git st
.gitmodules和库名文件夹,须要commit. 此时 .git/config 和 .gitmodules 中都出现了关于submodule的信息.net
git commit -m "add submodule"
加载submodule步骤完成命令行
##2.clone 带submodule的项目code
**强烈推荐:**有个简单快捷的方法:递归
git clone {项目路径} --recurse
这个命令就是递归clone主库以及相关的submodule,全部库的代码都被下载下来get
若是用git clone {项目路径}
,步骤就稍微麻烦点,可是能一步步看看原理hash
git clone {项目路径}
只clone主库,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,因此不会对主库形成影响。
##参考