如何在未安装 Git 的情况下应用“git diff”补丁?

Posted

技术标签:

【中文标题】如何在未安装 Git 的情况下应用“git diff”补丁?【英文标题】:How to apply `git diff` patch without Git installed? 【发布时间】:2011-03-26 00:00:21 【问题描述】:

我的客户如何在没有安装 git 的情况下应用 git diff 创建的补丁? 我曾尝试使用patch 命令,但它总是要求文件名进行修补。

【问题讨论】:

如果补丁包含重命名,有人知道怎么做吗?补丁现在原生支持吗? 问题应该是:有没有办法在没有安装 git 的情况下应用 git diff? As noted below、patch 不完全支持这种格式。 【参考方案1】:
git diff > patchfile

patch -p1 < patchfile

工作,但许多人在 cmets 和其他答案中注意到补丁不理解添加、删除和重命名。如果您需要处理文件添加、删除和重命名,除了git apply patchfile 之外别无选择。


编辑 2015 年 12 月

patch 命令的最新版本(2.7,2012 年 9 月发布)支持“diff --git”格式的大部分功能,包括重命名和复制、权限更改和符号链接差异(但还没有二进制差异)(release announcement)。

因此,如果使用patch 的当前/最新版本,则无需使用git 即可将其差异作为补丁应用。

【讨论】:

或者使用git diff &gt; patchfile,但是patch -p1 &lt; patchfile 如果要创建存储库子路径的补丁文件,可以使用relative 选项,例如:git diff --no-prefix --relative=my/relative/path &gt; patchfile patch -p1 &lt; patchfile 不需要安装 git。第一个命令演示了生成差异的命令,而不是应用它。 生成的补丁用于命令中指示的分支/参考规范当前或活动分支的更改。换句话说,你想要git diff from_branch &gt; patchfile; git checkout from_branch; git patch -p1 &lt; patchfilegit diff from_branch to_branch &gt; patchfile; ... @PaulChechetin 正如 egor83 在 suppie 的回答中所说,它在一开始就去掉了斜线。【参考方案2】:

试试这个:

patch -p1 < patchfile

【讨论】:

-p1 参数有什么作用? 开头的斜线。见man patch @chrisjlee git diff 将在输出中添加 a/b/ 前缀,因此 patch -p1 忽略那些应用补丁文件的前缀。【参考方案3】:

使用

git apply patchfile

如果可能的话。

patch -p1 < patchfile 

有潜在的副作用。

git apply 还可以处理文件添加、删除和重命名,如果它们以 git diff 格式描述,patch 不会这样做。最后,git apply 是一个“全部应用或全部中止”模型,其中要么应用所有内容,要么不应用任何内容,而 patch 可以部分应用补丁文件,使您的工作目录处于奇怪的状态。

【讨论】:

+1,唯一理智的答案。此外,diff/patch 不会处理符号链接,如果(例如)您正在恢复 3.10 Linux 内核补丁,这是一个问题。 是的,git apply 是最好的方法,但是这个问题专门询问如何应用补丁没有安装 Git 选项--dry-run --verbose 有助于确定副作用(如果有)。 (使用补丁 v2.5.8) @ignis - "git apply patchfile - ...唯一理智的答案..." - 这几乎是可笑的。每次 OpenSSL 开发人员向我发送补丁进行测试时,Git 都无法应用它。那是次。我还没有看到那个愚蠢的工具应用补丁。【参考方案4】:

我用

patch -p1 --merge < patchfile

这样,冲突可以照常解决。

【讨论】:

【参考方案5】:

试试这个:

$ git apply file.diff

【讨论】:

查看问题:“未安装 git”

以上是关于如何在未安装 Git 的情况下应用“git diff”补丁?的主要内容,如果未能解决你的问题,请参考以下文章

在未安装 .Net Framework 的情况下运行 c# 3 应用程序?

在未安装 Excel 的情况下打开、计算、关闭 MS Excel 电子表格 [EPPlus]

在未安装 chrome 的情况下启动基于 selenium 的独立 exe

config.codekit 在未选中输出/编译的情况下恢复 JS 文件

是否可以在未安装 VS 的情况下从 MSBuild 命令行运行 FxCop 代码分析?

是否可以在未安装 CUDA 驱动程序的情况下运行 CUDA 程序或库?