# 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"

# 参考