文件夹之间的差异同时忽略文件名更改

diff between folders whilst ignoring filename changes

如何在终端中使用 diff 而忽略文件名的更改?

目前我正在做的是:

diff -wrN folder1 folder2 | grep '^>' | wc -l

如何在两个提交 ID 之间进行 git 区分同时:

你似乎没有意识到这个问题的难度,所以我想指出为什么这个问题如此困难。

给定两个开头相同的目录,并且都包含 1000 个文件。现在您重命名其中一个目录中的 500 个文件。重命名可能会有很大差异。原来叫foobar.txt的文件,以后可以改名为DSC-3457.orig.jpg。如果不知道什么已重命名为什么,diff 命令就无法真正再次找到它。

此外,名为 x 的文件可以重命名为 y,而名为 y 的文件可以重命名为 x。在这种情况下,这是否应该被视为仅仅是重命名,或者只是交换了两个文件的内容,甚至是值得怀疑的。

这一切都意味着在一般中你将有很大的问题来完成这个。标准工具不会开箱即用。

说到这里,我想指出两个方面,希望对您有所帮助。

  1. 文件大小

    您可以按文件大小对所有文件进行排序,然后 diff 两个目录中的每一对。如果您所做的所有更改都是 重命名并且所有文件的大小都不同,那么这可以很好地工作。如果你有几个相同大小的文件(可能是偶然的或者因为它们都是具有固定大小的相同格式),你又遇到麻烦了并且必须比较每个 possible一对相同大小的组。

  2. Git-差异

    您在标签中提到了 git-diffgit 实际上会保留记录以防文件被重命名。因此,如果您打算使用 git diff,您可以在某种程度上依赖 git 检测重命名的能力。如果在一次提交中删除文件并使用新名称添加文件,这通常会起作用。如果在一次提交中添加了一个新名称,然后在另一次提交中删除了旧版本,这将无法正常工作。在 git diff 中还有很多关于重命名的知识需要学习;请参阅 man git diff 并搜索 rename 在这种情况下,大约有十几个地方提到了这一点,所以我不会在这里自己总结。

    编辑:您可以使用像 git diff --find-renames --diff-filter=ACDMTUX 这样的命令(即,除了重命名之外,您让所有类型的更改都通过过滤器)。