146

有很多程序可以创建差异补丁,但我正在尝试应用一个。我正在尝试分发补丁,但我收到了用户关于如何应用它的问题。所以我自己想办法搞清楚,发现自己一点头绪都没有,能找到的工具大多都是命令行的。(我可以处理命令行,但是如果没有漂亮、友好的 GUI,很多人会迷失方向。所以这些对这个目的没有好处。)

我尝试使用 TortoiseSVN。我有我想应用的补丁。我右键单击补丁,在 TortoiseSVN 子菜单下有一个选项,上面写着“应用补丁”。它所做的只是打开一个空窗口。

所以我试着点击打开。它有两个选项:合并和应用统一差异。(幸运的是,补丁是统一的差异格式。)但是 apply 选项不起作用:它要求提供补丁和文件夹。不知何故,它忘记询问要应用补丁的文件!所以 TortoiseSVN 只是普通的不起作用。是否有基于 Windows GUI 的实用程序可以获取补丁和文件并正确应用它?

编辑:查看到目前为止的回复,似乎 Tortoise 只有在它是一个已经版本化的文件时才会正确。这不是这里的情况。我需要能够将补丁应用于不是来自 SVN 存储库的文件。我刚刚尝试使用 Tortoise,因为我碰巧知道 SVN 使用差异并且必须知道如何创建和应用它们。

4

23 回答 23

32

应用补丁

使用 TortoiseMerge:

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

如果您从 TortoiseMerge 打开,则另一种筛选方式。在下面的屏幕中,目录是指上面步骤 2 中提到的“合并”目录: 筛网

WinMerge GUI 截图: 筛网

于 2011-03-24T07:16:39.517 回答
21

我为此制作了纯 Python 工具。它具有可预测的跨平台行为。尽管它不创建新文件(在撰写本文时)并且缺少 GUI,但它可以用作创建图形工具的库。

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

pip install patch
python -m patch
于 2012-02-28T15:48:08.313 回答
18

TortoiseMerge是一个单独的实用程序,它与 TortoiseSVN 捆绑在一起。

它也可以在TortoiseDiff.zip存档中单独下载。这将允许您将统一差异应用于非版本化文件。

于 2010-09-28T17:17:11.587 回答
16

我知道您说过您更喜欢 GUI,但命令行工具可以很好地完成工作。请参阅GnuWin以将 unix 工具移植到 Windows。显然,您需要 patch 命令;-)

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

于 2010-04-19T11:33:12.693 回答
15

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开关添加到命令行。

于 2016-12-01T20:10:23.420 回答
7

在 TortoiseSVN 中,补丁应用确实有效。您需要将补丁应用到与创建它相同的目录。牢记这一点始终很重要。下面是您在 TortoiseSVN 中的操作方式:

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

祝你好运。

于 2009-02-05T18:42:43.913 回答
7

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

它带有更多的其他实用程序选择,与 Cygwin 和类似的相比,它不需要任何 DLL 或类似的。只需选择您选择的小型可执行文件并将其存储在您想要的任何位置。

简单用法:

patch.exe -i <patchfile>

获得更多帮助:

patch.exe --help
于 2013-01-08T14:23:05.827 回答
3

我使用来自http://www.msys2.org/的 MSYS2

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

安装 MSYS2 后,只需运行包管理器即可安装patch

pacman -S patch
于 2017-06-26T23:13:35.690 回答
2

TortoiseSVN (TortoiseMerge) 似乎需要Index: foobar.pydiff/patch 文件中的行。这是我需要做的,以使非 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)
于 2010-05-10T06:26:12.090 回答
2

编辑:查看到目前为止的回复,似乎 Tortoise 只有在它是一个已经版本化的文件时才会正确。这不是这里的情况。我需要能够将补丁应用于不是来自 SVN 存储库的文件。我刚刚尝试使用 Tortoise,因为我碰巧知道 SVN 使用差异并且必须知道如何创建和应用它们。

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

于 2009-02-05T21:05:05.453 回答
2

我已经在使用 BeyondCompare(商业)进行差异和合并,而且这个工具还具有创建、查看和应用补丁的能力。

于 2016-07-26T12:19:45.997 回答
1

如果您使用Mercurial,这是通过“导入”完成的。因此,在命令行中,hg import命令或(您可能会发现该--no-commit选项很有用)或 Hg Workbench 中的“存储库”=>“导入...”。

请注意,这些将默认提交更改;hg import --no-commit如果使用命令行,或者使用 Hg Workbench,则可以避免使用此 选项,您可能会发现hg rollback在合并后发出它很有用。

于 2013-05-08T09:07:07.730 回答
1

Eclipse应该可以做到,进入TeamSynchronize透视图,然后进入Project->Apply patch

于 2013-06-12T10:01:50.133 回答
1

补丁告诉它要应用到哪个文件。标题应该类似于(在记事本或您喜欢的文本编辑器中查看):

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

在 Subversion 补丁的情况下,您也会有修订号(因为文件名相同)。

GNU 补丁将允许您覆盖这些名称,但我不知道有任何 GUI 工具可以做到这一点。我会检查各种差异程序 - 不过,WinMerge 似乎不支持应用补丁。

于 2009-02-05T18:46:43.937 回答
1

对于 Java 项目,我使用NetBeans来应用补丁文件。如果要修补的 Java 代码还不是 NetBeans 项目,请为其创建一个项目。要创建一个新项目:

  • 选择菜单文件->新建项目
  • 在出现的对话框中,将其设为 Java Application project。在对话框中为其命名,然后单击Finish
  • 右键单击项目名称,然后从上下文菜单中选择属性
  • 在出现的对话框中,选择Sources,然后添加Source Folder。浏览到您的 Java 源代码。

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

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

而已。应该应用您的补丁,并且您应该看到一个显示更改的差异窗口。

于 2014-09-12T15:19:21.110 回答
1

使用 git Diff 或 linux patch 在 windows 上使用 git diff 应用补丁

使用 GNU patch 命令或 git diff 在 linux、MacOS 或其他任何地方创建的补丁都可以使用 git apply 在 windows 上应用。

创建补丁

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

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

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

或使用 git diff

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

然后复制windows环境下的.patch文件以及包含原始未更改文件的original_dir目录。

使用 git diff 应用:

1 复制父目录下的补丁文件

2 cd 进入原目录

3 使用 git apply 应用补丁

copy 0001-path-file.patch ..\original_dir\
cd original_dir
git apply < 0001-path-file.patch
于 2020-11-17T00:06:13.973 回答
0

你有两个显示器吗?我在使用 TortoiseMerge 时遇到了同样的问题,我意识到当我禁用其中一个监视器时,会出现带有文件列表的小窗口。希望这对您有所帮助。

于 2011-07-18T21:16:41.820 回答
0

使用 TortoiseSVN 应用补丁时,我通常将路径保存在签出存储库的根目录中。然后您应该能够右键单击补丁,进入 TortoiseSVN 菜单,然后单击 ApplyPatch。ApplyPatch 应该自动确定在目录层次结构中创建补丁的哪个级别。

但是,我过去在应用包含新文件或涉及重命名文件的补丁时遇到过问题。无论 Tortoise 使用什么算法,似乎都不能很好地处理这些场景。Unicode 可以给你类似的问题。

于 2009-02-05T18:43:26.080 回答
0

如果您收到“不是工作副本”错误消息,请尝试从 TortoiseMerge 对话框中选择一个目录,该目录是 SVN 的工作目录。

于 2013-08-24T12:51:29.693 回答
0

只需使用:

patch -p0 < path-file.patch

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

于 2017-12-13T10:26:15.047 回答
0

A BusyBox port for Windows has both a diff and patch command, but they only support unified format.

于 2015-07-25T18:37:43.607 回答
0

在响应之前关于补丁和 Python 3 的查询时,我收到错误 TypeError: can only concatenate str (not "bytes") to str

我的解决方案是在 _normalize_filenames 函数中更改源:

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

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

于 2021-04-27T16:52:42.433 回答
0

如果您在 Windows 上安装了 git并且想要为 git 存储库应用补丁,您可以简单地从 Windows Power Shell执行:

git apply ..\0001-your-patch.patch
于 2021-03-18T11:47:44.197 回答