# GIT工具子模块
# 子模块
某个工作中的项目需要包含并使用另一个项目如第三方库,或者你独立开发的,用于多个父项目的库,如何把它们当做两个独立的项目,同时又想在一个项目中使用另一个呢?
Git 通过子模块来解决这个问题。 子模块允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。 它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立。
# 如何使用子模块
- 向一个GIT仓库中添加另外一个GIT仓库作为第三方库
git submodule add https://github.com/strasdat/Sophus.git 3rdparty
将Sophus
库添加到本仓库3rdparty
文件中,执行上述命令后会在当前GIT仓库中自动生成.gitmodules
文件。
# .gitmodules 文件内容
[submodule "3rdparty/Sophus"]
path = 3rdparty/Sophus
url = https://github.com/strasdat/Sophus
虽然 Sophus 是工作目录中的一个子目录,但 Git 还是会将它视作一个子模块。当你不在那个目录中时,Git 并不会跟踪它的内容, 而是将它看作子模块仓库中的某个具体的提交。
- 克隆含有子模块的项目
git clone repository-url
通过上述命令克隆的仓库,默认会包含该子模块目录,但其中还没有任何文件。
需要切换到子模块父目录路径下,执行
git submodule init
git submodule update
或使用另外一种更简单的方式,带子模块一起克隆
git clone --recurse-submodules repository-url
# 更新子模块
git submodule update -remote 3rdparty/submodule
# 查看使用commit id
git submodule status
# 提交主工程中对submodule的修改
submoudle
本身就是git
仓库,有.git
文件,所以只需切入子模块中
cd third_party/spdlog
git add test.cpp
git commit -m "master"
git push
cd ../../
提交后,需在main project
中更新对应的子模块符号即可。
# 删除main project
中已有的submoudle
rm -rf path/to/submodule
# 编辑.gitsubmodule文件
vim .gitmodules
# 编辑.git/config文件
vim .git/config
# 删除submodule的Git缓存
git rm --cached path/to/submodule
# 提交修改
git commit -m "Remove submodule: path/to/submodule"