2010-08-13 248 views
2

是否有可能在git diff期间忽略某些文件?我特别感兴趣的是过滤掉Makefile.in,Makefile,configure(以及所有自动生成的废话)。Git diff忽略

+0

你可以将其全部添加到您的'.gitignore'文件;如果它们是自动生成的,将它们存储在源代码管理系统中有意义吗? – sarnold 2010-08-13 05:57:15

+0

我没有把它们存储在那里,这就是整个问题。如果我愿意,我会把他们拿出来,轻松一点。 这是上游问题。但是我需要区分两个不同的上游分支,我得到的只是这个自动生成的垃圾。几乎不可能做任何真正的比较工作。 – 2010-08-13 05:59:56

回答

5

您可以尝试将文件列表传递到git diff,并且它只会在这些文件上执行diff。

根据你的代码是如何设置,它可以是那么容易,因为:

git diff otherbranchname -- src/  # only give me diffs from src/ 

或难看/复杂的:

git diff otherbranchname -- $(git ls-files | 
    perl -lne'next if /(?:[mM]akefile(?:\.in)?|configure|whateverelse)/;print') 
# diff all files which don't match the pattern 

根据要忽略文件是否由Git在当前分支管理或不管理,您需要将git ls-files替换为find *;使用find .,并将|.git添加到Perl表达式中。

裁缝这个你认为合适的,可能使用的目录/文件名,你知道你想diff的,而不是使用git ls-filesfind

+0

哦,这只是纯粹的真棒:-D谢谢 – 2010-08-13 07:13:56

+0

未经追踪的文件将不会显示在差异,虽然 - 我会认为'ls文件'将永远是很多,除非由于某些原因,你*想*差异对于一些未跟踪的文件。 – Cascabel 2010-08-13 11:39:15

2

另一个类似的解决方案(添加到.git/config):

git mydiff 

[alias] 
    mydiff = !git diff -- $(git diff --name-only | grep -Ev "([mM]akefile|configure)") 

然后运行它

请注意git diff --name-onlygit ls-files好,因为它会传递一个较短的文件列表t git diff,因为只有被修改的文件才会被包含。使用git ls-files时,我遇到了超出大型项目中参数最大数量的麻烦。

0

至于详细here你可以使用一个exclude pathspec魔法

git diff -- . ':(exclude)Makefile*' ':(exclude)configure'