我想知道如何从我的Git diff中排除整个目录。 (在这种情况下/规范)。我正在使用git diff命令为我们的整个软件版本创建差异。但是,规范的更改与此过程无关,只会造成令人头疼的问题。现在我知道我能做到
git diff previous_release..current_release app/
这将为app目录中的所有更改创建一个diff,但不会在lib /目录中创建。有谁知道如何完成这项任务?谢谢!
编辑:我只是想清楚,我知道我可以在最后编制所有目录的参数,减去/ spec。我希望有一种方法可以真正排除命令中的单个目录。
答案 0 :(得分:265)
基于this answer,您还可以使用:
git diff previous_release..current_release -- . ':!spec'
这是一个新的git功能,允许排除某些路径。它应该比各种shell oneliners更可靠。
我在这里发帖是因为这个问题仍然是“git diff exclude path”的第一个问题。
答案 1 :(得分:124)
假设你使用了bash,并且你已经启用了扩展的globbing(shopt -s 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脚本中,以避免自己重新输入参数。
答案 2 :(得分:30)
您可以尝试取消设置lib目录中任何文件的diff属性
.gitattributes
:
lib/* -diff
只是为了那些想要限制特定类型文件的
git diff
输出的人,在特定目录及其子目录中添加,就像Webpack捆绑你的{所产生的所有JavaScript一样{1}}文件,例如,您可以将其添加到.js
:
.gitattributes
然后你没有在你的git diff输出中看到所有噪音,它只显示为:
dist/js/**/*.js -diff
更有帮助。
答案 3 :(得分:27)
如果要在git diff中指定要排除的多个路径,只需在末尾添加其他排除参数,例如:从统计信息中排除 vendor 和 bin 目录中的所有内容: -
git diff --stat previous_release..current_release -- . ':!vendor' ':!bin'
答案 4 :(得分:12)
Git diff现在接受自定义排除格式:git diff -- ':(exclude)lib/*'
如果您有大量重复的文件夹名称('/ app','/ lib'等),请小心,因为这将排除相对于当前工作目录和git根目录的文件。
答案 5 :(得分:1)
git diff
接受可选的排除
git diff -- ":(exclude)thingToExclude"
git diff -- ":(exclude)*/thingToExclude/*"
git diff -- ":(exclude)*/$1/*.png"
git diff -- ":!/\$1/"
.bash_profile
或.zshrc
gde() {
: '
git diff exclude files or folders
usage:
gde fileOrFolderNameToExclude
'
git diff -- ":!/\$1/"
}
答案 6 :(得分:-5)
git diff app lib