最近在汉化 Ghost 项目,其中的主题 Casper 是一个单独的项目,这时就要用到 git submodule 了,这里以 Ghost 为例,记录我在使用 git submodule 时遇到的问题。

修改 submodule 指向


我在 fork 完 Ghost 之后,发现其中的 Casper 项目指向的是原始的 repo,而我需要的是指向我自己的 Casper,这里需要修改主项目下的 gitmodules 文件,打开后发现其中内容如下:

[submodule "content/themes/casper"]
;submodule 在主项目中的路径
path = content/themes/casper
;submodule 的链接
url = git@github.com:airycanon/Casper.git

把 url 指向为我的 github 中的项目链接即可。

把某个项目加入 submodule


git submodule add git@github.com:airycanon/Casper.git content/themes/casper

删除某个 submodule


mv content/themes/casper content/themes/casper_tmp
git submodule deinit content/themes/casper
git rm content/themes/casper

如果只是从 git 中删除 submodule 的记录

git rm --cached casper
rm -rf .git/modules/casper

克隆包含 submodule 的项目


git clone git@github.com:airycanon/ghost.git

这时执行 git submodule 可以看到 submodule的状态:

git submodule
# 输出 -601d6e8e8ecb6dd6e78c4d237db7308488ee9693 content/themes/casper

表示当前 commit id 和所在的目录,但是注意前面有一个减号,表示该 submodule 还没有检出。
接着可以把 submodule 检出了:

git submodule init
git submodule update

这里还可以用另外一种方法检出 submodule,在克隆主项目时增加 recursive 参数:

git clone git@github.com:airycanon/ghost.git --recursive

修改 submodule


submodule 也是一个独立的项目,修改完 commit 并 push 即可。

注意:如果修改了 submodule 中的内容,需要在主项目中 commit 并 push,目的是更新主项目记录的 submodule 的 commit id ,否则尽管 submodule 的修改已经提交,但其在主项目中的 commit id 仍然是旧的值,其他协作者检出的仍然是修改前的项目。