如何干净地编辑差异/补丁文件?有补丁文件编辑器吗?

Posted

技术标签:

【中文标题】如何干净地编辑差异/补丁文件?有补丁文件编辑器吗?【英文标题】: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,但有时补丁无法完全应用,我必须重新开始。

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

【问题讨论】:

为什么不创建第二个补丁? 见***.com/questions/242646/use-vimdiff-with-a-diff-file 我这里有需要。我需要在应用之前编辑补丁文件,并且无法生成其他补丁。那么:是否有一个补丁文件编辑器允许用户编辑和/或删除部分补丁并且仍然能够干净地应用? 【参考方案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

【讨论】:

以上是关于如何干净地编辑差异/补丁文件?有补丁文件编辑器吗?的主要内容,如果未能解决你的问题,请参考以下文章

我的差异包含尾随空格 - 如何摆脱它?

如何可视化或格式化差异/补丁文件? [关闭]

从 git add -p 编辑大块时修复“补丁不适用”

如何编写bat文件一次性安装所有系统补丁?

编辑 git 补丁给出“您编辑的块不适用”

补丁文件和差异文件之间的区别