我有一个项目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`
+ ...
一个常见的解决方案是进入我的子模块,在名为 main-project
的新分支上提交Applied patch for main
,然后推送它。不幸的是,这是一个非常糟糕的方法,因为我正在对仅对 main
重要的 foo
进行更改。另外,当我将 foo 更新到最新版本时,我也必须挑选补丁,这会在 foo 的历史记录中引入很多噪音。
另一个解决方案是在 main
上有一个真正的补丁文件,该文件在构建之前应用于foo
。不幸的是,由于这修改了子模块内容,并且我将在 foo 上进行未提交的更改,因此这也不是一个好的解决方案。
理想的解决方案是使用 Git 跟踪我的补丁,但在顶层(例如直接在 main
上,而不是在 foo
上)。理论上,可以在 Git tree
上添加一个指向子模块位置的 blob
:
blob <sha> main.c
tree <sha> lib/
commit <sha> foo
blob <sha> foo/config.h
按照这个想法,属于foo
的修补文件config.h
将在main
上被跟踪。
怎么可能做到这一点?
最佳答案
我仍然会选择第二个选项(在 main 上有一个真正的补丁文件),但将我的构建过程调整为:
- 在子模块中复制
config.h
- 应用补丁
- 构建
- 将
config.h
恢复为其原始内容。
这样,我就可以保持子模块状态不变。
OP 在评论中添加:
But your solution is not working in a IDE, Intellisense will be confused –
正确:为此,我会在 checkout 时自动应用补丁,并在检查时通过 smudge/clean content filter driver 将其删除。 .
这样,补丁在所有 session 期间都保持不变,但会在任何 git status/diff/checkin 上消失。
但这并不理想,而且似乎没有本地 Git 方法来处理这个问题。
关于git - 是否可以从父项目修补 Git 中的子模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47562385/