如何在 Windows 上应用 diff 补丁?

有很多程序可以创建一个 diff 补丁,但是我花了很多时间尝试应用它。我想发布一个补丁,有个用户问我如何应用它。因此,我试图自己弄清楚这个问题,结果发现自己毫无头绪,而且我能找到的大多数工具都是命令行。(我可以处理命令行,但是如果没有一个友好的 GUI,很多人会迷失方向。所以这些都不适合这个目的。)

我试过用 TortoiseSVN。我有我想申请的补丁。我右键单击补丁,TortoiseSVN 子菜单下有一个选项,上面写着“应用补丁”它只会拉开一扇空窗。

所以我试着打开。它有两种选择: 合并和应用统一的差异。(幸运的是,这个补丁是统一的 diff 格式。)但是,单纯的 application 选项不起作用: 它要求提供补丁和文件夹。不知怎么的,它忘了要求 将修补程序应用到!所以 TortoiseSVN 就是不工作。是否有一个基于 Windows GUI 的实用程序,它将采取一个补丁和一个文件,并适当地应用它?

编辑: 看看到目前为止的回复,似乎 Tortoise 只会做它的权利,如果它是一个已经版本化的文件。这里的情况不是这样的。我需要能够应用补丁到一个文件,而不是来自一个 SVN 存储库。我只是尝试使用 Tortoise,因为我碰巧知道 SVN 使用 dids,并且必须知道如何创建和应用它们。

146364 次浏览

在 TortoiseSVN 中,补丁应用确实有效。您需要将补丁应用到与 创造了相同的目录。记住这一点总是很重要的。在 TortoiseSVN 中是这样做的:

右键单击要将修补程序应用到的文件夹。它将显示一个对话框,询问补丁文件的位置。选择该文件,这将打开一个小文件列表窗口,列出更改后的文件,单击每个项目应打开一个 diff 窗口,显示补丁将对该文件执行的操作。

祝你好运。

当使用 TortoiseSVN 应用补丁时,我通常将路径保存在签出存储库的根目录中。然后您应该能够右键单击补丁,转到 TortoiseSVN 菜单,并单击 ApplicyPatch。ApplicyPatch 应该自动计算出在目录层次结构中创建补丁的级别。

但是,我在过去遇到过应用包含新文件的补丁程序或涉及文件重命名的补丁程序的问题。无论乌龟使用什么算法,似乎都不能很好地处理这些情况。Unicode 可能会给您带来类似的问题。

补丁告诉它应用到哪个文件。标题应该是这样的(在记事本或者你最喜欢的文本编辑器中查看) :

--- Folder/old_file
+++ Folder/new_file

在使用 Subversion 补丁的情况下,还应该有修订号(因为文件名是相同的)。

GNU 补丁 可以让您使用 重写这些名称,但是我不知道有什么 GUI 工具可以做到这一点。我会检查各种差异程序-但是,它似乎不支持 WinMerge 应用补丁。

编辑: 看看到目前为止的回复,似乎 Tortoise 只会做它的权利,如果它是一个已经版本化的文件。这里的情况不是这样的。我需要能够应用补丁到一个文件,而不是来自一个 SVN 存储库。我之所以尝试使用 Tortoise,是因为我碰巧知道 SVN 使用 dids,并且必须知道如何创建和应用它们。

您可以安装 Cygwin,然后使用命令行 补丁工具应用补丁。另请参阅适用于 补丁这个 Unix 手册页

我知道您说过希望使用 GUI,但是命令行工具可以很好地完成这项工作。有关 Unix 工具到 Windows 的端口,请参见 GnuWin。显然,您需要补丁命令; -)

但是,您可能会遇到线路终止的问题。GnuWin 端口将假设补丁文件具有 DOS 样式的行终止(CR/LF)。尝试在一个相当智能的编辑器中打开补丁文件,它将为您转换它。

似乎在 diff/patch 文件中有 TortoiseSVN (TortoiseMerge) 要求线路 Index: foobar.py。为了使用 TortoiseSVN 的右键单击 申请补丁命令使非 TortoiseSVN 补丁文件正常工作,我需要这样做。

以前:

--- foobar.py.org   Sat May 08 16:00:56 2010
+++ foobar.py   Sat May 08 15:47:48 2010

之后:

Index: foobar.py
===================================================================
--- foobar.py
+++ foobar.py   (working copy)

或者,如果你知道你的贡献者是从哪个特定的修订版开始工作的:

Index: foobar.py
===================================================================
--- foobar.py   (revision 1157)
+++ foobar.py   (working copy)

TortoiseMerge 是与 TortoiseSVN 绑定的一个独立实用程序。

它也可以在 TortoiseDiff.zip存档中单独下载。这将允许您对没有版本控制的文件应用统一的差异。

申请补丁

与 TortoiseMerge 合并:

  1. 查找并打开一个现有的 SVN 回购目录
  2. 创建一个名为“ merge”的新目录(如果它还不存在的话)
  3. 复制要应用. patch 文件的文件
  4. 在继续下一步之前,向 svn 存储库添加和 COMMIT
  5. 右键单击合并并选择 打补丁。
  6. 双击列表中的文件
  7. 带有 diff 的修补文件显示在右窗格中
  8. 单击该窗格并单击 保存或使用 文件-> 另存为..。导出

如果从 TortoiseMerge 打开,可选屏幕。在下面的屏幕中,目录指的是上面第2步提到的“合并”目录: Screeny

WinMerge GUI 的截图: Screeny

你有两个显示器吗?我在 TortoiseMerge 上遇到了同样的问题,我意识到当我关闭一个显示器时,带有文件列表的小窗口出现了。 希望这个能帮到你。

我做 纯 Python 工具就是为了这个。它具有可预测的跨平台行为。虽然它不创建新文件(在编写本文时) ,并且缺少 GUI,但是它可以用作创建图形工具的库。

UPDATE : 如果安装了 Python,使用它应该更方便。

pip install patch
python -m patch

可以使用补丁实用程序的 这个 Win32本机端口。

随之而来的还有更多其它公用事业公司,与 Cygwin 及类似国家相比,它不需要任何 dll 或类似服务。只需选择您的微型可执行文件,并将其存储在任何您想要的地方。

简单用法:

patch.exe -i <patchfile>

寻求更多帮助:

patch.exe --help

如果您正在使用 反复无常,这是通过“导入”完成的。因此,在命令行中,使用 hg import命令,或者(您可能会发现 --no-commit选项很有用) ,或者在 Hg Workbench 中使用“ Repository”= > “ Import...”。

请注意,默认情况下,这些操作将提交更改; 如果使用命令行,则可以使用 hg import --no-commit选项避免这种情况; 如果使用 Hg Workbench,则可能会发现在合并后发出 hg rollback是有用的。

Eclipse 应该能够做到这一点,进入 TeamSynchronize 透视图,然后进入 Project-> Apply patch

如果你收到“无法工作”的错误消息,那么试着从 TortoiseMerge 对话框中选择一个目录,这是一个 SVN 的工作目录。

对于 Java 项目,我使用 NetBeans来应用补丁文件。如果您正在修补的 Java 代码尚未成为 NetBeans 项目,请为其创建一个项目。创建新项目:

  • 选择菜单 档案-> 新计划
  • 在生成的对话框中,将其设置为 Java 应用程序项目。在对话框中为其命名,然后单击 Finish
  • 右键单击项目的名称,然后从上下文菜单中选择“属性”
  • 在生成的对话框中,选择 消息来源,并向 Java 源代码添加 源文件夹.Browse。

现在您有了一个项目,应用补丁:

  • 突出显示您的项目以选择它
  • 从主菜单中,选择菜单 工具-> 申请差异补丁
  • 在生成的对话框中,浏览到补丁文件,选择它,然后按下“补丁”按钮。

就是这样。应该应用您的补丁,并且您应该看到一个显示更改的差异窗口。

用于 Windows 的 BusyBox端口同时具有 diff 和 patch 命令,但它们只支持统一格式。

我已经在使用 BeyondCompare (商业版)进行差异化和合并,这个工具也可以用 有能力来创建、查看和应用补丁。

Git 安装中的 patch.exe 实用程序可以在 Windows 10上运行。

安装 适用于 Windows 的 Git,然后使用 "C:\Program Files\Git\usr\bin\patch.exe"命令应用补丁。

如果在应用补丁期间输出中出现了任何错误消息,比如 Hunk #1 FAILED at 1 (different line endings).,请尝试添加 -l(这是 --ignore-whitespace的快捷方式)或者 --binary切换到命令行。

我用的是 http://www.msys2.org/的 MSYS2

它提供了许多实用程序,如 patchwhichgittree等等。

安装 MSYS2之后,只需运行包管理器来安装 patch:

pacman -S patch

使用:

patch -p0 < path-file.patch

请记住,只能从创建补丁的文件夹位置执行此命令。

使用 git Diff 或 linux 补丁对窗口应用补丁

使用 GNU patch 命令或 git diff 在 linux、 MacOS 或其他操作系统上创建的修补程序都可以在使用 git application 的窗口上应用。

创建补丁

例如,从2个目录中创建补丁,其中1个或多个文件已被更改:

diff -Naru original_dir modified_dir > 0001-path-file.patch

  • “-N”将不存在的文件视为空文件,只需要考虑修改后的内容
  • 将所有文件视为文本,不是强制性的,如果处理二进制补丁需要删除。
  • “-r”递归遍历目录
  • 默认情况下,“-u”在所有差异周围添加3行上下文

或者使用 git diff

git diff original_dir modified_dir > 0001-path-file.patch

然后复制。以及包含原始未更改的文件的原始 _ dir 目录。

使用 git diff:

复制父目录中的补丁文件

将 CD 放入原始目录

3使用 git application 应用补丁

copy 0001-path-file.patch ..\original_dir\
cd original_dir
git apply < 0001-path-file.patch

如果你有 在 Windows 上安装 git,你想要 为 git 存储库应用补丁程序,你可以简单地做 从 Windows 电源外壳:

git apply ..\0001-your-patch.patch

在回应前面关于补丁和 Python 3的查询时,我得到了这个错误 TypeError: 只能将 str (而不是“ byte”)连接到 str

对我来说,解决方案是在 _ norize _ filenames 函数中更改源代码:

-        debug("    target = " + p.target)
-        debug("    source = " + p.source)
+        debug("    target = ", p.target)
+        debug("    source = ", p.source)

然后补丁对我来说工作得很好(Python 3,Windows 10)