子模块是链接;子树是复制的。

添加

添加子模块。

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

使用子模块和子树来管理 Git 项目

移除

# 逆初始化模块,其中{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

Git删除子模块和远程分支

常见问题

fatal: 'src/content/posts' already exists in the index

git rm -rf --cached src/content/posts

扩展阅读