git_submodule

git submodule使用

创建submodule

在主工程目录下,使用命令clone 子项目

1
git submodule add https://git.oschina.net/50k/SubModule.git

使用git status命令查看:

1
2
3
4
5
6
7
8
9
位于分支 master
您的分支与上游分支 'origin/master' 一致。
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)

新文件: .gitmodules
新文件: SubModule
```
SubModule为子项目,.gitmodules是配置文件,内容如下。

[submodule “SubModule”]
path = SubModule
url = https://git.oschina.net/50k/SubModule.git

1
2
3
4
5
6
7
8
9
10
<!--more-->

## 克隆子项目

直接clone主项目的时候,子项目会以空文件夹的形式存在,如果想要clone子项目一些操作。

- 方法一:
``` bash
git submodule init
git submodule update

  • 方法二:clone主项目的时候加上–recursive参数
    1
    git clone https://git.oschina.net/50k/MainModule.git

更新子项目

1
git submodule update --remote

使用上面的命令后,进入子项目git branch查看发现(头指针分离于 14d34c3)。虽然更新了,但是不在工作分之上。我们可以在上面的命令上修改一下,实现更新代码后在分之上。有两种修改,对应不同的场景。

  • 方法一:对应场景,本地子项目无修改,远程子项目有更新。

    1
    git submodule update --remote --merge
  • 方法二:对应场景,本地子项目修改,远程子项目有更新。

    1
    git submodule update --remote --rebase

push项目

在主项目中push的时候不会push子项目中的更新,需要在子项目中单独push。
这样就会有一些坑存在,主项目push后忘了push子项目中的更新。为了防止这种情况出现,需要对push命令进行一些处理。

1
git push --recurse-submodules=check

如果子项目更新没有push,主项目就会push失败。

秘技

  • foreach

    场景:一个新的迭代到了,代号138,主项目新建了一个分之138,为了保持统一,各子项目也需要新建一个138的分之,可以使用如下命令。

    1
    git submodule foreach 'git checkout -b 138'