gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:52:36 24 4
gpt4 key购买 nike

我有一个项目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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com