我的存储库中有一个由软件程序生成的文件。
这个程序有时会重新排序文件中的行,这并不重要,因为行顺序并不重要。问题是,当执行git-diff时,很难看出任何事情是否真的发生了变化。
是否要执行不同的操作,哪些行的顺序没有被考虑?或者,如果不可能使用git-diff,您可能会想到任何shell命令?
谢谢!
发布于 2013-12-04 15:31:41
到头来,我在手动运行这个命令,然后才会知道文件是实际更改了,还是只是重新排序了一行。也许我会为它设置一个吉特钩。
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
发布于 2014-06-16 04:10:45
下面是使用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程序中的$PATH中。
GIT_EXTERNAL_DIFF=wdiff-sort git diff例如,在这里,我如何使用它来比较绑定区域文件的一系列更改:
#!/bin/bash
# path old-file old-hex old-mode new-file new-hex new-mode
#echo $*
atomize_zone="sed 's/^@//;/^\;/d;s/[[:space:]][[:space:]]*/ /g' | egrep -v '^.TTL (1D|86400)' | grep -v '; serial' | grep -v 'RR TTL' | grep -v '^.TTL 1H' | egrep -v 'IN SOA (ns1|bureau).koumbit.net' | sort -fbi"
output=$(diff -uw <(sh -c "$atomize_zone" <"$2") <(sh -c "$atomize_zone" < "$5") || true)
if [ ! -z "$output" ]; then
echo $1
cat <<EOF
$output
EOF这必须看上去完全疯狂,但它实际上工作很好,并允许清理文件以各种方式之前,扩散。
https://stackoverflow.com/questions/20377294
复制相似问题