如何告诉 `git diff` 使 diff 可以与 `patch -p0` 一起使用?

How to tell `git diff` to make a diff usable with `patch -p0`?

我在 git 存储库中有一个文件。我从分支 release 中检出它,对其进行编辑以修复问题,然后将其检入新分支 bugfix。我现在想制作一个捕获此编辑的差异文件。我想使用 patch -p0 将此 diff 文件应用于 release 分支的单独副本,该分支不受 git 控制。补丁后,我希望文件与我在分支 bugfix.

中的文件相匹配

我尝试使用命令 git diff release bugfix -- myfile.m4。它给了我一个 .diff 文件,开头是

index 17641f7482..2b31725fae 100644
--- a/myfile.m4
+++ b/myfile.m4
[… rest of diff elided …]

当我使用 patch -p0 将此差异应用到我的单独存储库时,它失败了。补丁无法找到路径 a/myfile.m4b/myfile.m4,因为它们当然不存在。我的源代码中没有目录 ab。请注意,如果我可以使用 patch -p1,那么 diff 将作为补丁工作。但是,由于工具限制,我无法轻松使用 patch -p1.

我希望 .diff 文件省略 a/b/ 前缀。我希望差异文件读取如下内容:

index 87641f7482..2821725fae 100644
--- myfile.m4
+++ myfile.m4
[… rest of diff elided …]

有没有办法让 git diff 产生一个没有那些不存在的路径前缀的 diff?

有一个解决方法:从 release 分支中检出文件,将其重命名为 myfile.m4.orig,然后从 bugfix分支,然后做diff -u myfile.m4.orig myfile.m4。这给了我一个差异,我可以将其与 patch -p0 一起使用。但我想避免使用人为的文件名制作单独的文件。

您可以使用 --dst-prefix=--src-prefix= 来指定目标和源前缀,我想您可以将它们设置为空字符串:

$ git diff --src-prefix= --dst-prefix= release bugfix -- myfile.m4

正如评论中指出的,您还可以使用 --no-prefix:

$ git diff --no-prefix release bugfix -- myfile.m4