Git submodule 仓库中包含另外的仓库(子仓库)
Git submodule 仓库中包含另外的仓库(子仓库)
添加 submodule
在父仓库 git 目录下:
git submodule add ssh://ip/[path]/xxx.git
注意:不要在ip前加username@,例如:git submodule add ssh://username@ip/[path]/xxx.git,这样的话你就得把密码告诉别人了,如果不加username,那么会用git config 中的user去登陆
在父仓库添加 submodule 的时候,会让你输入密码把 submodule 的内容拷贝下来,但是如果clone一个带有 submodule 的的仓库,那么 submodule 的文件夹内没有任何内容,具体操作看“第一次clone一个带有submodule的仓库”
父仓库的变化:
1 新增了子仓库的内容文件夹
2 新增(如果之前没有).gitmodules
.git/config中增加了section:
[submodule "modulename"]
3 .git/modules中增加了module的文件夹,里面有所有自仓库的git信息文件夹
第一次 clone 一个带有 submodule 的仓库
方式一
git clone ssh://ip/[path]/topRepository.git 不带任何参数,假设topRepository.git带有submodule,那么这些submodule的文件夹里面是空的
cd topRepository 进入父仓库
git submodule 可以看到submodule信息前有个减号'-'
git submodule init 第一次不带参数克隆需要初始化
git submodule update 这样就会把submodule的内容clone下来
git submodule foreach git checkout master 注意:update 后的 submodule 会被 checkout 到 head 的 commit id 上,并不会自动checkout 到 master 分支,所以这行是在所有的 submodule 中 checkout master
方式二
git clone ssh://ip/[path]/topRepository.git --recursive 这种方式会在克隆父仓库的同时克隆submodule
cd topRepository 进入父仓库
git submodule 可以看到submodule信息前没有减号'-'
git submodule foreach git checkout master 注意:update 后的 submodule 会被 checkout 到 head 的 commit id 上,并不会自动checkout 到 master 分支,所以这行是在所有的 submodule 中 checkout master
如果 submodule 中还带有 submodule,那么可以是用 --recurse 参数
父仓库有新的 submodule 添加,或者 submodule 有新的 commit
别人在父仓库里加了 submodule,这时候需要更新自己本地的父仓库的 submodule
在父仓库目录下:
git pull
git submodule init
git submodule update
更新某个submodule:
git submodule update -- [path]
一次新 pull 所有的 submodule
在父仓库目录下:
git submodule foreach git pull origin master
submodule push
先在 submodule 的目录下 push 这是单独更新 submodule 的内容
然后在父仓库的目录下push 这是更新父仓库的 submodule 信息