【问题标题】:Using the output of diff to create the patch使用 diff 的输出创建补丁
【发布时间】:2010-10-01 00:50:25
【问题描述】:

我有这样的事情

src/sim/simulate.cc
41d40
< #include "mem/mem-interface.h"
90,91d88
<             dram_print_stats_common(curTick/500);
<
src/mem/physical.hh
52d51
<   public:
55,56d53
<       public:
<
58a56,57
>       public:
>
61,62c60,61
<         virtual bool recvTiming(PacketPtr pkt); //baoyg
<
---

我相信这是在源代码树中使用 diff 命令创建的。我想要的是使用该输出创建补丁,并将相同的更改应用于我的源代码树。

【问题讨论】:

  • 这个问题的答案似乎都跑题了,因为它已经过编辑以显示与原始问题不同的差异格式。

标签: diff patch


【解决方案1】:

我相信diff -u oldfile newfile &gt; a.patch 是用来创建补丁文件的,尽管也可能会加入其他一些开关(-N?)。

编辑:好的,4 年后终于要解释开关的含义了:

-u 创建一个 Unified 差异。统一差异是补丁程序期望作为输入获得的差异类型。您还可以在u 之后指定一个数字(最小 3,默认为 3)以增加输出的行数。这是为了防止 3 行代码不够独特,无法仅确定程序中的一个位置。

-N 将不存在的文件视为空文件,这意味着如果其中一个文件为空(或参见下一点),它将产生大量附加内容。

另外,newfileoldfile 都可以是目录而不是单个文件。您可能希望 -r 参数递归任何子目录。

【讨论】:

    【解决方案2】:

    如果你想获得与 SVN 或 git diff 相同的补丁输出,给定两个不同的文件或文件夹:

    diff -Naur file1.cpp file2.cpp
    

    【讨论】:

    • @Neil -N 用于区分文件夹
    • @kevin 我认为这不准确;它改变了它处理空文件的方式。 (这可能只与文件夹相关 - 但是,您的评论听起来像-N 是使差异递归的原因,这实际上是-r 的重点。)跨度>
    • 它与 SVN 的明确关系如何?
    • @VictorYarema 你说得对,我认识的所有 SVC 都使用这种格式。我认为编辑后的版本现在反映了这一点。
    【解决方案3】:

    你所拥有的是一个非统一的差异。 patch 可以读取,但无法进行上下文匹配,更容易出错。

    【讨论】:

    • 那我该怎么办?手动进行更改,我有一堆或尝试使用补丁?创建补丁的正确命令是 R. Bemrose 提供的命令吗?
    • 当然要备份。然后一次将补丁应用到一个特定文件(非统一差异不会告诉它们应用到哪个文件)。 diff -u 是一个几乎通用的标准,其他选项提供了更多的健壮性和与其他系统的兼容性,正如 Andrei 指出的那样 re svn diff
    【解决方案4】:

    那个一个(部分)补丁文件,虽然如果他们为你提供一个统一的差异输出会更好。

    该补丁的主要问题是它没有提及正在修改哪些文件,并且由于没有提供上下文,因此文件必须准确,补丁将无法允许文件中的小改动。

    【讨论】:

      【解决方案5】:

      将原帖中的差异复制到名为test.patch的补丁文件中,然后运行

      patch <original file> test.patch
      

      @Sparr 和@Arafangion 指出,如果您拥有用于创建原始差异的确切原始文件,则此方法效果最佳。

      【讨论】:

        猜你喜欢
        • 2020-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-08
        • 1970-01-01
        相关资源
        最近更新 更多