如何在Windows上应用diff补丁?

时间:2009-02-05 18:33:45

标签: windows diff patch

有很多程序可以创建一个差异补丁,但我有一点时间试图应用一个。我正在尝试分发补丁,我从用户那里得到了一个关于如何应用补丁的问题。所以我试着自己搞清楚,发现我没有线索,我能找到的大多数工具都是命令行。 (我可以处理一个命令行,但是如果没有一个友好的,友好的GUI,很多人都会丢失。所以这些都不利于这个目的。)

我尝试过使用TortoiseSVN。我有我想申请的补丁。我右键单击补丁,在TortoiseSVN子菜单下有一个选项,上面写着“Apply patch”。所有这一切都是拉出一个空窗口。

所以我尝试了打开。它有两个选项:合并和应用统一差异。 (幸运的是,补丁采用统一的差异格式。)但是普通的apply选项不起作用:它要求补丁和文件夹。不知怎的,它忘了要求文件应用补丁!所以TortoiseSVN只是简单无效。是否有基于Windows GUI的实用程序,它将获取补丁和文件并正确应用它?

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

23 个答案:

答案 0 :(得分:31)

应用修补程序

使用TortoiseMerge:

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

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

    WinMerge GUI的屏幕截图: Screeny

答案 1 :(得分:19)

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

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

答案 2 :(得分:15)

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

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

pip install patch
python -m patch

答案 3 :(得分:15)

我知道你说你更喜欢GUI,但命令行工具可以很好地完成工作。有关Windows的unix工具端口,请参阅GnuWin。显然你需要patch命令; - )

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

答案 4 :(得分:8)

在TortoiseSVN中,补丁应用确实有效。您需要将修补程序应用于创建的目录。牢记这一点始终是非常重要的。所以这就是你在TortoiseSVN中的表现:

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

祝你好运。

答案 5 :(得分:7)

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

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

简单用法:

patch.exe -i <patchfile>

获得更多帮助:

patch.exe --help

答案 6 :(得分:4)

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的快捷方式)或{ {1}}切换到命令行。

答案 7 :(得分:2)

在diff / patch文件中看起来是TortoiseSVN(TortoiseMerge)requires the line Index: foobar.py。这就是我需要做的事情,使TortoiseSVN的右键单击 Apply Patch 命令使用非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)

答案 8 :(得分:2)

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

您可以安装Cygwin,然后使用命令行修补程序工具应用修补程序。另请参阅this Unix man page,它适用于 patch

答案 9 :(得分:1)

补丁告诉它要应用的文件。标题应该是类似的(在记事本或你的文本编辑器中查看):

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

对于Subversion补丁,您也有修订号(因为文件名相同)。

GNU patch会让你覆盖这些名称,但我不知道有任何GUI工具可以做同样的事情。我会检查各种差异程序 - 但是,WinMerge似乎不支持应用补丁程序。

答案 10 :(得分:1)

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

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

答案 11 :(得分:1)

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

答案 12 :(得分:1)

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

使用GNU patch命令或git diff在Linux,MacOS或其他任何地方创建的补丁都可以使用git apply在Windows上全部应用。

创建补丁

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

Erase spot1information

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

或使用git diff

UserForm

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

应用于git diff:

1将补丁文件复制到父目录中

2 cd进入原始目录

3使用git apply应用补丁

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

答案 13 :(得分:1)

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

  • 选择菜单文件 - &gt; 新项目
  • 在生成的对话框中,将其设为 Java Application项目。在对话框中为其命名,然后单击完成
  • 右键单击项目名称,然后从上下文菜单中选择“属性”
  • 在出现的对话框中,选择 Sources ,然后添加源文件夹。浏览到您的Java源代码。

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

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

就是这样。应该应用你的补丁,你应该看到一个显示变化的差异窗口。

答案 14 :(得分:0)

如果您在 Windows 上安装了 git 并且想要为 git 存储库应用补丁,您只需从 Windows Power Shell 执行强>:

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

答案 15 :(得分:0)

响应之前关于补丁和 Python 3 的查询,我收到了错误 类型错误:只能将 str(不是“字节”)连接到 str

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

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

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

答案 16 :(得分:0)

只需使用:

patch -p0 < path-file.patch

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

答案 17 :(得分:0)

我使用https://stackoverflow.com/a/1077051/7000599

中的MSYS2

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

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

pacman -S patch

答案 18 :(得分:0)

我已经在使用BeyondCompare(商业版)进行差异和合并,而且此工具has the capability也可用于创建,查看和应用补丁。

答案 19 :(得分:0)

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

答案 20 :(得分:0)

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

答案 21 :(得分:0)

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

答案 22 :(得分:0)

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

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