关于 git submodule
最近在汉化 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 仍然是旧的值,其他协作者检出的仍然是修改前的项目。