持续创作,加速成长!这是我参与「掘金日新计划 · 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文件中。
以上面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的删除略微有些繁琐:
- 首先,要在“.gitmodules”文件中删除相应配置信息。
- 然后,执行“git rm –cached ”命令将子模块所在的文件从git中删除。
执行玩以上命令后,可以在使用git submodule命令查看当前的子模块是否被删除完成。
总结
本文主要记录了笔者在使用git submodule命令时遇到的一些问题和学习记录,主要包括子模块的添加、版本回滚、批量更新和删除,希望对您有帮助。