git父子模块

Git 子模块是什么?

Git 子模块允许您将一个 Git 仓库(子模块)嵌入到另一个 Git 仓库(父仓库)中。这样,您可以在保持独立版本控制的同时,方便地在多个项目中共享代码。

如何添加子模块?

  1. 打开终端
  2. 导航到父仓库的根目录
    1
    cd /path/to/parent-repository
  3. 使用 git submodule add 命令添加子模块
    1
    git submodule add <子模块仓库URL> <本地路径>
    例如:
    1
    git submodule add https://github.com/username/child-repo.git child-repo
    这会在父仓库的 child-repo 目录下添加子模块。

父仓库中的子模块变更

  • 当您添加子模块时,Git 会记录子模块的当前提交哈希。
  • 当您在子模块中做出更改时,需要先在子模块目录中提交这些更改:
    1
    2
    3
    4
    cd child-repo
    git add .
    git commit -m "子模块的更改"
    git push
  • 然后,回到父仓库,提交子模块的变更:
    1
    2
    3
    4
    cd ..
    git add child-repo
    git commit -m "更新子模块"
    git push

注意事项,更新后需提交主项目变更。

当我们更新子项目后,相当于是把主项目记录的 submodule 的 commit id 给更新了,需要提交下主项目的变更。

克隆含有子模块的父仓库

一、

当克隆包含子模块的父仓库时,子模块目录默认是空的。您需要初始化并更新子模块:

  1. 克隆父仓库
    1
    git clone <父仓库URL>
  2. 初始化子模块
    1
    git submodule init
  3. 更新子模块
    1
    git submodule update
    这会拉取子模块的提交并将其检出到父仓库中指定的提交。

二、一键拉取

合并2、3步骤

1
git submodule update --init

update--init不可调换位置

更新子模块

要更新子模块,您可以:

1、一键命令

git submodule update --remote 命令用于更新子模块到其远端仓库的最新状态。这个命令会检查子模块的远端仓库,并将子模块更新到其默认分支的最新提交。默认情况下,这个命令会更新所有子模块,但你也可以指定特定的子模块进行更新。

如果子模块远程仓库是fork的,那会更新到fork的源仓库

请注意,git submodule update –remote 命令会忽略子模块的本地更改。如果你在子模块中有未提交的更改,这个命令会报错。在这种情况下,你需要先处理子模块的本地更改,然后再执行 git submodule update –remote 命令。

git submodule foreach "git pull origin main" 命令用于让所有的子模块都执行git pull origin main命令,foreach用户循环子模块

2、逐一步骤

  1. 进入子模块目录
    1
    cd child-repo
  2. 拉取最新更改
    1
    git pull
  3. 返回父仓库
    1
    cd ..
  4. 提交子模块的更新
    1
    2
    3
    git add child-repo
    git commit -m "更新子模块"
    git push

删除子模块

如果不再需要子模块,您可以:

  1. 删除子模块目录
    1
    2
    git rm --cached child-repo
    rm -rf child-repo
  2. 编辑 .gitmodules 文件,删除与子模块相关的条目。
  3. 编辑 .git/config 文件,删除与子模块相关的部分。
  4. 提交更改
    1
    2
    git commit -m "删除子模块"
    git push

注意事项

  • 子模块的使用可能会增加仓库的复杂度。
  • 确保子模块的 URL 是可访问的,以便其他人能够克隆父仓库并获取子模块。
  • 子模块的更新和维护需要额外的步骤,因为它们是独立于父仓库的。
    希望这份笔记能够帮助您更好地理解和使用 Git 子模块。如果您有任何疑问,请随时提问。