命令行递归单词差异比较?

14

有没有一个命令行程序可以给出两个目录的递归单词级别的差异(diff)?

diff -u 是递归的,但它不进行逐字逐句的比较。 wdiffdwdiff 进行基于单词的差异比较,但是它们没有内置的递归比较选项。

我希望将结果导入到 colordiff 中,所以生成输出结果可被 colordiff 解析的程序尤其有用。有什么建议吗?谢谢!

CC


这并不是真正回答你的问题(因此发布为评论),但如果你在一个带有图形界面的系统上,使用GUI diff程序可能会更容易。我发现meld(http://meld.sourceforge.net/)非常好用。 - John Bartholomew
1个回答

28

Git可以做到并输出彩色:

以下方法通常有效:

git diff --color-words path1 path2

但一般来说,您可能需要这样做

git diff --no-index --color-words path1 path2

即使两个文件都不需要在 git 仓库中,也可以进行比较!

--no-index 是必需的,如果你和路径都在一个 git 工作树中。如果你或其中一个文件在 git 工作树之外,则可以省略该参数。

手册:https://git-scm.com/docs/git-diff/1.8.5(及以后版本)

git diff --no-index [--options] [--] […​]

使用此形式可比较文件系统中给定的两条路径。当在 Git 控制的工作树中运行该命令且至少有一条路径指向工作树之外时,可以省略 --no-index 选项,或者当在 Git 控制之外的工作树中运行该命令时。


+1 - 我以前不知道可以在存储库之外的文件上使用 git diff。谢谢。 - Russell Troywest
如果两个输入都是文件,那么这是个好主意。但是如果一个输入是命令的输出呢?-不能作为使用标准输入的指令。我尝试了Bash进程替换(git diff --no-index -- <(echo foo quux baz) somefile),但显然git-diff-file不会从命名管道中读取,而是打印出类似于"contents"的pipe:[3377923]之类的东西。 - cjs
1
如果您的命令需要以文件作为输入,您可以尝试使用textconv。例如,我想运行git diff ... <(gzip -dc foo.gz) <(gzip -dc bar.gz)。我通过在.gitattributes中添加*.gz diff=gz,在.gitconfig中添加[diff "gz"] textconv=gzip -dc,并运行git diff --textconv ... foo.gz bar.gz来实现这一点。 - Ken Keys

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