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

标签 git build diff git-submodules patch

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

相关文章:

git - smartgit 删除提交并返回上一个提交

c++ - 为什么 Visual Studio 会生成这些附加文件?

linux - 我如何在 Linux 中执行单向差异?

linux - 如何处理这个补丁问题

git - 推送到远程后,如何用新提交覆盖或替换提交?

GIT:如何检查分支之间的连接?

git - 如何在 bamboo 构建过程中只 check out git 存储库的一部分?

javascript - 构建 Meteor 应用程序返回错误 : EPERM, 符号链接(symbolic link)

java - 当没有可用选项时,如何在 Eclipse 中构建 Java 项目

linux - diff 文件只比较每行的前 n 个字符