Git Submodule的介绍与使用

场景复现

公司有10个项目正在开发, 以后会陆陆续续增加新项目, 而这些项目都用到公共的一些类库, 如果你是技术负责人, 你会选择哪个方案?

方案一: 将公共类库依次拷贝至10个项目中 (不推荐 一旦类库需要修改, 你需要修改不只10遍)

方案二: 将公共类库封装成第三方框架, 放在公共仓库, 每个项目各自引入,(使用方便, 但是不方便修改源代码 不推荐)

方案三: 将公共类库源代码放在公有仓库, 每个项目下分别clone, ( 方便修改类库代码, 也方便同步修改,但是主工程项目会将类库代码并入主工程提交, 两个仓库独立性不够, 有时候我可能只想先pull没有类库的代码, 这个时候就不方便了)

引出Git Submodule

为了增加公共类库与主项目的独立性, Git 给大家提供了子模块功能 允许你将一个 Git 仓库作为另一个 Git 仓库的子目录 , 它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立

开始使用

添加子模块

1
git submodule add <仓库地址> <本地路径>//如果不指定本地路径 默认放在当前目录下

将子模块代码同步至远程仓库

进入到子模块目录下, 指定分支:

1
git checkout master //这里以master分支为例

然后

1
2
git commit -am "修改类库"
git push

从远程仓库更新代码

在父模块目录下执行以下命令:

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. 首先执行以下命令移除子模块引用:

    1
    git submodule deinit <submodule_path>

    其中,<submodule_path> 是子模块的相对路径或URL。这将取消子模块的连接,并使其变回普通的目录。

  2. 执行以下命令来从 .gitmodules 文件中移除子模块的记录:

    1
    git rm --cached <submodule_path>

    同样,<submodule_path> 是子模块的相对路径或 URL。该命令会将子模块的相关配置从Git仓库中移除。

  3. 执行以下命令删除子模块的相关目录和文件

    1
    2
    git rm <submodule_path>
    rm <submodule_path>

移动子模块

要将 Git 中的子模块移动到另一个目录,可以按照以下步骤进行操作:

  1. 进入包含子模块的 Git 仓库的根目录。

  2. 执行以下命令来修改子模块的路径:

    1
    git mv <current_submodule_path> <new_submodule_path>

    其中,<current_submodule_path> 是当前子模块的路径,<new_submodule_path> 是你想要将子模块移动到的新路径。该命令会将子模块在 Git 仓库中的路径更改为新路径。

  3. 修改包含子模块的父项目中 .gitmodules 文件中子模块的路径记录。打开该文件,并将与子模块相关的路径修改为新的路径。

  4. 提交代码变更:

    1
    2
    git add .gitmodules
    git commit -m "Move submodule to new directory"
  5. 更新子模块引用:

    1
    git submodule sync --recursive

    这将使父项目更新其对子模块的引用,以适应新的路径。

  6. 执行以下命令来完成子模块路径的更新:

    1
    git submodule update --init --recursive

    该命令会更新父项目中的子模块路径,并将子模块检出到新的目录中。

将本地仓库添加为子模块

如果你的本地已经有了一个仓库,并希望将其设置为某个项目的子模块,而不重新下载该仓库,可以按照以下步骤操作:

  1. 在父项目的根目录下打开命令行工具。

  2. 使用 git submodule add 命令添加子模块,但是在这里我们指定本地路径作为子模块的位置而不是远程仓库的URL。例如:

    1
    git submodule add /path/to/local/repo path/to/submodule

    /path/to/local/repo替换为你本地仓库的实际路径,path/to/submodule 替换为你希望子模块存放的相对路径(相对于父项目的根目录)。

  3. 接下来将子模块的引用地址改为远程仓库地址

    进入父项目的根目录,在命令行工具中执行以下命令来修改子模块的引用地址:

    1
    git submodule set-url <submodule_path> <remote_repository_url>

    其中 <submodule_path> 是子模块所在的路径(相对于父项目的根目录),<remote_repository_url>是子模块的远程仓库地址

  1. 运行上述命令后,Git 会将本地仓库的当前状态作为子模块的初始状态,而无需重新下载。

注意: git submodule set-url是``Git 2.25以上版本才有的功能, 使用前需要先检查一下您当前的git版本

工程克隆

团队开发的时候, 进来一个新的成员, 他首次clone项目的时候, 并不会将子模块一并clone进来

这个时候, 需要先初始化子模块:

1
2
3
4
5
# 用来初始化本地配置文件
git submodule init
# 从该项目中抓取所有数据并检出父项目中列出的合适的提交(指定的提交)。
git submodule update
(以上两条命令也可以合并成一条组合命令:git submodule update --init --recursive)

或者直接:

1
2
# clone 父仓库的时候加上 --recursive,会自动初始化并更新仓库中的每一个子模块
git clone --recursive https://gitee.com/xiaomumaozi/SubModule_Test.git

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

0%