如何在Linux中比较两个源代码树?

45

我有两个包含源文件的目录,这是我继承的项目,文档很少。如何比较这两个目录以查看它们之间的差异?


在提供了所有正确的答案之后,如果您需要任何视频帮助,我在寻找答案时发现了这个有用的视频https://www.youtube.com/watch?v=TcJkLV1EeuU。 - Vishwanath gowda k
5个回答

60

试试这个:

diff -Naur dir1/ dir2/
  • -u 选项使输出结果更易读。
  • -r 选项递归处理所有子目录。
  • 只有在您想要创建补丁文件时,-N-a 选项才是必需的。

作为对人类可读性的增强,您可以将其导入到类似 bat 的工具中,并获得差异语法高亮显示:diff -Nur dir1/ dir2/ | bat -l diff - treehead

36
您可以尝试使用Meld。它是一款出色的可视化差异工具 ;-)


非常感谢 - 我在发布问题后才发现了 Meld,它基本上可以满足我的需求。不过,如果不必将代码下载到本地机器上,而是直接在远程服务器上运行的话会更好,因为(不幸的是)它没有像 CVS 或 Subversion 一样进行版本控制。 - freakwincy
Meld让您可以查看树形结构中的差异以及文件中逐行的差异。此外,您还可以选择性地将一个目录中的更改应用于另一个目录。太棒了! - 18446744073709551615
我之前已经使用过Meld进行文件比较,但我不知道它在树形比较方面也如此出色。 - Thomas Arildsen

29
diff -u -r dirA dirB

将为您展示dirA和dirB中文件之间的统一递归差异。


这在Cygwin中也可以工作,这正是我所需要的。 - crobicha

7
您可以在shell中使用diff命令。或安装像KDiff3这样的工具。

2
+1 for KDiff3。非常适合比较目录(包括子目录等)。 - David Webb
+1 - 我曾经看过KDiff3,但由于我使用拖放功能,我没有意识到它可以进行比较。你可以拖放目录,但你需要使用打开对话框并点击“确定”才能开始比较。 - Deebster

1
使用diff命令比较目录时,一直告诉我没有差异,但我知道有差异。相反,我使用了已排序的md5sums列表,然后使用diff来比较这些文件。
find /path1/dir/ -type f -exec md5sum {} + | awk '{print $2 $1}' | sort >! path1.log
find /path2/dir/ -type f -exec md5sum {} + | awk '{print $2 $1}' | sort >! path2.log
gvimdiff path1.log path2.log

如果路径的开始部分令人头痛,那么就更改它。选择 Path1 窗口并输入以下内容:
:%s|path1|path2|g

这将在第一个文件中将所有路径1的实例替换为路径2,现在您的差异应该只显示差异。

1
我以前从没见过 >! 这个符号,它是什么意思? - Daniel Serodio
我只是假设 >! 是一个打字错误,应该是 >。这样命令和过程就有意义了。 - Jostein Kjønigsen
1
假设 >! 被更改为 >,则结果加1;我所做的另一个小变化只是将目录更改为 path1/dir 并执行 find .,这样我就不必手动更改路径名了。 - mpontillo
1
实际上,">!"是一个csh重定向符号,它将覆盖现有的文件。请参见:https://dev59.com/Jmw15IYBdhLWcg3wMpAY - Sooth
这似乎假定只有两个字段 - 即文件名不包含空格字符。有什么解决方法吗? - Tom Hale
1
@TomHale 我会使用sed来处理路径中的空格: find /path1/dir/ -type f -exec md5sum {} + | sed 's/\([^\ ]\+ \)\(.*\)/\2 \1/' | sort >! path1.log sed命令正在寻找没有空格的字符串,然后将该字符串放置在末尾,忽略所有其他空格。 - Sooth

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