【问题标题】:How to patch only a particular hunk from a diff如何仅从差异中修补特定的大块
【发布时间】:2010-01-02 03:18:13
【问题描述】:

有没有办法将 diff 中的单个大块应用到文件中?例如,假设我对文件 A 和 B 进行了比较,这会产生三个差异块,每个差异都用类似...的内容表示。

@@ -971,30 +977,28 @@

...(在 unified 差异的情况下)。然后我希望能够将该差异输入标准输入,并要求补丁仅应用大块 N。

手动方法是剪切和粘贴有趣的帅哥,但我不追求那种解决方案。

【问题讨论】:

  • 根据我过去的经验,将上下文差异读入编辑器并对其进行删减并不难。我并没有真正看到复杂的参数结构对 patch 的优势。您是否正在尝试做一些特别的事情来解决这个问题?
  • 这么说吧——如果补丁确实支持它——我使用它。我有一些删除 diff 语法的 vim 宏,所以还不错,但只需键入一个命令会更容易。

标签: diff patch


【解决方案1】:

filterdiff 可能会有所帮助。

它允许从一个/多个补丁文件中提取符合各种要求的补丁子集。例如,这里我们从文件unified_diff.patch中提取,适用于名称与one_file.c匹配的文件的补丁,仅适用于原始文件的第950到1050行:

filterdiff -i *one_file.c --lines=950,1050 unified_diff.patch

提取特定/范围的大块:

filterdiff --hunks=1,3,5-8,15 file.patch

从邮件消息中提取补丁:

filterdiff message-with-diff-in-the-body > file.patch

等等

【讨论】:

  • 不错,很方便。
  • 遗憾的是它没有包含在开箱即用的 Mac 上?(可从patchutils 获得)
【解决方案2】:

一些 GUI diff/patch 工具可以选择块或什至单独的行。我知道 TortoiseSVN 的 TortoiseDiff 可以这样工作。我想我见过 windiff 这样做,但我已经有一段时间没有使用它了。

就命令行工具而言,我还没有看到任何可以满足您要求的工具。

【讨论】:

  • 我在手册页中找不到任何东西,但觉得它一定存在 - 只是我找不到它。所以 - 补丁本身对此没有原生支持 - 这准确吗?
【解决方案3】:

Emacs 不仅可以智能地编辑差异(包括非常有用的拆分块操作),而且可以一次应用一个块(避免从编辑器切换到运行patch)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 2021-04-29
    相关资源
    最近更新 更多