## 命名

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]           [-l | --files-with-matches] [-L | --files-without-match]           [(-O | --open-files-in-pager) [<pager>]]           [-z | --null]           [-c | --count] [--all-match] [-q | --quiet]           [--max-depth <depth>]           [--color[=<when>] | --no-color]           [--break] [--heading] [-p | --show-function]           [-A <post-context>] [-B <pre-context>] [-C <context>]           [-W | --function-context]           [--threads <num>]           [-f <file>] [-e] <pattern>           [--and|--or|--not|(|)|-e <pattern>…]           [--recurse-submodules] [--parent-basename <basename>]           [ [--[no-]exclude-standard] [--cached | --no-index | --untracked] | <tree>…]           [--] [<pathspec>…]

## 描述

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

## 组态

grep.lineNumber

如果设置为 true ，则`-n`默认启用选项。

grep.patternType

设置默认的匹配行为。使用值`basic`，`extended`，`fixed`，或`perl`将启用`--basic-regexp`，`--extended-regexp`，`--fixed-strings`，或`--perl-regexp`相应的选项，而值`default`将返回到默认匹配行为。

grep.extendedRegexp

如果设置为 true，则`--extended-regexp`默认启用选项。当该`grep.patternType`选项设置为非时，该选项将被忽略`default`。

grep.threads

要使用的 grep 工作线程数。如果未设置（或设置为0），则默认使用8个线程（现在）。

grep.fullName

如果设置为 true ，则`--full-name`默认启用选项。

grep.fallbackToNoIndex

如果设置为 true ，则回退到 git grep --no-index，如果 git grep 在 git 存储库之外执行。默认为 false 。

## 选项

--cached

搜索工作树中的追踪文件，而不是搜索索引文件中注册的斑点。

--no-index

搜索当前目录中不受 Git 管理的文件。

--untracked

除了在工作树中跟踪文件中搜索外，还可以在未跟踪文件中搜索。

--no-exclude-standard

通过不尊重`.gitignore`机制来搜索被忽略的文件。只用于`--untracked`。

--exclude-standard

不要关注通过`.gitignore`机制指定的忽略文件。仅在使用当前目录搜索文件时有用`--no-index`。

--recurse-submodules

递归搜索已在存储库中初始化并检出的每个子模块。当与 <tree> 选项结合使用时，所有子模块输出的前缀将是父项目的 <tree> 对象的名称。

--parent-basename <basename>

仅限内部使用。为了使用 --recurse-submodules 选项产生统一的输出，可以使用此选项将父级的 <tree> 对象的基名称提供给子模块，以便子模块可以将其输出与父级名称相加，而不是使用 SHA1 子模块。

-a --text

像处理文本一样处理二进制文件。

--textconv

尊重 textconv 过滤器设置。

--no-textconv

不要兑现 textconv 过滤器设置。这是默认设置。

-i --ignore-case

忽略模式和文件之间的大小写区别。

-I

不匹配二进制文件中的模式。

--max-depth <depth>

对于命令行中给出的每个 <pathspec> ，最多下降 <depth> 级别的目录。负值意味着没有限制。如果 <pathspec> 包含活动通配符，则忽略此选项。换句话说，如果 “a *” 匹配名为 “a *” 的目录，则“*”的字面匹配如此 - max-depth 仍然有效。

-w --word-regexp

仅在字边界处匹配模式（或者从一行的开始处开始，或者以非单词字符开头;结束于一行的末尾或后面跟着一个非单词字符）。

-v --invert-match

选择不匹配的行。

-h -H

默认情况下，该命令显示每个匹配的文件名。`-h`选项用于抑制此输出。`-H`是否有完整性，除了`-h`在命令行中早先给出的覆盖之外，不会执行任何操作。

--full-name

从子目录运行时，该命令通常会输出相对于当前目录的路径。该选项强制相对于项目顶部目录输出路径。

-E --extended-regexp -G --basic-regexp

对于模式使用 POSIX 扩展/基本正则表达式。默认是使用基本的正则表达式。

-P --perl-regexp

为模式使用 Perl 兼容的正则表达式。

对这些类型的正则表达式的支持是可选的编译时间依赖性。如果 Git 没有编译支持它们，提供这个选项会导致它失效。

-F --fixed-strings

使用固定字符串模式（不要将模式解释为正则表达式）。

-n --line-number

在行号前加上匹配的行。

-l --files-with-matches --name-only -L --files-without-match

不显示每条匹配的行，只显示包含（或不包含）匹配的文件的名称。为了更好的兼容性`git diff`，`--name-only`是一个同义词`--files-with-matches`。

-O<pager> --open-files-in-pager=<pager>

打开寻呼机中的匹配文件（不是输出`grep`）。如果寻呼机恰好是 “较少” 或 “vi” ，并且用户只指定一个模式，则第一个文件将自动定位在第一个匹配位置。该`pager`论点是可选的; 如果指定，它必须粘贴到选项没有空格。如果`pager`未指定，将使用默认寻呼机（请参阅`core.pager` git-config [1] ）。

-z --null

输出 \ 0 而不是通常跟在文件名后的字符。

-c --count

显示匹配的行数，而不是显示每条匹配的行。

--color=<when>

显示结果为彩色。该值必须 always（默认），never 或 auto 。

--no-color

关闭匹配突出显示，即使配置文件将默认设置为彩色输出。和`--color=never`一样。

--break

在不同文件的匹配之间打印空行。

--heading

在文件的上方显示文件名，而不是在每个显示的行的开头。

-p --show-function

显示包含匹配函数名称的上一行，除非匹配行是函数名称本身。该名称的确定方式与`git diff`制作补丁大小标头的方式相同（请参阅`Defining a custom hunk-header` gitattributes [5]）。

-<num> -C <num> --context <num>

显示 <num> 前导和尾部线条，并放置包含`--`连续的匹配组之间的线条。

-A <num> --after-context <num>

显示 <num> 尾随线，并`--`在连续的匹配组之间放置一行。

-B <num> --before-context <num>

显示 <num> 引出线，并`--`在相邻的匹配组之间放置一行。

-W --function-context

显示前一行中包含函数名称的周围文本，直到下一个函数名称之前的文本，从而有效地显示找到匹配的整个函数。

--threads <num>

要使用的 grep 工作线程数。参见`grep.threads`以`CONFIGURATION`获取更多信息。

-f <file>

从 <file> 中读取模式，每行一个。

-e

下一个参数是模式。这个选项必须用于模式的开头，`-`并且应该在将用户输入传递给 grep 的脚本中使用。多个模式组合在一起`or`。

--and --or --not ( … )

指定如何使用布尔表达式组合多个模式。`--or`是默认的运营商。`--and`比`--or`优先。`-e`必须用于所有模式。

--all-match

将多个模式表达式结合使用时`--or`，会指定此标志以将匹配限制为具有与其匹配的所有行的文件。

-q --quiet

不要输出匹配的行; 取而代之的是，当状态0出现匹配时退出，当不存在时退出非零状态。

<tree>…

而不是在工作树中搜索跟踪文件，搜索给定树中的斑点。

--

表示选项结束; 其余的参数是 <pathspec> 限制器。

<pathspec>…

如果给定，则将搜索限制为至少匹配一个模式的路径。两个前导路径匹配并支持 glob（7）模式。

有关 <pathspec> 语法的更多详细信息，请参阅`pathspec` gitglossary [7]中的条目。

## 例子

`git grep 'time_t' -- '*.[ch]'`

查找`time_t`在所有跟踪的 .c 和 .h 文件在工作目录及其子目录。

`git grep -e '#define' --and \( -e MAX_PATH -e PATH_MAX \)`

查找具有`#define`的线，要么是`MAX_PATH`或`PATH_MAX`。

`git grep --all-match -e NODE -e Unexpected`

查找具有`NODE`或`Unexpected`两者匹配的行的文件。

`git grep solution -- :^Documentation`

寻找`solution`，不包括`Documentation`中的文件。