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

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

【问题讨论】:

  • 如果补丁包含重命名,有人知道怎么做吗?补丁现在原生支持吗?
  • 问题应该是:有没有办法在没有安装 git 的情况下应用 git diff? As noted belowpatch 不完全支持这种格式。

标签: git diff 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”
    猜你喜欢
    • 2010-12-27
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多