git submodule 相关操做解析

做者: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个改变:工具

  1. modified:.git/config
  2. add:.gitmodules
  3. add:submodule的文件夹

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库的代码并无下载下来 能够看到:

  1. .gitmodules存在,里面包含了submodule的信息;
  2. 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,因此不会对主库形成影响。

##参考

6.6 Git 工具 - 子模块

相关文章
相关标签/搜索