如何在Windows上应用差异补丁?


136

有很多程序可以创建diff补丁,但是我花了很多时间尝试应用它。我正在尝试分发补丁,我从用户那里收到有关如何应用补丁的问题。因此,我试图自己弄清楚它,但发现自己毫无头绪,而且我能找到的大多数工具都是命令行工具。(我可以处理命令行,但是如果没有一个友好的,友好的GUI,很多人会迷路。因此,这样做对他们没有好处。)

我尝试使用TortoiseSVN。我有我要申请的补丁。我右键单击该补丁,TortoiseSVN子菜单下有一个选项为“应用补丁”。它所做的就是拉起一个空窗口。

所以我尝试打公开赛。它有两个选项:合并并应用统一差异。(幸运的是,补丁程序采用统一的diff格式。)但是apply选项只是简单地不起作用:它要求提供补丁程序和文件夹。不知何故,它忘记要求将补丁应用到文件了!因此,TortoiseSVN不能正常工作。是否有基于Windows GUI的实用程序,该实用程序将获取补丁程序和文件并正确地应用它?

编辑:查看到目前为止的答复,似乎Tortoise仅在它是已版本化的文件的情况下才能正确执行。事实并非如此。我需要能够将补丁应用到不是来自SVN存储库的文件。我刚刚尝试使用Tortoise,因为我碰巧知道SVN使用diff,并且必须知道如何创建和应用它们。


WinMerge的答案听起来不错,但仅说明了如何制作补丁,而不是如何应用补丁。据我所知,TortoiseHG有一种很好的方式来应用补丁,但只能应用于hg存储库中的文件。如果外部SVN TortoiseDiff无法做到这一点,我想知道是否有任何GUI工具可以做到。
沃伦·P

3
哇,您是对的,简短的答案仍然是-至少在WinMerge中。关于WinMerge的功能请求,请点击此处sourceforge.net/tracker/…–
KCD

Answers:


32

申请补丁

使用TortoiseMerge:

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

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

WinMerge GUI的屏幕截图: 筛选


@WarrenP:是的,它的确说明了如何使用TortoiseMerge应用补丁
Walter Stabosz 2012年

4
我的评论在编辑之前有意义,在编辑之后不再有意义。你困惑了吗?上方的编辑时间戳(11年3月24日)似乎不正确,因为OP自2011年10月以来已再次编辑了他的答案。我认为我的评论时间戳也有误。
沃伦·P

9
@SheriffMd您没有收到错误“ D:\ Folder不是工作副本”吗?
onmyway133

1
@SheriffMd我还收到消息“文件夹...不是工作副本”-那么,如何使用乌龟合并将补丁应用于非版本化文件?
Peter T.

1
@ onmyway133,我已将步骤改为。请参阅步骤2和步骤4。您将不会收到“不是工作副本”错误消息。
治安官

21

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

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

pip install patch
python -m patch

1
我经常使用。谢谢@techtonik。关于将其与Python3配合使用的任何消息吗?
pelson 2015年

运行具有管理权限的pip install patch以确保它能正常工作。
Vertexwahn '16

@Vertexwahn在Linux上吗?
anatoly techtonik

Python的运行无处不在-我与Windows 10进行了测试
Vertexwahn

在git补丁不起作用时在Windows 10上工作。谢谢!
sqrl0


15

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

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


说得好。没有此评论,就无法找出线路终止问题。
布莱恩(Bryan)

处理行尾的另一种方法是在命令行中添加“ --binary”选项。
BeReal82

4
这就是让我走上正轨的原因。但是,运行Windows 7或更高版本时,您需要更新patch.exe的清单,以避免每次都弹出UAC。参见本页了解操作方法:math.nist.gov/oommf/software-patchsets/patch_on_Windows7.html
Anttu 2014年

1
即使使用了UAC修复程序,GnuWin版本的修补程序也会弄乱文件安全设置。git附带的构建不会遇到任何问题。
Artfunkel

8

在TortoiseSVN中,可以应用补丁。您需要将修补程序应用到从中创建修补程序的目录。牢记这一点始终很重要。因此,在TortoiseSVN中的操作方法如下:

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

祝好运。


8
那没有帮助。目标文件不是来自SVN归档文件。(请参阅原始帖子的编辑。)
梅森·惠勒

8

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

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

如果Hunk #1 FAILED at 1 (different line endings).在应用补丁程序时在输出中出现诸如a之类的错误消息,请尝试将-l(这是的快捷方式--ignore-whitespace)或--binary开关添加到命令行中。


这个问题主要是针对不熟悉典型命令行工具的临时用户的GUI工具。如果您至少提供了一些完整的示例命令作为示例,那么您的答案将更有用。
阿尔瓦罗冈萨雷斯

与作曲家的作品在Windows 10
ecdani

7

你可以用这个补丁程序的Win32本地端口。

它与其他实用程序一起提供了更多选择,并且与Cygwin和类似程序相比,它不需要任何DLL或类似程序。只需选择您的小型可执行文件,然后将其存储在所需的位置即可。

简单用法:

patch.exe -i <patchfile>

获得更多帮助:

patch.exe --help

4
我在Windows 7上遇到了麻烦:它会打开一个新的CMD窗口,并在我尝试运行时提示您提供管理特权patch.exe
罗伊·廷克

3
修补程序可执行文件也可以在Windows的Git捆绑包中找到。
Snicksie 2014年

6
如果您在运行patch.exe时遇到问题,可以将其重命名为不包含的任何内容patch。Windows认为所有带有该词的exe patch都是可疑的。
wbond 2014年

2

编辑:查看到目前为止的答复,似乎Tortoise仅在它是已版本化的文件的情况下才能正确执行。事实并非如此。我需要能够将补丁应用到不是来自SVN存储库的文件。我刚刚尝试使用Tortoise,因为我偶然知道SVN使用差异,并且必须知道如何创建它们并应用它们。

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


4
是的,我可以。实际上,我有Cygwin。我可能也可以使您的解决方案起作用。不过,我不会让我的用户经历。您知道这些天有多少Windows用户甚至不知道命令行是什么吗?:P
梅森惠勒2009年

2

看来TortoiseSVN(TortoiseMerge)需要Index: foobar.py diff / patch文件中的行。这是我需要执行的操作,以使非TortoiseSVN补丁文件与TortoiseSVN的右键单击Apply Patch命令一起使用。

之前:

--- 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)

2

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

它提供了许多实用工具,比如patchwhichgittree,等等。

安装MSYS2之后,只需运行软件包管理器进行安装patch

pacman -S patch

这只是安装命令行工具的复杂方法。我怀疑您只阅读问题标题,而不是问题本身。:)
阿尔瓦罗·冈萨雷斯

1

该修补程序告诉它要应用的文件。标头应类似(在记事本或您的收藏夹文本编辑器中查看):

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

对于Subversion修补程序,您还将具有修订号(因为文件名相同)。

GNU修补程序将允许您覆盖这些名称,但是我不知道有任何GUI工具可以执行相同的操作。我会检查各种diff程序-但是,看来WinMerge不支持应用补丁。


不,补丁顶部没有类似的内容。您是说文件名和路径必须包含在差异本身中吗?谁想到了?如果您想将差异分发给可能在其他文件夹中安装了东西的人,该怎么办?
梅森惠勒

补丁程序的开头是这样的:--- / +++ / @@ -6,12 +6,12 @@没有文件名或其他任何内容。内置路径应该如何工作?如果我在XP上创建了补丁程序,并且有人试图在Vista上使用补丁程序(反之亦然),并且Documents文件夹的路径不同怎么办?
梅森惠勒

1
文件名相对于存储库的根目录,因此XP / Vista文件夹结构的差异无关紧要。补丁中包含文件名的原因是大多数补丁会影响多个文件。
David Z

我懂了。好的,这更有意义。大卫,感谢您清理问题!
梅森惠勒2009年


1

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

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

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

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

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


1

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


1

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

注意,这些默认情况下将提交更改。hg import --no-commit如果使用命令行或使用Hg Workbench,则可以避免使用using 选项hg rollback,合并后发出该命令可能很有用。


正是我想要的!我想知道如何避免提交。
Keshav 2014年

0

使用TortoiseSVN应用补丁程序时,通常将路径保存在检出存储库的根目录中。然后,您应该能够右键单击该修补程序,转到TortoiseSVN菜单,然后单击ApplyPatch。ApplyPatch应该自动找出在目录层次结构中的哪个级别创建了补丁。

但是,过去在应用包含新文件或涉及到文件重命名的补丁程序时遇到了问题。无论Tortoise使用哪种算法,似乎都无法很好地处理这些情况。Unicode可以给您类似的问题。


0

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



0

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.