设置子模块
配置代码仓库的子模块概述
子模块(submodule)是Git为管理仓库共用而衍生出的一个工具,用户可以通过子模块将公共仓库作为子目录包含到用户的仓库中,并能够双向同步该公共仓库的代码,借助子模块用户能将公共仓库隔离、复用,能随时拉取最新代码以及对它提交修复,能大大提高用户的团队效率。
当仓库“Test_Fir”需要包含并使用仓库“Test_Sec”(第三方库,或者用户独立开发的,用于多个父项目的库),如果想要把它们当做两个独立的项目,同时又想在“Test_Fir”中使用“Test_Sec”,可以使用Git的子模块功能。 子模块允许用户将一个Git仓库作为另一个Git仓库的子目录。 它能让用户将另一个仓库克隆到自己的仓库中,同时还保持提交的独立。
子模块将被记录在一个名叫“.gitmodules”的文件中,其中会记录子模块的信息:
[submodule "module_name"] #子模块名称 path = file_path #子模块在本仓库(父仓)中文件的存储路径。 url = repo_url #子模块(子仓库)的远程仓地址
其中,位于“file_path”目录下的源代码,将会来自“repo_url”。
约束限制
如果“Test_Fir”仓库的内容将作为“Test_Sec”仓库的子模块,操作的用户需要有“Test_Sec”仓库的“设置”权限和代码的“提交”权限,请参考配置代码仓库级的权限提前进行配置。
在Repo页面添加子模块
用户可以根据需要,选择以下任意方式添加子模块。
在Git客户端添加子模块
- 执行以下命令,添加Submodule。
git submodule add <repo> [<dir>] [-b <branch>] [<path>]
- <repo>表示要添加的子模块的远程仓库地址。
- [<dir>],可选参数,指定子模块被克隆后存放的目录名。如果省略该参数,Git将根据仓库URL自动推断出一个名称。
- [-b <branch>],可选参数,表示指定要从哪个分支检出代码。如果不指定,默认会从默认分支检出。
- [<path>],可选参数,指定在父项目的.gitmodules文件中记录的路径。如果省略该参数,则默认使用<dir>的值。
例如,执行下述命令,把WEB-INF.git仓库作为一个独立的子项目,嵌入到当前的Git项目。
git submodule add git@example.com:****/WEB-INF.git
- 执行以下命令,拉取包含submodule的仓库,即克隆一个包含子模块的Git仓库,并且自动初始化和拉取子模块的内容。
git clone <repo> [<dir>] --recursive
- git clone <repo>表示克隆指定的Git仓库到本地,<repo>表示要克隆的远程仓库的URL。
- [<dir>],可选参数,指定克隆后的仓库保存到哪个本地目录。如果省略该参数,则默认使用仓库名称作为目录名。
- --recursive,表示Git在克隆完成后,自动初始化并更新所有子模块中的内容。
例如,执行下述命令,从远程仓库克隆一个名为WEB-INF的Git仓库到本地,并且如果WEB-INF仓库有子模块,还会递归地克隆所有子模块。
git clone git@example.com:****/WEB-INF.git --recursive
- 执行以下命令,从子模块的远程仓库(即origin或用户配置的远程)拉取最新的提交、更新子模块的代码到最新提交(通常是远程默认分支的最新提交,比如main或master),此更新不会自动合并或修改父仓库的代码,只是更新子模块的引用。
git submodule update --remote
- 执行以下命令,推送更新到子库。
git push --recurse-submodules=check
- 依次执行以下命令,删除Submodule。
- 删除“.gitsubmodule”中对应submodule的条目。
- 删除“.git/config”中对应submodule的条目。
- 执行命令,删除子模块对应的文件夹。
git rm --cached {submodule_path}
填写路径时,请删除末尾的“/”。
示例:如果用户的submodule保存在“src/main/webapp/WEB-INF/”目录,则执行命令为:
git rm --cached src/main/webapp/WEB-INF
编辑子模块
用户具有代码仓的“设置”权限,即可编辑子模块,请参考配置代码仓库级的权限。
如下图所示,“子模块仓库路径”表示子仓库Git地址,单击“子模块仓库提交”,可查看子仓库的历史提交。
单击“部署密钥同步”所在列的,可以把父仓库的部署密钥同步到子仓库,同步后,子仓库将继承父仓库的部署密钥。
子模块校验结果列为存在,表示子仓库正常存在并可用。如果用户要删除此子模块,请单击“操作”列所在的。
