我有一个项目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(使用前将#替换为@)