从git diff中排除一个目录

我想知道如何从我的Git diff中排除整个目录。 (在这种情况下/规格)。 我使用git diff命令为我们的整个软件版本创build一个diff。 然而,规范的变化与这个程序无关,只是令人头疼。 现在我知道我可以做

git diff previous_release..current_release app/ 

这会为app目录中的所有更改创build一个diff,但不会在lib /目录中创build。 有谁知道如何完成这个任务? 谢谢!

编辑:我只是想清楚,我知道我可以串在我的所有目录的参数结束,减/规范。 我希望有一种方法可以真正排除命令中的单个目录。

假设你使用bash,并且你已经启用了extglob,你可以从shell端处理:

 git diff previous_release current_release !(spec) 

保存你不得不列出所有其他的东西。

或者,shell不可知论者:

 git diff previous_release current_release --name-only | grep -v '^spec/' | xargs git diff previous_release current_release -- 

你可以把它包装在一个单行的shell脚本中,以免你不得不重新input参数。

基于这个答案,你也可以使用:

 git diff previous_release..current_release -- . ':!spec' 

这是一个新的gitfunction,允许排除某些path。 它应该比各种shell的线条更可靠。

我在这里发布这个,因为这个问题仍然是“git diff排除path”的#1命中。

您可以尝试取消设置lib目录中的任何文件的diff属性。
.gitattributes

 lib/* -diff 

如果你想在一个git diff中指定多个path来排除,你只需要在最后添加一个排除参数,例如,从统计中排除vendorbin目录中的所有内容:

 git diff --stat previous_release..current_release -- . ':!vendor' ':!bin' 

Git diff现在接受一个自定义排除格式: git diff -- ':(exclude)lib/*'

如果你有很多重复的文件夹名称('/ app','/ lib'等),请注意,因为这会排除相对于当前工作目录和git根目录的文件。

 git diff app lib