如何通过"git apply"使 git 更改子模块提交 #



我遇到必须使用补丁文件而不是签出来应用 Git 更改的情况。该项目有一个子模块。

我试图实现的目标最好通过一个例子来解释:

  • 情况:基于提交#B1,子模块在提交#S1,一切都很干净。
  • 子模块被更改,提交为#S2
  • 我跑git diff > file.patch.该文件如下所示:

diff --git a/submodule b/submodule index S1..S2 160000 --- a/submodule +++ b/submodule @@ -1 +1 @@ -Subproject commit S1 +Subproject commit S2

  • 其他人在启动情况下仍然有 repo:base @#B1,子模块 @#S1
  • 他/她使用git apply file.patch应用我的补丁。
  • Git 不会对他们的子模块做任何事情。它仅引发以下警告:warning: unable to rmdir submodule: Directory not empty

我所期望的是子模块的跟踪信息将被更新:换句话说,我希望在这一系列步骤之后运行git status将显示:modified: submodule (new commits),然后我可以使用git submodule update提取其更改。

我已经尝试了参数和差异格式的各种组合,但没有一个导致git apply能够使子模块进入所需的状态。

git中是否可以通过应用修补程序文件来更改子模块的跟踪状态?


仅供参考,真正的背景是我正在使用Phabricator和arc,并注意到arc patch也没有arc land能够考虑子模块 - AFAIK,正是因为这个原因:该工具假设git会处理所有事情,但它没有。

git apply文档精确地描述了如何应用(或不应用(子模块补丁:

子模块

如果补丁包含对子模块的任何更改,则git apply将这些更改处理如下。

如果指定了--index(显式或隐式(,则子模块提交必须与索引完全匹配,才能应用修补程序。如果签出任何子模块,则完全忽略这些签出,即它们不需要是最新的或干净的,并且它们不会更新。

如果未指定--index,则忽略修补程序中的子模块提交,仅检查相应子目录的不存在或存在并(如果可能(更新。

请注意,-3(也拼写为--3way(表示--index,并且通常,对于应用git format-patch生成的补丁,您可能需要-3

最新更新