场景复现
公司有10个项目正在开发, 以后会陆陆续续增加新项目, 而这些项目都用到公共的一些类库, 如果你是技术负责人, 你会选择哪个方案?
方案一: 将公共类库依次拷贝至10个项目中 (不推荐 一旦类库需要修改, 你需要修改不只10遍)
方案二: 将公共类库封装成第三方框架, 放在公共仓库, 每个项目各自引入,(使用方便, 但是不方便修改源代码 不推荐)
方案三: 将公共类库源代码放在公有仓库, 每个项目下分别clone, ( 方便修改类库代码, 也方便同步修改,但是主工程项目会将类库代码并入主工程提交, 两个仓库独立性不够, 有时候我可能只想先pull没有类库的代码, 这个时候就不方便了)
引出Git Submodule
为了增加公共类库与主项目的独立性, Git 给大家提供了子模块功能 允许你将一个 Git 仓库作为另一个 Git 仓库的子目录 , 它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立
开始使用
添加子模块
1 | git submodule add <仓库地址> <本地路径>//如果不指定本地路径 默认放在当前目录下 |
将子模块代码同步至远程仓库
进入到子模块目录下, 指定分支:
1 | git checkout master //这里以master分支为例 |
然后
1 | git commit -am "修改类库" |
从远程仓库更新代码
在父模块目录下执行以下命令:
1 | git submodule update --remote |
或者
直接进入到子模块目录下:
1 | git pull |
两者效果都是一样的
除此之外还可以使用以下指令对多个子模块进行批量更新:
1 | git submodule foreach --recursive git pull |
或者
1 | git pull --recurse-submodules |
注意:如果你的子模块内部也包含了一个子模块, 你可以使用:
1 | git submodule foreach git submodule update |
进行遍历更新
删除子模块
首先执行以下命令移除子模块引用:
1
git submodule deinit <submodule_path>
其中,
<submodule_path>
是子模块的相对路径或URL
。这将取消子模块的连接,并使其变回普通的目录。执行以下命令来从
.gitmodules
文件中移除子模块的记录:1
git rm --cached <submodule_path>
同样,
<submodule_path>
是子模块的相对路径或 URL。该命令会将子模块的相关配置从Git
仓库中移除。执行以下命令删除子模块的相关目录和文件
1
2git rm <submodule_path>
rm <submodule_path>
移动子模块
要将 Git
中的子模块移动到另一个目录,可以按照以下步骤进行操作:
进入包含子模块的 Git 仓库的根目录。
执行以下命令来修改子模块的路径:
1
git mv <current_submodule_path> <new_submodule_path>
其中,
<current_submodule_path>
是当前子模块的路径,<new_submodule_path>
是你想要将子模块移动到的新路径。该命令会将子模块在 Git 仓库中的路径更改为新路径。修改包含子模块的父项目中
.gitmodules
文件中子模块的路径记录。打开该文件,并将与子模块相关的路径修改为新的路径。提交代码变更:
1
2git add .gitmodules
git commit -m "Move submodule to new directory"更新子模块引用:
1
git submodule sync --recursive
这将使父项目更新其对子模块的引用,以适应新的路径。
执行以下命令来完成子模块路径的更新:
1
git submodule update --init --recursive
该命令会更新父项目中的子模块路径,并将子模块检出到新的目录中。
将本地仓库添加为子模块
如果你的本地已经有了一个仓库,并希望将其设置为某个项目的子模块,而不重新下载该仓库,可以按照以下步骤操作:
在父项目的根目录下打开命令行工具。
使用
git submodule add
命令添加子模块,但是在这里我们指定本地路径作为子模块的位置而不是远程仓库的URL
。例如:1
git submodule add /path/to/local/repo path/to/submodule
将
/path/to/local/repo
替换为你本地仓库的实际路径,path/to/submodule
替换为你希望子模块存放的相对路径(相对于父项目的根目录)。接下来将子模块的引用地址改为远程仓库地址
进入父项目的根目录,在命令行工具中执行以下命令来修改子模块的引用地址:
1
git submodule set-url <submodule_path> <remote_repository_url>
其中
<submodule_path>
是子模块所在的路径(相对于父项目的根目录),<remote_repository_url>
是子模块的远程仓库地址
- 运行上述命令后,Git 会将本地仓库的当前状态作为子模块的初始状态,而无需重新下载。
注意: git submodule set-url是``Git
2.25以上版本才有的功能, 使用前需要先检查一下您当前的git
版本
工程克隆
团队开发的时候, 进来一个新的成员, 他首次clone项目的时候, 并不会将子模块一并clone进来
这个时候, 需要先初始化子模块:
1 | # 用来初始化本地配置文件 |
或者直接:
1 | # clone 父仓库的时候加上 --recursive,会自动初始化并更新仓库中的每一个子模块 |
本文为作者原创 转载时请注明出处 谢谢
乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站