git submodule 的简单使用
目前接手的项目中,发现项目内引用了另一个项目,使用的就是 git submodule
, 之前开发组件库的时候使用过 npm link
, 但它是以依赖库的关系引用的。接下来,就学学 git submodule
是如何使用的。
首先, 我们先准备这样一个项目
2 个 commit, 每个 commit 提交一个文件,然后在另一个项目里引入
我们用 git submodule
执行如下命令
git submodule add git@github.com:lele3/git-research-child.git child
上述命令就是将 git-research-child 项目添加到这个项目中的 child 目录下
然后我们再在 child 目录下再添加一个 git submodule:
cd child
git submodule add git@github.com:QuarkGluonPlasma/git-research-child.git child2
现在就是两级 git submodule 了:
在 .gitmodules 里记录着它的 url 和保存的 path:
[submodule "child"]
path = child
url = git@github.com:lele3/test.git
git submodule
是独立的仓库,拉下来的项目中包含 .git
目录
有了 .git
目录, 就能保证 submodule 可以独立的 pull 和 push
比如我在 child 里加了一个 444.md 的文件:
你 git status 只能看到它提示了 submodule 有内容变动,但是根本不会管有什么变动。
你需要进入这个目录执行 git add、git commit、git push 才行。
也就是它依然是独立的项目,父项目只是记录了它关联的 commit id 是啥。
可以看到,子项目可以正常 push 成功。
这时候在 child 目录下执行 git status 就可以看到没有变动了:
但这时候你回到父级目录可以看到提示 submodule 有新的 commit:
我们新生成一个 commit 来保存这次变更:
这就是 submodule 的独立性,你可以在这个目录下单独执行 pull、push,单独管理变更,父项目只是记录关联的 commit 的变化。
那如果别人 clone 下这个项目来,还有这个 submodule 么?
我们 clone 下试试:
git clone git@github.com:xxx/git-research.git git-research-2
可以看到确实有 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
唉,前面一点还想好好写一写,越写越不想写,唉,耐心越来越少了。。。