从git diff中排除目录

时间:2010-12-07 19:51:25

标签: git

我想知道如何从我的Git diff中排除整个目录。 (在这种情况下/规范)。我正在使用git diff命令为我们的整个软件版本创建差异。但是,规范的更改与此过程无关,只会造成令人头疼的问题。现在我知道我能做到

git diff previous_release..current_release app/

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

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

7 个答案:

答案 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

racl101添加in the comments

  

只是为了那些想要限制特定类型文件的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根目录

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