从git diff中排除一个目录

我想知道如何从我的Git diff中排除整个目录(在本例中是/spec)。我正在使用git diff命令为我们整个软件版本创建一个diff。然而,规格的更改与此过程无关,只会造成头痛。现在我知道我能做到

git diff previous_release..current_release app/

这将为app目录中的所有更改创建一个差异,但不会为lib/目录中的实例创建差异。有人知道怎么完成这个任务吗?谢谢!

编辑:我只是想说清楚,我知道我可以把所有目录的参数串在末尾,减去/spec。我希望有一种方法能够真正排除命令中的单个目录。

98940 次浏览
git diff app lib

你可以尝试为lib目录下的任何文件取消设置diff属性 .gitattributes: < / p >
lib/* -diff

racl101添加在评论中:

再补充一点,对于那些想要限制特定类型文件的git diff输出的人,在特定目录及其子目录中,例如,所有由Webpack打包的.js文件生成的JavaScript,你可以将此添加到.gitattributes:

dist/js/**/*.js -diff

然后你不会在你的git diff输出中看到所有这些噪音,它只是显示为:Binary files ... differ,这更有帮助。

假设你使用bash,并且你已经启用了扩展globbing (shopt -s extglob),你可以从shell端处理它:

git diff previous_release current_release !(spec)

省得你列出所有其他事情。

或者,shell-agnostic:

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

您可以将其打包到一行shell脚本中,从而不必重新键入参数。

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

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

这是git的一个新特性,允许排除某些路径。它应该比各种shell程序更可靠。

我把这个贴在这里是因为这个问题仍然是“git diff排除路径”的头号热门。

从Git 2.13 (Q2 2017)开始,你可以用^替换!。后者不需要引用。所以你可以写成

git diff previous_release..current_release -- . :^spec

如果你想在一个git diff中指定多个路径来排除,你只需要在最后添加额外的排除参数,例如从统计数据中排除供应商箱子目录中的所有内容:-

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

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

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

相对于git根目录

git diff接受可选的exclude

git diff -- ":(exclude)thingToExclude"

您可能需要添加一些通配符

git diff -- ":(exclude)*/thingToExclude/*"

目标特定的文件类型

git diff -- ":(exclude)*/$1/*.png"

使用了一些语法糖

git diff -- ":!/\$1/"

或者为您的dotfiles添加一个小脚本

例如.bash_profile.zshrc

gde() {
: '
git diff exclude files or folders
usage:
gde fileOrFolderNameToExclude
'
git diff -- ":!/\$1/"
}