submodule切换分支_Git 子模块 - submodule(转)

本文介绍如何使用Git子模块管理项目间的依赖关系。包括子模块的添加、克隆、更新及推送流程。此外还提供了一些子模块使用的技巧和注意事项。

有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目。 也许是第三方库,或者你 独立开发的,用于多个父项目的库。 现在问题来了:你想要把它们当做两个独立的项目,同时又想在 一个项目中使用另一个。

Git 通过子模块来解决这个问题。 子模块允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。 它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立。

开始使用子模块

git submodule add remotePath [localPath]

克隆含有子模块的项目

git clone remotePath

git submodule init # 初始化本地配置文件

git submodule update # 从该项目中抓取所有数据并检出父项目中列出的合适的提交。

在包含子模块的项目上工作

进入子模块目录中手动抓取与合并

进入子模块目录

git fetch

git merger origin/master

进入主仓库目录

直接在主仓库里抓取与合并子模块

git submodule update --remote

在子模块上工作

当我们运行 git submodule update 从子模块仓库中抓取修改时,Git 将会获得这些改动并 更新子目录中的文件,但是会将子仓库留在一个称作 “游离的 HEAD” 的状态。 这意味着没有本 地工作分支(例如 “master”)跟踪改动。 所以你做的任何改动都不会被跟踪。

git checkout stable 进入子模块并检出相应的工作分支

git submodule update --remote 从上游拉取数据

git submodule update --remote --merge 从上游拉取数据并合并

发布子模块改动

如果我们在主项目中提交并推送但并不推送子模块上的改动,其他尝试检出我们修改的人会遇到 麻烦,因为他们无法得到依赖的子模块改动。 那些改动只存在于我们本地的拷贝中。

为了确保这不会发生,你可以让 Git 在推送到主项目前检查所有子模块是否已推送。 git push 命令接受可以设置为 check 或 on-demand 的 --recurse-submodules 参数。 如果任何提交的子模块改动没有推送那么 check 选项会直接使 push 操作失败。

提交主项目时自动检测子模块是否有未提交的改动

git push --recurse-submodules=check

提交主项目时,尝试自动推送一改动的子模块

git push --recurse-submodules=on-demand

子模块技巧

子模块遍历

有一个 foreach 子模块命令,它能在每一个子模块中运行任意命令。 如果项目中包含了大量子模块,这会非常有用。

有用的别名

你可能想为其中一些命令设置别名,因为它们可能会非常长而你又不能 设置选项作为它们的默认选项。

子模块的问题

例如在有子模块的项目中切换分支可能会造成麻烦。 如果你创建一个新分支, 在其中添加一个子模块,之后切换到没有该子模块的分支上时,你仍然会有一个还未跟踪的子模块目录。

<think> 首先,用户正在询问执行以下 Git 命令的影响: - `git submodule deinit -f IoTModularPlatform_Android` - `git rm -f IoTModularPlatform_Android` 他们特别想知道这些命令是否会影响“在线模块”。 关键点: - `git submodule deinit` 用于取消注册并清理子模块。`-f` 选项强制执行操作,即使子模块包含本地修改。 - `git rm -f` 用于从 Git 的索引中删除文件(在本例中是一个子模块目录),并强制删除未跟踪的文件。 在线模块是什么意思?可能是指远程仓库或部署在服务器上的模块。由于这些命令是本地操作,它们不会直接影响远程仓库,除非用户随后推送变更。 答案结构: 1. 解释每个命令的作用。 2. 明确说明对本地和远程的影响。 3. 提供上下文:这些命令通常用于修复子模块问题,例如重新初始化失败的问题。 4. 确保回答是中文的,因为系统提示要求使用中文。 5. 结尾必须包含“§§相关问题§§”,后面紧跟 3-5 个相关问题。第一行必须完全写为“§§相关问题§§”,不能换行。 回顾之前的互动:用户一直在处理 Git 子模块问题,特别是由于路径过长和初始化失败的问题。之前的回答提供了修复步骤,包括这些命令。 对线上模块的影响: - 这些命令是本地操作。它们只会影响用户的本地仓库。 - `git submodule deinit`:从 Git 配置中移除子模块,并清理工作树。 - `git rm -f IoTModularPlatform_Android`:删除子模块目录并取消暂存。 - 如果用户随后提交这些变更并推送,将会更新主仓库以移除子模块引用。但子模块的远程仓库本身不会受到影响。 - “线上模块”可能是指远程仓库。所以,远程仓库不会直接更改这些命令;只有推送后才会有影响。 完整回答: - 首先,用中文回答主要问题。 - 然后,以“§§相关问题§§”结尾,后跟 3-5 个相关问题。 相关问题思路: - 根据用户的查询和我的回答。 - 例如:如何安全地重新添加子模块?撤销操作?对协作的影响?等等。 列出相关问题: 1. 执行这些命令后如何重新添加子模块? 2. 如果意外运行了这些命令,如何恢复? 3. 这些操作是否会影响仓库中的其他贡献者? 4. 推送这些变更后远程会发生什么? 5. 在子模块修复中是否有替代方法? 确保有 3-5 个问题。 最终回答结构: 1. 对主要问题的解释。 2. 影响总结。 3. 建议。 4. §§相关问题§§ 5. 问题列表,以数字开头。 </think> ### Git 子模块操作对线上模块的影响分析 #### 命令作用解析: ```mermaid graph TD A[git submodule deinit -f IoTModularPlatform_Android] --> B[仅本地操作] A --> C[解除子模块注册] D[git rm -f IoTModularPlatform_Android] --> E[移除本地目录] D --> F[删除Git跟踪记录] ``` #### 对线上模块的影响: ✅ **不影响线上模块(远程仓库)**: 1. **纯本地操作**: - `deinit` 仅清除本地配置(`.git/config` 和 `.git/modules`) - `git rm` 仅删除工作区中的子模块目录和Git索引记录 2. **远程仓库安全**: - 子模块的远程仓库(如 `ssh://pdgerrit.tp-link.com/APP/IoTModularPlatform_Android`)不会被修改 - 其他开发者克隆的仓库不受影响 3. **需主动推送才会影响远程**: 只有执行 `git commit` + `git push` 后,主仓库的 `.gitmodules` 变更才会同步到远程 ⚠️ **潜在间接影响**: - 如果后续提交并推送删除操作,其他开发者在 `git pull` 后需手动处理子模块 - 本地未提交的代码修改会丢失(强制删除未备份时) #### 操作后恢复建议: ```bash # 若需重新添加子模块(不丢失历史) git submodule add ssh://pdgerrit.tp-link.com:29418/APP/IoTModularPlatform_Android git submodule update --init ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值