子模块是链接;子树是复制的。
添加
添加子模块。
git submodule add <url> <path>
add 时使用 -b
参数确定跟踪分支
git submodule add -b <branch> <repo> <project-path>
举例:
git submodule add -b main https://github.com/songxingguo/posts.git src/content/posts
可以看到 .gitmodules
文件中多记录了一个分支信息如下
[submodule "themes/next"]
path = themes/next
url = git@github.com:Orange-C/hexo-theme-next.git
branch = master
更新
初始化并检出子模块
git submodule init
git submodule update
从远程子库拉取最新的子库代码
git submodule update --remote
移除
# 逆初始化模块,其中{MOD_NAME}为模块目录,执行后可发现模块目录被清空
git submodule deinit {MOD_NAME}
# 删除.gitmodules中记录的模块信息(--cached选项清除.git/modules中的缓存)
git rm --cached {MOD_NAME}
# 提交更改到代码库,可观察到'.gitmodules'内容发生变更
git commit -am "Remove a submodule."
git submodule deinit -f path/to/submodule
rm -rf .git/modules/path/to/submodule
git rm -f path/to/submodule
常见问题
fatal: 'src/content/posts' already exists in the index
git rm -rf --cached src/content/posts