git submodule update --init --recursive

最近在跑好几个模型,视频检测,物体检测,搭建mxnet时,有点问题,记录一下。

视频检测,mxnet需要用指定版本,git 切换到指定版本后,update了,但是依然提示说有些库找不到。想了想,应该是recursive没用,可我clone项目时,明明是recursive了,后来一想才明白,估计是master下的库和submodule下的库不一样了。需要在submodule下进行update --recursive. 投靠网络。

 

git submodule update --recursive
git submodule update --init --recursive

https://stackoverflow.com/questions/10168449/git-update-submodule-recursive

 
 


 但是后来发现这样编译时还是出问题,cuda编译不过,后来发现cub老无法checkout。编译时cuda就通过不了。后来找到另外一个连接,按照里面的指导,算是可以了,终于编译通过了,但是还是有点问题,cudnn不能用,后来我干脆把cudnn编译不用,就好了,现在可以跑了。https://stackoverflow.com/questions/30348615/git-submodule-checkout-error-fatal-reference-is-not-a-tree

git branch -d master
git fetch --all --prune
git checkout master
git fsck

转载于:https://www.cnblogs.com/jianyingzhou/p/8944463.html

<think>嗯,用户问的是“git submodule update --init --recursive”这个命令是什么意思。之前他们遇到了克隆子模块时的问题,现在可能已经解决了那个问题,现在想更深入了解这个命令的具体作用。首先,我需要回忆一下git子模块的相关知识。 子模块在git中是用来在一个项目中嵌入另一个项目的,常用于依赖管理。主项目记录子模块的特定提交,而不是直接包含代码。当用户克隆主项目后,默认不会自动拉取子模块的代码,这时候就需要用git submodule相关的命令来初始化和更新。 那“git submodule update --init --recursive”这个命令各个参数的作用是什么呢?首先,git submodule update是更新子模块到主项目记录的提交。--init参数表示如果子模块还没有初始化,就先初始化,也就是将子模块的配置写入.git/config文件。--recursive则是递归处理子模块中的子模块,这在子模块本身也包含子模块时非常有用。 用户可能是在克隆项目后,发现子模块没有正确拉取,所以需要运行这个命令。他们之前遇到了网络问题导致克隆失败,现在可能已经解决了网络问题,但需要确认如何使用正确的命令来初始化和更新子模块。这时候需要详细解释这个命令的每个部分,以及为什么需要这样做。 另外,用户可能不太清楚子模块的工作原理,比如主项目如何跟踪子模块的版本,子模块的更新流程是怎样的。需要解释清楚子模块的作用和使用场景,以及为什么在克隆后需要额外的步骤来初始化和更新子模块。 可能还需要举例子说明,比如主项目包含一个子模块,克隆主项目后,子模块目录是空的,运行这个命令后才会拉取子模块的代码。递归参数的重要性在于,如果子模块自己也有子模块,就需要递归处理,确保所有层级的依赖都被正确拉取。 用户可能还关心这个命令和其他类似命令的区别,比如git submodule initgit submodule update各自的作用,组合使用和单独使用的区别。这时候需要明确说明--init在这里的作用,以及--recursive的必要性。 总结来说,需要分步骤解释命令的各个部分,并结合用户之前的错误场景,说明在解决网络问题后,正确使用这个命令来初始化和更新子模块的重要性,以及递归处理多层子模块的必要性。同时,用简单易懂的例子帮助用户理解,避免使用过于技术化的术语,确保解释清晰明了。</think>--- ### **命令解析:`git submodule update --init --recursive`** #### 1. **核心作用** 该命令用于 **初始化和更新 Git 子模块**,包含以下操作: - **初始化子模块**(`--init`):将子模块的配置从 `.gitmodules` 文件写入本地仓库的 `.git/config`。 - **递归处理**(`--recursive`):若子模块自身也包含子模块,则逐层处理所有嵌套依赖。 - **同步到指定提交**(`update`):根据父仓库记录的提交哈希值,拉取子模块代码并切换到对应版本。 --- #### 2. **子模块是什么?** - **场景**:在项目 A 中引用另一个项目 B 的代码,但希望独立管理 B 的版本。 - **原理**: - 父仓库(项目 A)只记录子模块(项目 B)的仓库地址和 **特定提交哈希值**。 - 子模块的代码 **不直接包含在父仓库中**,需单独克隆和管理。 --- #### 3. **分步解释命令** | 参数/操作 | 功能 | 必要性 | |--------------------|----------------------------------------------------------------------|-----------------------------| | `git submodule` | 子模块管理命令入口 | 必须 | | `update` | 根据父仓库记录的提交哈希值,拉取子模块代码并切换 | 同步子模块版本的关键步骤 | | `--init` | 若子模块未初始化,自动执行 `git submodule init` | 首次克隆仓库时必须 | | `--recursive` | 递归处理子模块中的子模块(多层嵌套时需此参数) | 依赖链完整性的保障 | --- #### 4. **典型使用场景** - **克隆主仓库后首次初始化子模块**: ```bash git clone https://github.com/your_project/main_repo.git cd main_repo git submodule update --init --recursive # 拉取所有子模块代码 ``` - **子模块更新后同步到最新提交**: ```bash cd main_repo/submodule_dir git pull origin master # 在子模块内部主动更新代码 cd .. git commit -am "Update submodule" # 父仓库需提交子模块的新哈希值 ``` --- #### 5. **对比其他子模块命令** | 命令 | 作用 | 与 `update --init --recursive` 的区别 | |-------------------------------|----------------------------------------------------------------------|----------------------------------------------| | `git submodule init` | 仅将 `.gitmodules` 中的配置写入本地仓库,不拉取代码 | 缺少 `update`,不会下载子模块代码 | | `git submodule update` | 拉取代码并切换提交,但假设子模块已初始化 | 缺少 `--init`,若未初始化则失败 | | `git clone --recursive` | 克隆主仓库时直接递归拉取所有子模块 | 替代方案,但需克隆时提前指定 | --- ### **示例说明** 假设主仓库结构如下: ``` main_repo/ ├── .gitmodules # 记录子模块信息 └── modules/ └── ChibiOS # 子模块目录(初始为空) ``` 执行 `git submodule update --init --recursive` 后: 1. 读取 `.gitmodules` 中 `modules/ChibiOS` 的 URL 和路径。 2. 克隆 ChibiOS 仓库到 `modules/ChibiOS`,并切换到父仓库记录的提交。 3. 如果 ChibiOS 自身也有子模块,继续递归克隆。 --- ### **常见问题** - **为何需要手动更新子模块?** 父仓库仅跟踪子模块的特定提交,需显式操作确保代码一致性。 - **子模块代码未更新怎么办?** 运行 `git submodule update --remote` 可拉取子模块远程最新提交(需谨慎,可能破坏依赖)。 --- ### **总结** 此命令是 **多仓库协作开发的核心工具**,用于精准控制依赖版本。理解其递归初始化与更新的逻辑,可避免因依赖缺失导致的编译或运行错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值