【问题标题】:How to edit a diff/patch file cleanly ? Are there any patch file editors?如何干净地编辑差异/补丁文件?有补丁文件编辑器吗?
【发布时间】:2011-11-21 02:12:29
【问题描述】:

场景:我有一个完全适用于我的工作文件的补丁文件,但我不想要补丁中的所有更改。

通常,我会使用vim example.patch,删除不需要的更改并应用patch -p0 -i example.patch,但有时补丁无法完全应用,我必须重新开始。

是否有补丁文件编辑器允许用户编辑和删除部分补丁,仍然可以干净地应用?

【问题讨论】:

  • 为什么不创建第二个补丁?
  • 我这里有需要。我需要在应用之前编辑补丁文件,并且无法生成其他补丁。那么:是否有一个补丁文件编辑器允许用户编辑和/或删除部分补丁并且仍然能够干净地应用?

标签: vim editor diff patch


【解决方案1】:

如果您正在寻找非交互式解决方案,来自patchutilsrediff 可以提供帮助。

这是它的man 描述:

您可以使用rediff 来更正手动编辑的统一差异。拿一份 您要编辑的差异,并在不更改任何偏移量的情况下对其进行编辑 或计数(以“@@”开头的行)。然后运行 ​​rediff,告诉它 原始差异文件的名称和您拥有的文件的名称 已编辑,它将输出已编辑的差异文件但已更正 偏移量和计数。

提供了一个小脚本editdiff,用于编辑差异文件 就地。

当前处理的变更类型有:

  • 修改任何文件内容行的文本(当然)。
  • 添加新行插入或删除。
  • 添加、更改或删除上下文行。通过调整偏移量和/或计数来处理上下文范围内的线。
  • 添加一个大块(@@-前缀部分)。
  • 删除多个大块(@@-前缀部分)。

根据其描述,recountdiff 也可能是修复统一差异的潜在候选者。

【讨论】:

    【解决方案2】:

    您使用什么 SCM?如果使用 Git,您可以:

    • 在生成实际补丁之前,使用git add -p 仅添加部分更改。生成仅包含相关更改的较小提交是一种很好的做法(但是有些组织不喜欢这样,只允许大型提交)。

    • 如果您已经应用了补丁,则使用git add -p 将您想要保留的代码部分添加到索引中。您可以提交并丢弃其余的 (git co .) 或隐藏它 (git stash)。

    编辑(基于 git add -p 注释)

    • git add -p 允许您使用 s 选项将大块拆分为更小的部分,如果您需要更多详细信息,则需要使用 e 选项进行编辑,这将带您进入 gitconfig 编辑器,它将提供有关如何操作的说明编辑大块头。

    【讨论】:

    • 我在使用git add -p(即“手动大块编辑模式”)时遇到了这个问题,因为有时无法将差异拆分为干净的大块,并且需要进行一些手动差异编辑。跨度>
    • git add -p 的问题在于它只提供了git diff(及其底层驱动程序)提供的一小部分功能。例如,如果我想了解我在提交之前所做的更改,使用-w 标志到git diff 来忽略空白,如果我想以交互方式进行git add -p 其中一些更改,这有助于我 nil ,因为git add 没有-w。人们所做的是他们使用git diff -w ... 生成补丁文件,然后使用git apply,但这又将他们带回补丁编辑器——因为git add 无法帮助他们。
    【解决方案3】:

    如果你在 emacs 中打开一个 diff 文件并将编辑器置于“diff”模式,你实际上可以编辑补丁,它会以一种智能的方式更新大块标记。非常适合我!

    【讨论】:

    • 是的!谢谢!这样做很完美!
    • Emacs 也可以一个一个应用这些大块——你不需要删除你不想要的。
    • @DavisHerring 你能解释一下吗?
    • @young_souvlaki: C-c C-a; C-u 反向申请。您也可以M-x diff-tell-file-name 将它们应用到不同的文件中。
    • 这对我来说效果很好。我遇到的唯一问题是大块中间的更改(即,删除大块第 3 行的行删除但保留其余部分),这导致自动更新失败。为了解决这个问题,我需要调用M-x diff-split-hunk 在我想要删除的行(在本例中为大块的第 3 行)拆分大块。然后,我能够从新拆分中删除我想要的行,并且自动更新工作正常。
    【解决方案4】:

    不要手动编辑补丁文件。在你的情况下,你可以尝试一些交互式工具来应用你的补丁块,比如ipatch

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-18
      • 2012-06-19
      • 1970-01-01
      相关资源
      最近更新 更多