git submodule 相关操作解析

作者: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个改变:

  1. modified:.git/config
  2. add:.gitmodules
  3. 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库的代码并没有下载下来 可以看到:

  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 工具 - 子模块

转载于:https://my.oschina.net/shede333/blog/186626

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值