从git diff中排除目录

Mys*_*srt 157 git

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

git diff previous_release..current_release app/
Run Code Online (Sandbox Code Playgroud)

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

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

cdl*_*ard 284

根据这个答案你也可以使用:

git diff previous_release..current_release -- . ':!spec'
Run Code Online (Sandbox Code Playgroud)

这是一个新的git功能,允许排除某些路径.它应该比各种shell oneliners更可靠.

我在这里发布这个,因为这个问题仍然是"git diff exclude path"的第一个问题.

  • 也可以排除多个项目,如:`git diff previous_release current_release - .':!file_a'':!file_b'` (16认同)
  • 喜欢这个答案.如果添加选项,则在双击之前执行此操作.例如:`git diff previous_release current_release --name-status - ."!spec'` (4认同)
  • 记录的联机帮助页是“gitglossary”。 (4认同)
  • 什么对我有用`git diff --stat dev - .':/多份原件/文档/*'`._not_为我工作了什么`git diff dev --stat - .':'('Mopy/Docs/Wrye Bash General Readme.html'|'Mopy/Docs/Wrye Bash Advanced Readme.html')'`和变体 (2认同)

Cas*_*bel 130

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

git diff previous_release current_release !(spec)
Run Code Online (Sandbox Code Playgroud)

保存您必须列出所有其他东西.

或者,与shell无关:

git diff previous_release current_release --name-only | grep -v '^spec/' \
    | xargs git diff previous_release current_release --
Run Code Online (Sandbox Code Playgroud)

您可以将其包装在单线程shell脚本中,以避免自己重新键入参数.

  • PS 通配符不匹配隐藏文件,因此如果您很着迷,您可能需要添加 `.!(.|)` 来匹配除 `.` 和 `..` 之外的以 `.` 开头的所有内容。 (2认同)
  • @Graham:我相信我刚刚添加的` - `应该解决这个问题. (2认同)

Von*_*onC 33

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

lib/* -diff
Run Code Online (Sandbox Code Playgroud)

racl101 在评论中添加:

只是为了增加这一点,对于那些想要限制git diff特定类型文件输出的人,在特定目录及其子目录中,例如Webpack捆绑.js文件生成的所有JavaScript ,例如,你可以添加这个到.gitattributes:

dist/js/**/*.js -diff
Run Code Online (Sandbox Code Playgroud)

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

  • @Mystr:你可以在一个特殊的分支中设置`.gitattributes`文件,只为这种'release'diff做的;)在`current_release`之上重新启动那个特殊的分支并从那里做你的差异. (2认同)

小智 31

如果要在git diff中指定要排除的多个路径,只需在末尾添加其他排除参数,例如从统计信息中排除vendorbin目录中的所有内容: -

git diff --stat previous_release..current_release -- . ':!vendor' ':!bin'
Run Code Online (Sandbox Code Playgroud)


jas*_*ard 21

相对于git根目录

git diff 接受一个可选的排除

git diff -- ":(exclude)thingToExclude"
Run Code Online (Sandbox Code Playgroud)

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

git diff -- ":(exclude)*/thingToExclude/*"
Run Code Online (Sandbox Code Playgroud)

定位特定文件类型

git diff -- ":(exclude)*/$1/*.png"
Run Code Online (Sandbox Code Playgroud)

应用了一些语法糖

git diff -- ":!/\$1/"
Run Code Online (Sandbox Code Playgroud)

或者为您的 dotfiles 删除一个小脚本

比如.bash_profile.zshrc

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


Max*_*rty 17

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

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

  • @NicolasDermine 不,尽管你写的是等效的。路径的“包含”部分也是可选的。这就是为什么你可以对与当前路径相关的所有内容执行“git diff”,而不是要求“git diff --”。 (2认同)