Skip to content

git-grep

打印匹配模式的行

概要

'git grep' [-a | --text] [-I] [--textconv] [-i | --ignore-case] [-w | --word-regexp]
	   [-v | --invert-match] [-h|-H] [--full-name]
	   [-E | --extended-regexp] [-G | --basic-regexp]
	   [-P | --perl-regexp]
	   [-F | --fixed-strings] [-n | --line-number] [--column]
	   [-l | --files-with-matches] [-L | --files-without-match]
	   [(-O | --open-files-in-pager) [<pager>]]
	   [-z | --null]
	   [ -o | --only-matching ] [-c | --count] [--all-match] [-q | --quiet]
	   [--max-depth <depth>] [--[no-]recursive]
	   [--color[=<when>] | --no-color]
	   [--break] [--heading] [-p | --show-function]
	   [-A <post-context>] [-B <pre-context>] [-C <context>]
	   [-W | --function-context]
	   [(-m | --max-count) <num>]
	   [--threads <num>]
	   [-f <file>] [-e] <pattern>
	   [--and|--or|--not|(|)|-e <pattern>...]
	   [--recurse-submodules] [--parent-basename <basename>]
	   [ [--[no-]exclude-standard] [--cached | --untracked | --no-index] | <tree>...]
	   [--] [<pathspec>...]

描述

在工作树中的跟踪文件、索引文件中注册的 blob 或给定树对象中的 blob 中查找指定的模式。模式是一个或多个搜索表达式的列表,用换行符分隔。空字符串作为搜索表达式匹配所有行。

选项

  • --cached - 不搜索工作树中的跟踪文件,而是搜索索引文件中注册的 blob。
  • --untracked - 除了搜索工作树中的跟踪文件外,还搜索未跟踪的文件。
  • --no-index - 搜索不由 Git 管理的当前目录中的文件,或忽略当前目录由 Git 管理的事实。这与运行常规 grep(1) 工具并指定其 -r 选项非常相似,但有一些额外的好处,例如使用 pathspec 模式限制路径。 此选项不能与 --cached--untracked 一起使用。
  • --no-exclude-standard - 也搜索被忽略的文件,不遵守 .gitignore 机制。仅与 --untracked 一起使用。
  • --exclude-standard - 不注意通过 .gitignore 机制指定的被忽略文件。仅在使用 --no-index 搜索当前目录中的文件时有用。
  • --recurse-submodules - 在仓库中活动且已检出的每个子模块中递归搜索。
  • -a, --text - 将二进制文件视为文本处理。
  • --textconv - 遵守 textconv 过滤器设置。
  • --no-textconv - 不遵守 textconv 过滤器设置。这是默认值。
  • -i, --ignore-case - 忽略模式和文件之间的大小写差异。
  • -I - 不匹配二进制文件中的模式。
  • --max-depth <depth> - 对于命令行上给出的每个 <pathspec>,最多下降 <depth> 层目录。值 -1 表示无限制。
  • -r, --recursive - 与 --max-depth=-1 相同;这是默认值。
  • --no-recursive - 与 --max-depth=0 相同。
  • -w, --word-regexp - 仅在单词边界匹配模式。
  • -v, --invert-match - 选择不匹配的行。
  • -h - 默认情况下,命令显示每个匹配的文件名。-h 选项用于禁止此输出。
  • -H - 为了完整性而存在,除了覆盖命令行上先前给出的 -h 外不做任何事情。
  • --full-name - 从子目录运行时,命令通常输出相对于当前目录的路径。此选项强制输出相对于项目顶级目录的路径。
  • -E, --extended-regexp - 对模式使用 POSIX 扩展正则表达式。默认是使用基本正则表达式。
  • -G, --basic-regexp - 对模式使用 POSIX 基本正则表达式。
  • -P, --perl-regexp - 对模式使用 Perl 兼容的正则表达式。对这些类型正则表达式的支持是可选的编译时依赖项。
  • -F, --fixed-strings - 对模式使用固定字符串(不将模式解释为正则表达式)。
  • -n, --line-number - 在匹配行前加上行号。
  • --column - 在匹配行前加上从匹配行开头开始的第一个匹配的 1 索引字节偏移。
  • -l, --files-with-matches, --name-only - 不显示每个匹配的行,仅显示包含匹配的文件的名称。
  • -L, --files-without-match - 不显示每个匹配的行,仅显示不包含匹配的文件的名称。
  • -O[<pager>], --open-files-in-pager[=<pager>] - 在分页器中打开匹配的文件(不是 'grep' 的输出)。如果分页器恰好是 "less" 或 "vi",并且用户只指定了一个模式,第一个文件自动定位在第一个匹配处。
  • -z, --null - 使用 \0 作为输出中路径名的分隔符,并逐字打印它们。
  • -o, --only-matching - 仅打印匹配行的匹配(非空)部分,每个这样的部分在单独的输出行上。
  • -c, --count - 不显示每个匹配的行,而是显示匹配的行数。
  • --color[=<when>] - 显示彩色匹配。值必须是 always(默认)、never 或 auto。
  • --no-color - 关闭匹配突出显示,即使配置文件给出默认彩色输出。与 --color=never 相同。
  • --break - 在不同文件的匹配之间打印空行。
  • --heading - 在该文件的匹配上方显示文件名,而不是在每个显示行的开头。
  • -p, --show-function - 显示包含匹配函数名的前一行,除非匹配行本身是函数名。
  • -<num>, -C <num>, --context <num> - 显示 <num> 个前导和尾随行,并在连续的匹配组之间放置包含 -- 的行。
  • -A <num>, --after-context <num> - 显示 <num> 个尾随行。
  • -B <num>, --before-context <num> - 显示 <num> 个前导行。
  • -W, --function-context - 显示从包含函数名的前一行到下一个函数名之前的周围文本,有效地显示找到匹配的整个函数。
  • -m <num>, --max-count <num> - 限制每个文件的匹配数。使用 -v--invert-match 选项时,搜索在指定数量的不匹配后停止。值 -1 将返回无限结果(默认)。值 0 将以非零状态立即退出。
  • --threads <num> - 要使用的 grep 工作线程数。
  • -f <file> - 从 <file> 读取模式,每行一个。通过 <file> 传递模式允许提供包含 \0 的搜索模式。
  • -e - 下一个参数是模式。此选项必须用于以 - 开头的模式,应在将用户输入传递给 grep 的脚本中使用。多个模式通过 'or' 组合。
  • --and, --or, --not, ( ... ) - 指定如何使用布尔表达式组合多个模式。--or 是默认运算符。--and 的优先级高于 --or。所有模式都必须使用 -e
  • --all-match - 当给出与 --or 组合的多个模式表达式时,指定此标志以将匹配限制为具有匹配所有这些模式的行的文件。
  • -q, --quiet - 不输出匹配的行;而是在有匹配时以状态 0 退出,没有匹配时以非零状态退出。
  • <tree>... - 不搜索工作树中的跟踪文件,而是搜索给定树中的 blob。
  • -- - 表示选项结束;其余参数是 <pathspec> 限制器。
  • <pathspec>... - 如果给出,将搜索限制为匹配至少一个模式的路径。支持前导路径匹配和 glob(7) 模式。

示例

  • git grep 'time_t' -- '*.[ch]' - 在工作目录及其子目录中的所有跟踪 .c 和 .h 文件中查找 time_t
  • git grep -e '#define' --and \( -e MAX_PATH -e PATH_MAX \) - 查找具有 #defineMAX_PATHPATH_MAX 的行。
  • git grep --all-match -e NODE -e Unexpected - 在具有匹配两者的行的文件中查找具有 NODEUnexpected 的行。
  • git grep solution -- :^Documentation - 查找 solution,排除 Documentation 中的文件。

线程注意事项

当使用 --open-files-in-pager 时,--threads 选项(和 grep.threads 配置)将被忽略,强制单线程执行。

当 grep 对象存储时(使用 --cached 或给出树对象),如果给出 --textconv 并且有太多文本转换,运行多个线程可能比单线程更慢。因此,如果在此情况下遇到低性能,可能需要使用 --threads=1

配置

  • grep.lineNumber - 如果设置为 true,默认启用 -n 选项。
  • grep.column - 如果设置为 true,默认启用 --column 选项。
  • grep.patternType - 设置默认匹配行为。使用 'basic'、'extended'、'fixed' 或 'perl' 的值将相应启用 --basic-regexp--extended-regexp--fixed-strings--perl-regexp 选项,而值 'default' 将使用 grep.extendedRegexp 选项在 'basic' 和 'extended' 之间选择。
  • grep.extendedRegexp - 如果设置为 true,默认启用 --extended-regexp 选项。当 grep.patternType 选项设置为 'default' 以外的值时,此选项被忽略。
  • grep.threads - 要使用的 grep 工作线程数。如果未设置(或设置为 0),Git 将使用与可用逻辑核心数一样多的线程。
  • grep.fullName - 如果设置为 true,默认启用 --full-name 选项。
  • grep.fallbackToNoIndex - 如果设置为 true,如果 git grep 在 git 仓库外部执行,则回退到 git grep --no-index。默认为 false。

Git

git(1) 套件的一部分

基于 CC BY-NC-SA 3.0 许可发布