代码之家  ›  专栏  ›  技术社区  ›  MTA

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

  •  1
  • MTA  · 技术社区  · 10 年前

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

    目前我正在做的是:

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

    在以下情况下,如何在两个提交ID之间进行git diff:

    • 忽略文件重命名
    • 只查看java文件
    • 忽略特定文件夹名称,例如文件夹“a”和“b”
    • 执行grep“^>”|wc-l型
    1 回复  |  直到 10 年前
        1
  •  0
  •   Alfe    10 年前

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

    给定两个目录,它们在开始时相等,并且都包含,例如,1000个文件。现在,您可以重命名其中一个目录中的500个文件。重命名可能有很大差异。一个名为 foobar.txt 最初可以命名 DSC-3457.orig.jpg 之后diff命令如果不知道重命名为什么,就无法再次找到它。

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

    这意味着 全体的 要做到这一点,你会遇到很大的问题。标准工具无法做到这一点。

    这就是说,我想指出两个方面可能对你有所帮助。

    1. 文件大小

      您可以按文件大小对所有文件进行排序,然后 diff 两个目录的每一对。如果您所做的所有更改都是 只有 重命名以及所有文件的大小是否不同。如果您有几个相同大小的文件(可能是完全偶然的,或者因为它们都是相同格式的固定大小文件),那么您又遇到了麻烦,必须对每个文件进行比较 可能的 同一尺寸组的一对。

    2. Git差异

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

      编辑:可以使用如下命令 git diff --find-renames --diff-filter=ACDMTUX (也就是说,您让所有类型的更改通过过滤器,但重命名除外)。

    推荐文章