我遇到必须使用补丁文件而不是签出来应用 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
。