与diff进行差异对比的diff?

22

我需要知道这两个补丁是否实际上是相同的。

我有一个旧的补丁文件和一个使用Unix diff命令创建的新的补丁文件。只是通过diff命令比较这些补丁会因为创建补丁时的时间戳而导致差异。

是否有一种方法(使用diff?)可以可靠地告诉我这两个补丁是否实际上是相同的?


10
我们在您的代码差异中添加了一个差异,这样您就可以在进行差异比较时继续进行其他的差异操作。 - meder omuraliev
3
嘿,我会让你们进行差异比较,但碧昂丝有史以来是最棒的。所有时代里最棒的! - GManNickG
2
递归问题是否有徽章?应该有的。 - Mike DeSimone
@楼主,你能展示一下错误的输出吗?一个简单的方法是将该部分过滤掉。 - hhafez
3个回答

30

谢谢ephemient。这正是我需要的。 - srking
不幸的是,在进入其中之后,interdiff让我失望了。首先,它没有像diff一样的返回代码;其次,在两个大但本质上相同的补丁之间,它生成了大量不正确的差异。 - srking
哦,返回代码都是零,但如果两个差异相同,则根本不应有任何输出。这两个差异之间是否更改了任何文件名?我刚测试了interdiff在一些80KB大小、大约有20KB更改的文本文件上,它可以很好地识别出不同的差异。 - ephemient
啊,你说得对。我用vimdiff目视检查了补丁,发现顶层目录名称有微小的变化。原来Interdiff是诚实的。谢谢! - srking
你可能会发现 filterdiff --strip=[n] 很有用,可以从你的补丁中删除路径中的前导组件。 - ephemient

5
你可以将这两个补丁应用于同一份源文件的副本中,然后使用diff命令正常检查结果的差异。
补丁代表对输入文件的更改,因此如果两个补丁对输入文件产生相同的影响,则它们是相同的。补丁之间的差异直接反映在这些补丁的结果差异之中。
如果两个补丁之间存在的差异不会导致这些补丁的结果不同,则这些差异是无关紧要的。

但是如何“检查结果的差异”呢?如果我有两份相同的源代码副本(比如在两台不同机器上的同一个SVN检出),我在一台机器上应用一个补丁,在另一台机器上应用另一个补丁,然后运行 svn diff 命令,这时就会得到两个不同的差异。你所指出的“如果两个补丁对输入文件产生相同的效果,则这两个补丁是相同的”这一点是很有道理的,但问题是我们如何确定这一点呢? - dimo414

0

你可以尝试使用Beyond Compare

它可以配置为将一个或两个文件中的字符串替换为其他内容,然后在底层执行此操作。屏幕上的文件仍然看起来像存在于磁盘上,但差异是根据处理后的文件计算的。

通过这种方式,您可以将其配置为更改所有具有类似时间戳格式的文本为两个文件中共同的内容,然后只比较其他内容。

在Windows客户端中,要更改这些设置,在工具栏中有一个带有小人、躯干和头部符号的按钮,在打开的对话框中,有一个替换选项卡。


1
谢谢,但我需要一个开源工具,因为未知数量的用户将执行补丁比较。 - srking
如果你只需要找出它们是否相同,除了时间戳以外,或许你可以使用AWK、SED或类似工具来转换文件,使得时间戳相等,然后对文件运行任何类型的diff工具。 - Lasse V. Karlsen
或者补丁过程更像是“给定原始文件,使用其中一个文件打补丁,然后使用另一个文件再次打补丁,最后比较两个打补丁操作的结果”,这样实际的补丁可能包含不同的数据,但最终得到相同的结果? - Lasse V. Karlsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接