是否可以从父项目修补 Git 中的子模块?

2023-12-31

我有一个项目main包含一个子模块foo。对于这个特定的项目,我想做一个小小的改变foo仅适用于该特定项目main.

main/
  + .git
  + main.c
  + lib/
  |   + bar.c
  + foo/           # My `foo` submodule
      + .git
      + config.h   # The file I want to patch from `main`
      + ...

一个常见的解决方案是进入我的子模块,进行提交Applied patch for main在一个名为的新分支上main-project,然后推动它。不幸的是,这是一个非常糟糕的方法,因为我正在对foo这只重要的是main。另外,当我更新时foo到最新版本,我也必须挑选补丁,这会在foo的历史。

另一个解决方案是拥有一个真正的patch文件于main应用于foo就在构建之前。不幸的是,因为这修改了子模块内容,并且我将在foo,所以这也不是一个好的解决方案。

理想的解决方案是使用 Git 跟踪我的补丁,但在顶层(例如直接在main, 不开foo)。理论上可以加一个blob在 Git 上tree指向子模块位置:

blob   <sha> main.c
tree   <sha> lib/
commit <sha> foo
blob   <sha> foo/config.h

有了这个想法,修补后的文件config.h属于foo将被追踪main.

怎么可能这样做呢?


我仍然会选择第二个选项(在 main 上有一个真正的补丁文件),但将我的构建过程调整为:

  • 复印一份config.h在子模块中
  • 应用补丁
  • build
  • restore config.h其原始内容。

这样,我就可以保持子模块状态不变。

OP 在评论中添加:

但你的解决方案无法在 IDE 中运行,Intellisense 会感到困惑 –

正确:为此,我会在结账时自动应用补丁,并在检查时通过污迹/清洁内容过滤器驱动程序 https://stackoverflow.com/a/40317246/6309.
这样,补丁在所有会话期间都保持不变,但会在任何 git status/diff/checkin 中消失。

但这并不理想,而且似乎没有本地 Git 方法来处理这个问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以从父项目修补 Git 中的子模块? 的相关文章

随机推荐