【问题标题】:How do I apply a diff patch on Windows?如何在 Windows 上应用差异补丁?
【发布时间】:2010-10-05 18:13:39
【问题描述】:

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

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

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

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

【问题讨论】:

  • WinMerge 的回答听起来不错,但只解释了如何制作补丁,而不是如何应用补丁。 TortoiseHG 有一个很好的方法来应用补丁,但据我所知,只适用于 hg repo 中的文件。如果外部的SVN TortoiseDiff 做不到,不知道有没有什么GUI工具可以。
  • 哇,你是对的,简短的回答仍然是否定的——至少在 WinMerge 中是这样。 WinMerge 上的功能请求在这里sourceforge.net/tracker/…
  • 它没有“忘记”请求应用补丁的文件,文件名包含在补丁文件中。

标签: windows diff gnu patch


【解决方案1】:

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

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

祝你好运。

【讨论】:

  • 这没有帮助。目标文件不是来自 SVN 存档。 (请参阅对原始帖子的编辑。)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    如果是 Subversion 补丁,您也会有修订号(因为文件名相同)。

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

    【讨论】:

    • 不,我的补丁顶部没有类似的东西。您是说文件名和路径必须包含在差异本身中吗?谁想出来的?如果您想将差异分发给可能在其他文件夹中安装了东西的人,您应该怎么做?!?
    • 补丁的开头是这样的:--- / +++ / @@ -6,12 +6,12 @@ 没有文件名或任何东西。内置路径应该如何工作?如果我在 XP 上创建了补丁并且有人试图在 Vista 上使用它(反之亦然)并且 Documents 文件夹的路径不同怎么办?
    • 文件名相对于存储库的根目录,因此 XP/Vista 文件夹结构差异无关紧要。并且补丁中有文件名的原因是大多数补丁会影响多个文件。
    • 我明白了。好吧,这更有意义。谢谢你澄清,大卫!
    • @MasonWheeler:补丁文件需要文件名行。如果您的文件没有,则它不是补丁文件(它可能是由 diff 创建的——并非所有 diff 命令行选项的组合都会创建补丁文件)
    【解决方案4】:

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

    您可以安装Cygwin,然后使用命令行patch 工具来应用补丁。另见this Unix man page,它适用于补丁

    【讨论】:

    • 是的,我可以。事实上,我有 Cygwin。我也可以使您的解决方案起作用。不过,我不会让我的用户经历这些。您知道现在有多少 Windows 用户甚至不知道命令行是什么吗? :P
    【解决方案5】:

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

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

    【讨论】:

    • 说得好。如果没有此评论,将无法弄清楚线路终止问题。
    • 另一种处理行尾的方法是在命令行中添加“--binary”选项。
    • 这让我走上了正轨。但是,在运行 Windows 7 或更新版本时,您需要更新 patch.exe 的清单以避免每次都弹出 UAC。有关操作方法,请参阅此页面:math.nist.gov/oommf/software-patchsets/patch_on_Windows7.html
    • 即使有 UAC 修复程序,GnuWin 版本的补丁程序也会弄乱文件安全设置。 git 附带的构建不会遇到任何问题。
    【解决方案6】:

    似乎 TortoiseSVN (TortoiseMerge) requires the line 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)
    

    【讨论】:

      【解决方案7】:

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

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

      【讨论】:

      • AFAIK 这不能在非版本化文件上应用补丁。
      • 将它应用到非版本控制文件时没有问题。
      • 其他人有点想:S.
      • 版本 1.8.7 给出了关于 dest 没有被版本化的错误。
      【解决方案8】:

      应用补丁

      使用 TortoiseMerge:

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

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

      WinMerge GUI 的屏幕截图:

      【讨论】:

      • @WarrenP :是的,它确实解释了如何使用 TortoiseMerge 应用补丁
      • 我的评论在编辑前有意义,在编辑后不再有意义。你还迷茫吗?上面的编辑时间戳(2011 年 3 月 24 日)似乎不正确,因为 OP 自 2011 年 10 月以来再次编辑了他的答案。我认为我评论上的时间戳也是错误的。
      • @SheriffMd 你没有收到错误“D:\Folder 不是工作副本”吗?
      • @SheriffMd 我还收到消息“文件夹...不是工作副本” - 那么,如何使用乌龟合并将补丁应用于非版本控制文件?
      • @onmyway133,我已经改写了这些步骤。请参阅第 2 步和第 4 步。您不会收到“不是工作副本”错误消息。
      【解决方案9】:

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

      【讨论】:

        【解决方案10】:

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

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

        pip install patch
        python -m patch
        

        【讨论】:

        • 我经常使用这个。谢谢@techtonik。关于让它与 Python3 一起工作的任何消息?
        • 使用管理员权限运行 pip install patch 以确保其正常工作。
        • @Vertexwahn 在 Linux 上吗?
        • Python 无处不在——我在 Windows 10 上对其进行了测试
        • 在 git 补丁不起作用时在 Windows 10 上工作。谢谢!
        【解决方案11】:

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

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

        简单用法:

        patch.exe -i <patchfile>
        

        获得更多帮助:

        patch.exe --help
        

        【讨论】:

        • 我在 Windows 7 上遇到了这个问题:当我尝试运行 patch.exe 时,它会打开一个新的 CMD 窗口并提示输入管理权限。
        • 补丁可执行文件也可以在 Git for Windows 包中找到。
        • 如果您在运行 patch.exe 时遇到问题,您可以将其重命名为不包括 patch 的任何名称。 Windows 认为所有带有 patch 字样的 exe 都是可疑的。
        【解决方案12】:

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

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

        【讨论】:

        • 正是我想要的!我想知道如何避免提交。
        【解决方案13】:

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

        【讨论】:

          【解决方案14】:

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

          【讨论】:

            【解决方案15】:

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

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

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

            • 突出显示您的项目以选择它
            • 从主菜单中,选择菜单 Tools -> Apply Diff Patch
            • 在出现的对话框中,浏览到您的补丁文件,选择它,然后按补丁按钮。

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

            【讨论】:

              【解决方案16】:

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

              【讨论】:

                【解决方案17】:

                我已经在使用 BeyondCompare(商业版)进行差异和合并,这个工具还 has the capability 用于创建、查看和应用补丁。

                【讨论】:

                  【解决方案18】:

                  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 切换到命令线。

                  【讨论】:

                  • 这个问题主要是关于一个 GUI 工具,供不熟悉典型命令行工具的临时用户使用。如果您至少提供一些完整的示例命令作为示例,您的答案会更有用。
                  • 适用于 Windows 10 中的作曲家。
                  【解决方案19】:

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

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

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

                  pacman -S patch
                  

                  【讨论】:

                  • 这只是一种安装命令行工具的复杂方式。我怀疑您只阅读了问题标题而不是问题本身。 :)
                  【解决方案20】:

                  只需使用:

                  patch -p0 < path-file.patch
                  

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

                  【讨论】:

                    【解决方案21】:

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

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

                    创建补丁

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

                    diff -Naru original_dir modified_dir &gt; 0001-path-file.patch

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

                    或者使用 git diff

                    git diff original_dir modified_dir &gt; 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
                    

                    【讨论】:

                      【解决方案22】:

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

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

                      【讨论】:

                        【解决方案23】:

                        响应早先关于补丁和 Python 3 的查询,我得到了错误 TypeError:只能将str(不是“字节”)连接到str

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

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

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

                        【讨论】:

                          猜你喜欢
                          • 2013-03-10
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2012-01-02
                          相关资源
                          最近更新 更多