没有安装Git,如何应用“git diff”补丁?

305

如果没有安装git,我的客户该如何应用由git diff创建的补丁呢? 我已经尝试使用patch命令,但它总是要求提供要打补丁的文件名。


4
如果补丁包含重命名,有人知道如何处理吗?现在的patch原生支持这个功能吗? - Paul Crowley
3
问题实际上应该是:是否有一种方法可以在没有安装Git的情况下应用git diff?如下所述,patch并不完全支持这种格式。 - Aryeh Leib Taurog
5个回答

457
git diff > patchfile

并且

patch -p1 < patchfile

虽然许多人在评论和其他答案中指出补丁不理解添加,删除和重命名,但是以下操作可以工作:git apply patchfile。如果需要处理文件的添加、删除和重命名,则没有其他选项。


编辑 2015年12月

patch 命令的最新版本(2.7,于2012年9月发布)支持“diff --git”格式的大多数特性,包括重命名、复制、权限更改和符号链接差异(尚不支持二进制差异)(发布公告)。

因此,只要使用当前/最新版本的 patch,就不需要使用 git 就能将其差异应用为补丁。


99
或者使用 git diff > patchfile,但是执行 patch -p1 < patchfile - Jakub Narębski
12
如果你想创建一个仓库子路径的补丁文件,可以使用 relative 选项,例如:git diff --no-prefix --relative=my/relative/path > patchfile - Koen.
3
patch -p1 < patchfile 命令不需要安装 Git。第一个命令是生成 diff 的命令,而不是应用 diff 的命令。您好,请问还有其他需要翻译的内容吗? - Andrey Kuznetsov
1
@PaulChechetin,正如egor83在suppie的回答中所说,它会剥离开头的斜杠。 - Andrey Kuznetsov
1
即使使用了“-p1”选项,我的Solaris补丁工具仍然要求指定要打补丁的文件。这个补丁文件中没有任何重命名等操作,只是一个简单的补丁文件。这种解决方案对我不起作用。 - Ben
显示剩余7条评论

78

试试这个:

patch -p1 < patchfile

4
“-p1”参数是用来做什么的? - chrisjlee
8
去掉开头的斜线。参见patch命令手册 - egor83
18
git diff命令的输出中包含a/b/前缀,因此使用patch -p1命令可以忽略这些前缀来应用补丁文件。 - wberry

51

使用

git apply patchfile

如有可能。

patch -p1 < patchfile 

可能有副作用。

git apply 还可以处理文件添加、删除和重命名,只要它们在 git diff 格式中描述,而这是 patch 无法做到的。最后,git apply 是一个“全部应用或全部中止”模型,即要么全部应用要么什么都不做,而 patch 可以部分地应用补丁文件,导致你的工作目录处于一种奇怪的状态。


1
+1,唯一明智的答案。此外,diff/patch无法处理符号链接,如果(例如)您要还原3.10 Linux内核补丁,则会出现问题。 - ignis
11
是的,“git apply”是最好的方法,但这个问题特别询问如何在没有安装Git的情况下应用补丁。 - Colin D Bennett
1
选项 --dry-run --verbose 对于确定是否会产生任何副作用非常有用。(使用补丁 v2.5.8) - spyle
@ignis - "git apply patchfile - ... the only sane answer..." - 这几乎是可笑的。每次 OpenSSL 开发人员发送补丁给我测试时,Git 都无法应用它。这是每一次都出现的问题。我还没有看到过这个愚蠢的工具成功应用一个补丁。 - jww

9

我使用

patch -p1 --merge < patchfile

这样,冲突可以像往常一样解决。

-25

试试这个:

$ git apply file.diff

33
没有安装Git - CB Bailey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接