git submodule

本文主要介绍了在GitHub上建立submodule,以及本地仓库的建立方法。指出子模块本质是另一个代码仓库,对其修改需在对应仓库进行。还提到从远程仓库拉取代码时,父代码仓库的子模块目录可能为空,且远程子模块更新时,父代码仓库需手动拉取和提交更新。

一、 github 建立 submodule

  • github 上建立我们的 submodule。

在这里插入图片描述


二、本地仓库建立

  • 建立本地仓库。

在这里插入图片描述

  • git submodule add https://github.com/
  • 使用该命令,可以在本次仓库添加子模块(submodule)。
  • 注意:子模块本质上是另一个代码仓库,对 submodule 的修改,只能在 submodule 对应的代码仓库修改和提交,然后由父代码仓库(即我们的 git_test 代码仓库)更新它下面的 submodule 最新状态。

在这里插入图片描述

  • 父代码仓库提交 commit:更新子模块的状态。

在这里插入图片描述

  • 同时,我们注意到:git 版本库中也增加了对 submodule 模块的 git 对象库的管理。

在这里插入图片描述

  • 现在,我们在 github 上创建我们的远程仓库。
  • 然后将本地仓库的代码推送到远程仓库。

在这里插入图片描述
在这里插入图片描述

  • 然后我们回到远程仓库,可以看到
  • .gitmodules 文件记录了当前仓库的所有子模块的文件名和 url 地址。
  • 点击子模块的文件名,可以跳转到 submodule 对应的代码仓库。
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 我们删除本地仓库,然后重新从远程仓库拉取代码。
    在这里插入图片描述
  • 我们发现,从远程仓库直接拉取下来的代码,缺少了 .git/modules/git_submodules 目录。

在这里插入图片描述

  • 父代码仓库的 git_submodules/ 目录为空。

在这里插入图片描述


三、子模块需要手动拉取

1. submodele 是空的目录

git submodule update --init --recursive

在这里插入图片描述


2. submodele 是非空的目录

  • 起初父代码仓库的本地 submodule 和远程仓库的 submodule 是一致的。

在这里插入图片描述

  • 当远程仓库的 submodule 进行了新的提交,父代码仓库的 submodule 不会自动更新。

在这里插入图片描述

在这里插入图片描述

  • 使用命令:git submodule update --remote 进行 submudule 的更新。

在这里插入图片描述

  • 接着,父代码仓库还要提交 submodule 的更新。

在这里插入图片描述

  • 最后,将本地仓库上传到远程仓库。

在这里插入图片描述

<think> 我们有一系列git submodule命令,这些命令用于初始化和更新子模块。子模块允许你将一个Git仓库作为另一个Git仓库的子目录。它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立。 命令解析: 1. `git submodule init`:初始化本地配置文件中的子模块设置。具体来说,它会根据父项目的.gitmodules文件中的映射,将子模块的URL注册到本地.git/config中,但并不会检出代码。 2. `git submodule init sdk/ecn/en7529/`:只初始化指定的子模块(sdk/ecn/en7529/)。同样,它会在本地配置中注册该子模块,准备后续的更新操作。 3. `git submodule status`:显示子模块的状态。它会列出所有子模块的提交哈希、子模块路径以及当前检出提交的状态(如果子模块目录尚未初始化,则显示前缀“-”)。 4. `git submodule update sdk/ecn/en7529`:更新指定的子模块。这个命令会克隆子模块仓库(如果尚未克隆)并检出父项目中指定的提交(通常是父项目当前提交所记录的该子模块的提交)。如果已经克隆过,则更新到父项目记录的提交。 注意:在多次执行`git submodule update sdk/ecn/en7529`(如命令1996,1999,2001)时,如果父项目记录的该子模块的提交没有变化,那么多次更新并不会改变子模块的状态。如果父项目记录的提交发生了变化,那么更新操作会使子模块检出到新的提交。 整个流程通常如下: - 首次克隆父项目后,使用`git submodule init`来初始化所有子模块(或指定子模块)。 - 然后使用`git submodule update`来克隆子模块的仓库并检出正确的提交(即父项目当前提交所指向的子模块提交)。 注意:子模块的更新操作默认会检出子模块仓库的“游离HEAD”状态(即不在任何分支上),指向一个特定的提交。如果需要在子模块内进行开发,通常需要进入子模块目录并创建分支。 示例场景: 假设父项目的.gitmodules文件内容如下: [submodule "sdk/ecn/en7529"] path = sdk/ecn/en7529 url = https://github.com/example/en7529.git 执行步骤: 1. 克隆父项目:git clone <父项目URL> 2. 进入项目目录:cd <父项目目录> 3. 初始化子模块:git submodule init sdk/ecn/en7529 (此时,.git/config中会记录该子模块的URL) 4. 更新子模块:git submodule update sdk/ecn/en7529 (此时,子模块仓库会被克隆到sdk/ecn/en7529目录,并检出父项目当前提交所指向的子模块提交) 如果父项目更新了子模块的提交,那么在其他地方拉取父项目后,需要再次运行`git submodule update`来更新子模块到新的提交。 注意事项: - 子模块的更新操作默认不会将子模块切换到任何分支,而是直接检出提交(即处于分离头状态)。 - 如果要修改子模块,通常需要进入子模块目录,创建并切换到分支,然后进行修改,并在父项目中记录新的子模块提交。 状态检查: `git submodule status` 的输出示例: 8e5d3a3a9c5b7f7d7f8a8b8c8d8e8f9a0b1c2d3e4 sdk/ecn/en7529 (v1.0) 前面的长字符串是子模块当前检出的提交的哈希,后面括号内是标签(如果有的话)或者分支(但通常不会显示分支,因为默认是分离头)。 如果状态前面有负号(-),表示该子模块还没有被初始化(即还没有执行update),或者子模块的提交与父项目中记录的提交不一致。 总结: 这些命令共同完成了子模块的初始化和更新操作,确保在父项目中可以引用和管理特定版本的子模块代码。 §§相关问题§§ 1. 如何添加一个新的子模块到已有的Git仓库? 2. 在更新子模块时,如何避免进入“分离头”状态? 3. 如果父项目更新了子模块的引用提交,如何同步更新本地子模块代码? 4. 如何删除一个子模块? 5. 当子模块的远程仓库URL变更时,如何更新本地配置? </think> ### Git 子模块操作命令解析 这些命令主要用于管理 Git 子模块,以下是详细解释: #### 1. `git submodule init` - **作用**:初始化本地配置文件中的子模块设置 - **具体行为**: - 读取 `.gitmodules` 文件中的子模块配置 - 在 `.git/config` 中注册子模块路径和URL - **重要特性**: - 仅配置元数据,不下载代码 - 首次使用子模块时必须执行 #### 2. `git submodule init sdk/ecn/en7529/` - **作用**:仅初始化指定路径的子模块 - **使用场景**: - 当项目包含多个子模块时 - 只需操作特定子模块 - **优势**: - 节省时间 - 避免不必要操作 #### 3. `git submodule status` - **作用**:显示所有子模块的状态信息 - **输出格式**: ``` <提交哈希> <路径> (<分支/标签>) ``` - **状态标识**: - `-` 开头:未初始化 - `+` 开头:本地修改 - `U` 开头:有冲突 #### 4. `git submodule update sdk/ecn/en7529` - **作用**:更新指定子模块到父项目记录的提交 - **执行过程**: 1. 如果未克隆 → 执行克隆 2. 检出父项目记录的提交哈希 3. 如果已克隆 → 重置到指定提交 - **关键特性**: - 使子模块与父项目版本同步 - 保证构建一致性 ### 完整工作流程 ```mermaid sequenceDiagram 用户->>Git: submodule init [路径] Git-->>配置: 注册子模块元数据 用户->>Git: submodule status Git-->>用户: 显示子模块状态 用户->>Git: submodule update [路径] Git->>子模块仓库: 克隆/检出 子模块仓库-->>Git: 代码下载 Git-->>用户: 更新完成 ``` ### 实际应用场景 1. **项目初始化**: ```bash git clone <主仓库> git submodule init git submodule update ``` 2. **子模块更新**: ```bash # 修改 .gitmodules 后 git submodule sync git submodule update --remote ``` 3. **部分更新**: ```bash git submodule init path/to/module git submodule update path/to/module ``` ### 常见问题解决方案 | 问题 | 修复命令 | |------|----------| | 子模块未初始化 | `git submodule init` | | 子模块代码过期 | `git submodule update` | | 子模块冲突 | `git submodule foreach git reset --hard` | | 错误URL配置 | `git submodule sync` |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值