Git 子模块是什么?
Git 子模块允许您将一个 Git 仓库(子模块)嵌入到另一个 Git 仓库(父仓库)中。这样,您可以在保持独立版本控制的同时,方便地在多个项目中共享代码。
如何添加子模块?
- 打开终端。
- 导航到父仓库的根目录:
cd /path/to/parent-repository - 使用
git submodule add命令添加子模块:
例如:git submodule add <子模块仓库URL> <本地路径>
这会在父仓库的git submodule add https://github.com/username/child-repo.git child-repochild-repo目录下添加子模块。
父仓库中的子模块变更
- 当您添加子模块时,Git 会记录子模块的当前提交哈希。
- 当您在子模块中做出更改时,需要先在子模块目录中提交这些更改:
cd child-repo git add . git commit -m "子模块的更改" git push - 然后,回到父仓库,提交子模块的变更:
cd .. git add child-repo git commit -m "更新子模块" git push
注意事项,更新后需提交主项目变更。
当我们更新子项目后,相当于是把主项目记录的 submodule 的 commit id 给更新了,需要提交下主项目的变更。
克隆含有子模块的父仓库
一、
当克隆包含子模块的父仓库时,子模块目录默认是空的。您需要初始化并更新子模块:
- 克隆父仓库:
git clone <父仓库URL> - 初始化子模块:
git submodule init - 更新子模块:
这会拉取子模块的提交并将其检出到父仓库中指定的提交。git submodule update
二、一键拉取
合并2、3步骤
git submodule update --init
update 和 --init不可调换位置
更新子模块
要更新子模块,您可以:
1、一键命令
git submodule update --remote命令用于更新子模块到其远端仓库的最新状态。这个命令会检查子模块的远端仓库,并将子模块更新到其默认分支的最新提交。默认情况下,这个命令会更新所有子模块,但你也可以指定特定的子模块进行更新。 {% note danger simple %}如果子模块远程仓库是fork的,那会更新到fork的源仓库{% endnote %}
请注意,git submodule update --remote 命令会忽略子模块的本地更改。如果你在子模块中有未提交的更改,这个命令会报错。在这种情况下,你需要先处理子模块的本地更改,然后再执行 git submodule update --remote 命令。
git submodule foreach "git pull origin main"命令用于让所有的子模块都执行git pull origin main命令,foreach用户循环子模块
2、逐一步骤
- 进入子模块目录:
cd child-repo - 拉取最新更改:
git pull - 返回父仓库:
cd .. - 提交子模块的更新:
git add child-repo git commit -m "更新子模块" git push
删除子模块
如果不再需要子模块,您可以:
- 删除子模块目录:
git rm --cached child-repo rm -rf child-repo - 编辑
.gitmodules文件,删除与子模块相关的条目。 - 编辑
.git/config文件,删除与子模块相关的部分。 - 提交更改:
git commit -m "删除子模块" git push
注意事项
- 子模块的使用可能会增加仓库的复杂度。
- 确保子模块的 URL 是可访问的,以便其他人能够克隆父仓库并获取子模块。
- 子模块的更新和维护需要额外的步骤,因为它们是独立于父仓库的。 希望这份笔记能够帮助您更好地理解和使用 Git 子模块。如果您有任何疑问,请随时提问。