我如何在Windows上应用diff补丁?

有很多程序可以创build一个差异补丁,但我有一个时间试图申请一个。 我试图分发一个补丁,并从用户那里得到一个关于如何应用它的问题。 所以我试图自己弄清楚,发现我没有任何线索,我可以find的大部分工具都是命令行。 (我可以处理一个命令行,但是如果没有一个友善的GUI,很多人都会丢失,所以这些对于这个目的来说并不合适)。

我尝试使用TortoiseSVN。 我有我想要申请的补丁。 我右键单击该修补程序,并在TortoiseSVN子菜单下有一个选项,显示“应用修补程序”。 它所做的只是拉起一个空的窗口。

所以我尝试打开。 它有两个选项:合并和应用统一差异。 (补丁是统一的差异格式,幸运的是。)但申请选项只是普通不起作用:它要求补丁和文件夹。 不知怎的,它忘了要求文件来应用补丁! 所以TortoiseSVN只是普通不起作用。 是否有一个基于Windowsgraphics用户界面的实用工具,将采取补丁和文件,并正确应用它?

编辑:到目前为止看回复,似乎龟只会做正确的,如果它是一个已经版本化的文件。 情况并非如此。 我需要能够将修补程序应用于不是从SVN存储库中提取的文件。 我只是尝试使用龟,因为我碰巧知道,SVN使用差异,必须知道如何创build和应用它们。

应用补丁

用TortoiseMerge:

  1. find并打开一个现有的SVN回购目录
  2. 创build一个名为“合并”的新目录,如果它不存在
  3. 复制您想要应用.patch文件的文件
  4. 添加并提交到svn仓库,然后继续下一步
  5. 右键点击合并,然后select应用补丁…
  6. 双击列表中的文件
  7. 带有diff的修补文件显示在右侧窗格中
  8. 单击该窗格,然后点击保存或导出文件 – >另存为…

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

WinMerge GUI的屏幕截图: Screeny

TortoiseMerge是与TortoiseSVN捆绑在一起的独立工具。

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

我知道你说过你更喜欢GUI,但是命令行工具能很好地完成这项工作。 请参阅GnuWin了解Windows的unix工具的端口。 你需要补丁命令,显然;-)

不过,您可能会遇到线路terminal问题。 GnuWin端口将假定该补丁文件具有DOS风格的行终止(CR / LF)。 尝试在一个合理的智能编辑器中打开补丁文件,它会为你转换它。

我为此仅仅制作了纯Python工具 。 它具有可预测的跨平台行为。 虽然它不会创build新文件(在编写本文时)并且缺less一个GUI,但它可以作为一个库来创buildgraphics工具。

更新 :如果你安装了Python,应该更方便。

pip install patch python -m patch 

在TortoiseSVN中,补丁应用确实有效。 您需要将该补丁应用到创build的同一个目录中。 记住这一点总是很重要的。 所以这里是你如何在TortoiseSVN中做到这一点:

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

祝你好运。

您可以使用修补程序实用程序的此 Win32本机端口。

它附带了更多的其他实用程序的select,与Cygwin相似,它不需要任何DLL或类似的东西。 只要select你的微小的可执行文件,并将其存储在任何你想要的地方。

简单的用法:

 patch.exe -i <patchfile> 

获得更多帮助:

 patch.exe --help 

编辑:到目前为止回看,似乎龟只会做正确的,如果它是一个已经版本化的文件。 情况并非如此。 我需要能够将补丁应用到SVN存储库中没有的文件。 我只是尝试使用龟,因为我碰巧知道SVN使用差异,并知道如何创build和应用它们。

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

看起来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) 

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

安装Git for Windows,然后使用"C:\Program Files\Git\usr\bin\patch.exe"命令来应用修补程序。

如果有任何错误消息,如Hunk #1 FAILED at 1 (different line endings). 在应用修补程序时已经得到输出,尝试添加-l (这是--ignore-whitespace的快捷方式)或--binary切换到命令行。

该补丁告诉它要应用的文件。 头文件应该是这样的(在记事本或你喜欢的文本编辑器中查看):

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

在Subversion补丁的情况下,你也有版本号(因为文件名是相同的)。

GNU补丁会让你覆盖这些名字,但是我不知道任何GUI工具都能做到这一点。 我会检查各种差异程序 – 但是,它并没有出现WinMerge支持应用补丁。

Eclipse应该能够做到,进入TeamSynchronize透视图,然后进入Project-> Apply补丁

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

  • select菜单文件 – > 新build项目
  • 在生成的对话框中,使其成为Java应用程序项目 。 在对话框中给它一个名字,然后单击完成
  • 右键单击项目的名称,然后从上下文菜单中select“属性”
  • 在出现的对话框中,select来源 ,然后添加一个源文件夹 。 浏览到您的Java源代码。

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

  • 突出显示您的项目select它
  • 从主菜单中,select菜单工具 – > 应用差异补丁
  • 在出现的对话框中,浏览到您的修补程序文件,select它,然后按修补程序button。

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

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

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

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

然而,过去我曾经遇到过一些问题,就是应用包含新文件的修补程序,或者将文件重命名为文件。 无论Tortoise使用什么algorithm,似乎都不能很好地处理这些场景。 Unicode可以给你类似的问题。

你有两台显示器吗? 我与TortoiseMerge有同样的问题,我意识到,当我禁用其中一个监视器的小窗口与文件列表出现了。 希望这可以帮助你。

如果您收到“Not a working copy”错误消息,请尝试从SVN的工作目录TortoiseMerge对话框中select一个目录。

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

我已经在使用BeyondCompare(商业)进行差异和合并,而且这个工具也能够创build,查看和应用补丁。

我从http://www.msys2.org/使用MSYS2

它提供了许多工具,比如patchgittree等等。

安装MSYS2后,只需运行软件包pipe理器来安装patch

 pacman -S patch