git submodule 的简单使用

 

git submodule 的简单使用

目前接手的项目中,发现项目内引用了另一个项目,使用的就是 git submodule, 之前开发组件库的时候使用过 npm link, 但它是以依赖库的关系引用的。接下来,就学学 git submodule 是如何使用的。

首先, 我们先准备这样一个项目 1

2 个 commit, 每个 commit 提交一个文件,然后在另一个项目里引入

2

我们用 git submodule 执行如下命令

git submodule add git@github.com:lele3/git-research-child.git child

上述命令就是将 git-research-child 项目添加到这个项目中的 child 目录下

3

然后我们再在 child 目录下再添加一个 git submodule:

cd child
git submodule add git@github.com:QuarkGluonPlasma/git-research-child.git child2

现在就是两级 git submodule 了:

4

在 .gitmodules 里记录着它的 url 和保存的 path:

[submodule "child"]
	path = child
	url = git@github.com:lele3/test.git

git submodule 是独立的仓库,拉下来的项目中包含 .git 目录

有了 .git 目录, 就能保证 submodule 可以独立的 pull 和 push

比如我在 child 里加了一个 444.md 的文件:

5

你 git status 只能看到它提示了 submodule 有内容变动,但是根本不会管有什么变动。

你需要进入这个目录执行 git add、git commit、git push 才行。

也就是它依然是独立的项目,父项目只是记录了它关联的 commit id 是啥。

6 可以看到,子项目可以正常 push 成功。

这时候在 child 目录下执行 git status 就可以看到没有变动了: 7

但这时候你回到父级目录可以看到提示 submodule 有新的 commit: 8

我们新生成一个 commit 来保存这次变更: 9

这就是 submodule 的独立性,你可以在这个目录下单独执行 pull、push,单独管理变更,父项目只是记录关联的 commit 的变化。

那如果别人 clone 下这个项目来,还有这个 submodule 么?

我们 clone 下试试:

git clone git@github.com:xxx/git-research.git git-research-2

10

可以看到确实有 child 这个目录,但是没内容。

这是因为它需要单独初始化一下并更新下代码:

执行

git submodule init
git submodule update

或者执行

git submodule update --init

就可以看到代码被拉下来了, 但只有一层,如果想递归的 init 和 update,可以这样:

git submodule update --init --recursive

这样它就会把每一层 submodule 都拉下来 当然,这一步可以提前到 git clone,也就是执行

git clone --recursive-submodules xxx

这样就不用单独 git submodule init 和 git submodule update 了。

小结下 git submodule 的用法:

  • 通过 git submodule add 在一个项目目录下添加另一个 git 项目作为 submodule

  • submodule 下可以单独 pull、push、add、commit 等

  • 父项目只是记录了 gitmodules 的 url 和它最新的 commit,并不管具体内容是什么

  • submodule 可以多层嵌套

  • git clone 的时候可以 –recursive-submodules 来递归初始化 submodules,或者单独执行 git submodule init 和 git submodule update

参考:https://mp.weixin.qq.com/s/Cm-xgtregfljwk6Ep9hSpw

唉,前面一点还想好好写一写,越写越不想写,唉,耐心越来越少了。。。