git-diff:不考虑行顺序

时间:2013-12-04 13:58:24

标签: git git-diff

我的存储库中有一个由软件程序生成的文件。

此程序有时会对该文件中的行重新排序,这并不重要,因为行顺序无关紧要。问题是,当执行git-diff时,很难看出是否有任何实际改变。

无论如何都要执行不考虑行顺序的差异?或者,如果不能使用git-diff,你可能会想到任何shell命令?

谢谢!

2 个答案:

答案 0 :(得分:8)

在一天结束时,我在手动运行此命令,然后才知道文件是否实际更改了,或者只是一行重新排序。也许我会为它设置一个git hook。

diff -wB <(sort file.txt) <(git show HEAD:file.txt | sort -)

此命令将工作目录中的文件与分支的最后一次提交中的文件进行比较,而不考虑行顺序。

就我而言,我使用-w-B来忽略程序也添加的空格和行。来自man diff

   -w, --ignore-all-space
          ignore all white space
   -B, --ignore-blank-lines
          ignore changes whose lines are all blank

答案 1 :(得分:0)

这是一个非常讨厌的黑客使用DIFF_EXTERNAL_TOOL:

#!/bin/bash

# this will be called with path old-file old-hex old-mode new-file new-hex new-mode
echo $*
diff -uw <(tr -s '[[:space:]]' < "$2" | sort -fbi) <(tr -s '[[:space:]]' < "$5" | sort -fbi) || true

可以调用此方法,假设您将上述脚本放在wdiff-sort的{​​{1}}程序中:

$PATH

在这里,例如,我如何使用它来比较绑定区域文件的一堆更改:

GIT_EXTERNAL_DIFF=wdiff-sort git diff

这看起来一定非常疯狂,但实际上效果很好,并允许在传播之前以各种方式清理文件。