把本地项目某个文件夹submodule化

本文记录了如何将他人项目的某部分代码作为submodule迁移到自己的项目中。在实践中遇到添加submodule时报错,通过尝试和研究找到了解决办法。首先,将他人代码克隆到新仓库并保留历史提交,然后在新仓库中创建submodule,并在指定目录下成功添加。最后,遇到提交子模块时的问题,发现需要分别提交主项目和子模块。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文章包含了git代码迁移至新仓库、git submodule

业务需求:将别人代码中的某部分的功能嵌入本项目中,经讨论如果直接拷贝所需功能代码到本项目,后续无法保证双方功能一致。结果:我们重新建一个新的仓库和他们的代码保持一致,在新的仓库中将需要的代码submodule化,之后再将submodule模块引入到我们所需的项目中。

我也没有接触过,按网上大神给出的案例实践出的报错信息和结果总结一份。

先说一下我遇到的错误
我在参考https://www.jianshu.com/p/aae191c821e6这篇文章的时候,执行第四步的时候报错信息如下:

:$ git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter app/order-embed -- --all
报错1:Found nothing to rewrite

$ git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter app/order-embed -- --all
报错2:You need to run this command from the toplevel of the working tree.

$ git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter src/app/order-embed -- --all
报错3:Rewrite b61a6fc4235566c6bd9caf0639b2de4ea9ea3ea8 (1/241) (2 seconds passed, remaining 480 predicted)    816b8f375cb654d501d0c7ed7cd3b6b273a56364
fatal: failed to unpack tree object b61a6fc4235566c6bd9caf0639b2de
### 处理 Git 子模块路径问题或配置子模块路径 当涉及到 Git 子模块的路径配置或解决问题时,可以遵循以下方式来操作: #### 1. 初始并更新子模块 在克隆仓库之后,初始和更新子模块是非常重要的一步。可以通过以下命令完成: ```bash git submodule init git submodule update ``` 这会确保所有的子模块都被正确拉取到本地目录中[^1]。 #### 2. 修改子模块路径 如果需要更改子模块的路径,可以直接编辑 `.gitmodules` 文件中的 `path` 属性。例如,假设当前子模块位于 `lib/submodule` 路径下,而希望将其移动到 `src/new_submodule_path` 下,则可以在 `.gitmodules` 文件中修改如下内容: ```ini [submodule "old_submodule"] path = src/new_submodule_path url = https://github.com/example/repo.git ``` 执行完成后,运行以下命令同步变更: ```bash git config --file=.gitmodules submodule.old_submodule.path src/new_submodule_path git submodule sync git submodule update --init src/new_submodule_path ``` #### 3. 解决子模块路径冲突 有时可能会遇到子模块路径冲突的情况,比如某个文件夹被错误地标记为子模块或者丢失了关联。此时可以尝试删除该子模块条目,并重新添加它。具体步骤如下: - 删除旧的子模块记录: ```bash git rm --cached old_submodule_path rm -rf .git/modules/old_submodule_path ``` - 添加新的子模块: ```bash git submodule add https://github.com/example/repo.git new_submodule_path ``` #### 4. 使用 WSTool 进行多层依赖管理 对于复杂的项目结构(如 ROS 工程),可能需要用到工具如 `wstool` 来管理和配置多个子模块及其路径。通过创建一个 `.rosinstall` 文件定义所有必要的包位置后,可利用以下命令实现自动设置: ```bash wstool init wstool merge https://raw.githubusercontent.com/kuka-isir/rtt_lwr/rtt_lwr-2.0/lwr_utils/config/orocos_toolchain-2.9.rosinstall wstool update -j2 ``` 上述过程能够帮助整理复杂的工作空间布局,减少手动调整子模块路径的需求[^4]。 --- #### 注意事项 - 如果发现某些子模块无法正常加载,请确认其 URL 是否有效以及网络连接状态良好。 - 对于跨平台开发环境下的 U-boot 或其他嵌入式系统构建流程来说,合理规划各组件间的相对关系同样重要[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值