git submodule使用记录

373 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情

导语

git中的submodule命令可以方便的帮助我们管理repo中的各个子模块(尤其是在某个子模块是另一个git repo时),本文主要记录了一些关于git submodule命令的学习记录。

使用背景

在使用github项目上进行开发时,经常需要使用别人的项目作为一个第三方模块或者子模块。一般而言,我们可以将它的所有项目内容clone下来放到对应的文件夹中,但是这种方式下一旦项目有了更新或者修改,需要自己再手动重新下载覆盖,十分麻烦。为了解决这个问题,我们可以使用git中提供的git submodule命令来方便的管理这些子模块。

添加子模块

可以使用git submodule add 命令来添加子模块,具体格式如下:

git submodule add [repository-url] [local-path]

举个例子,我们要添加两个子模块到主项目的third_party目录下,可以使用如下命令:

git submodule add https://github.com/rsocket/rsocket-cpp third_party/rsocket-cpp"
git submodule add https://github.com/facebookincubator/fizz third_party/fizz"

子模块回滚

有时,我们需要特定版本的子模块,需要将其回滚到对应的版本,

首先需要进入到对应子模块的目录,接着使用git reset回滚到指定的commit版本,以确保版本的统一性。

git reset --hard [commit-number]

子模块批量更新

使用git submodule后,对应子模块是以超链接到其对应项目的形式展示的,比如github.com/ServiceNow/… ,在这个项目中的third_party文件夹下有非常多的子模块,我们在git clone父项目时,这些子模块并没有clone到本地,因此,需要使用如下命令来进行批量更新:

git submodule update --init --recursive

git submodule update --init --recursive命令将递归的将所有子模块全部clone到主项目中。

.gitmodules文件

在使用git submodule命令添加文件后,所有的submodule都会被记录在项目目录的.gitmodules文件中。

image.png

以上面git submodule add添加的两个命令为例,该文件中的内容格式如下:

[submodule "third_party/rsocket-cpp"]
	path = third_party/rsocket-cpp
	url = https://github.com/rsocket/rsocket-cpp
[submodule "third_party/fizz"]
	path = third_party/fizz
	url = https://github.com/facebookincubator/fizz

第一行submodule后记录了子模块在该项目下的相对路径,后面path同理;最后,url字段记录了该子模块的github路径。

子模块的删除

submodule的删除略微有些繁琐:

  1. 首先,要在“.gitmodules”文件中删除相应配置信息。
  2. 然后,执行“git rm –cached ”命令将子模块所在的文件从git中删除。

执行玩以上命令后,可以在使用git submodule命令查看当前的子模块是否被删除完成。

总结

本文主要记录了笔者在使用git submodule命令时遇到的一些问题和学习记录,主要包括子模块的添加、版本回滚、批量更新和删除,希望对您有帮助。