如何在未安装 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 > patchfile
,但是patch -p1 < patchfile
如果要创建存储库子路径的补丁文件,可以使用relative
选项,例如:git diff --no-prefix --relative=my/relative/path > patchfile
patch -p1 < patchfile
不需要安装 git。第一个命令演示了生成差异的命令,而不是应用它。
生成的补丁用于从命令中指示的分支/参考规范到当前或活动分支的更改。换句话说,你想要git diff from_branch > patchfile; git checkout from_branch; git patch -p1 < patchfile
或git diff from_branch to_branch > patchfile; ...
@PaulChechetin 正如 egor83 在 suppie 的回答中所说,它在一开始就去掉了斜线。【参考方案2】:
试试这个:
patch -p1 < patchfile
【讨论】:
-p1 参数有什么作用? 开头的斜线。见man patch @chrisjleegit 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 文件