簡體中文 ▾ 主題 ▾ 最新版本 ▾ git-grep 上次更新於 2.45.0

名稱

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 管理。這非常類似於使用 regular grep(1) 實用程式及其 -r 選項,但具有一些額外的優點,例如使用路徑說明符模式來限制路徑;有關更多資訊,請參閱 gitglossary[7] 中的pathspec 條目。

此選項不能與 --cached--untracked 一起使用。另請參閱下面的配置中的 grep.fallbackToNoIndex

--no-exclude-standard

透過不遵守 .gitignore 機制,也搜尋被忽略的檔案。僅在與 --untracked 一起使用時才有用。

--exclude-standard

在透過 .gitignore 機制指定的被忽略檔案中,不予關注。僅在使用 --no-index 搜尋當前目錄中的檔案時才有用。

--recurse-submodules

遞迴地搜尋倉庫中已啟用並已檢出的每個子模組。當與<tree>選項結合使用時,所有子模組輸出的字首將是父專案<tree>物件的名稱。此選項不能與 --untracked 一起使用,並且如果指定了 --no-index,則不起作用。

-a
--text

將二進位制檔案視為文字檔案進行處理。

--textconv

遵循 textconv 過濾器設定。

--no-textconv

不遵循 textconv 過濾器設定。這是預設設定。

-i
--ignore-case

忽略模式和檔案之間的區分大小寫。

-I

在二進位制檔案中不匹配模式。

--max-depth <depth>

對於命令線上給出的每個 <pathspec>,最多下降 <depth> 層目錄。-1 的值表示沒有限制。如果 <pathspec> 包含活動的萬用字元,則忽略此選項。換句話說,如果“a*”匹配一個名為“a*”的目錄,“*”將被字面匹配,因此 --max-depth 仍然有效。

-r
--recursive

--max-depth=-1 相同;這是預設設定。

--no-recursive

--max-depth=0 相同。

-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

在匹配的行前面加上行號。

--column

在匹配行開頭處的第一個匹配項的 1 索引位元組偏移處加上字首。

-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 的輸出)。如果分頁器碰巧是“less”或“vi”,並且使用者只指定了一個模式,則第一個檔案會自動定位到第一個匹配項。 pager 引數是可選的;如果指定,它必須緊貼選項,中間不能有空格。如果 pager 未指定,將使用預設分頁器(請參閱 git-config[1] 中的 core.pager)。

-z
--null

使用 \0 作為輸出中檔名的分隔符,並逐字列印它們。沒有此選項,具有“特殊”字元的檔名將被引用,如 core.quotePath 配置變數中所述(請參閱 git-config[1])。

-o
--only-matching

僅列印匹配行中匹配的(非空)部分,每個部分單獨一行輸出。

-c
--count

不顯示每一行匹配項,而是顯示匹配行的數量。

--color[=<when>]

顯示彩色匹配項。該值必須是 always(預設)、never 或 auto。

--no-color

關閉匹配項的高亮顯示,即使配置檔案預設設定為彩色輸出。與 --color=never 相同。

--break

在不同檔案之間的匹配項之間列印一個空行。

--heading

在檔名上方顯示匹配的檔名,而不是在每行顯示開始處。

-p
--show-function

顯示包含匹配項函式名的前一行,除非匹配行本身就是一個函式名。函式名的確定方式與 git diff 確定補丁塊標題的方式相同(請參閱 gitattributes[5] 中的定義自定義塊標題)。

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

顯示 <num> 行的上下文(前置和後置),並在連續匹配組之間放置一個包含 -- 的行。

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

顯示 <num> 行的後置上下文,並在連續匹配組之間放置一個包含 -- 的行。

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

顯示 <num> 行的前置上下文,並在連續匹配組之間放置一個包含 -- 的行。

-W
--function-context

顯示從包含函式名的前一行到下一個函式名之前一行的周圍文字,有效地顯示找到匹配項的整個函式。函式名的確定方式與 git diff 確定補丁塊標題的方式相同(請參閱 gitattributes[5] 中的定義自定義塊標題)。

-m <num>
--max-count <num>

限制每個檔案中的匹配項數量。當使用 -v--invert-match 選項時,搜尋在指定數量的非匹配項後停止。-1 的值將返回無限制的結果(預設)。0 的值將立即以非零狀態退出。

--threads <num>

使用的 grep 工作執行緒數。請參閱關於執行緒的說明配置中的 grep.threads 以獲取更多資訊。

-f <file>

從 <file> 讀取模式,每行一個。

透過 <file> 傳遞模式允許提供包含 \0 的搜尋模式。

並非所有模式型別都支援包含 \0 的模式。如果給定的模式型別不支援此類模式,Git 將會報錯。 --perl-regexp 模式型別與 PCRE v2 後端編譯時,對此類模式的支援最廣泛。

在 Git 2.23.0 之前的版本中,包含 \0 的模式會被靜默地視為固定字串。這從未被記錄,並且例如,包含 \0 的非 ASCII 模式與 --ignore-case 之間也存在奇怪且未被記錄的互動。

在未來的版本中,我們可能會為更多搜尋後端新增對包含 \0 的模式的支援,在此之前,當相關的模式型別不支援它們時,我們將退出。

-e

下一個引數是模式。此選項必須用於以 - 開頭的模式,並且應該在指令碼將使用者輸入傳遞給 grep 時使用。多個模式透過組合。

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

指定如何使用布林表示式組合多個模式。 --or 是預設運算子。 --and 的優先順序高於 --or-e 必須用於所有模式。

--all-match

在提供用 --or 組合的多個模式表示式時,指定此標誌以限制匹配到那些具有匹配所有這些模式的行的檔案。

-q
--quiet

不輸出匹配的行;相反,當存在匹配時以狀態 0 退出,當不存在匹配時以非零狀態退出。

<tree>…​

不搜尋工作樹中的跟蹤檔案,而是搜尋給定樹中的 blob。

--

表示選項的結束;其餘引數是 <pathspec> 限制符。

<pathspec>…​

如果給出,則將搜尋限制在至少匹配一個模式的路徑。同時支援前導路徑匹配和 glob(7) 模式。

有關 <pathspec> 語法的更多詳細資訊,請參閱 gitglossary[7] 中的pathspec 條目。

示例

git grep time_t' -- *.[ch]

在工作目錄及其子目錄中的所有跟蹤的 .c 和 .h 檔案中查詢 time_t

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

查詢包含 #define 並且還包含 MAX_PATHPATH_MAX 的行。

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

查詢在包含匹配兩個模式的行的檔案中,包含 NODEUnexpected 的行。

git grep solution -- :^Documentation

查詢 solution,但不包括 Documentation 目錄中的檔案。

關於執行緒的說明

當使用 --open-files-in-pager 選項時,將忽略 --threads 選項(以及 grep.threads 配置),強制執行單執行緒。

當對物件儲存進行 grepping 時(使用 --cached 或提供樹物件),如果給定 --textconv 並且有太多文字轉換,則多執行緒執行可能比單執行緒執行慢。因此,如果在此情況下遇到效能低下,可以考慮使用 --threads=1

配置

本節中以下所有內容均從 git-config[1] 文件中選擇性地包含。內容與彼處相同:

grep.lineNumber

如果設定為 true,則預設啟用 -n 選項。

grep.column

如果設定為 true,則預設啟用 --column 選項。

grep.patternType

設定預設匹配行為。使用basicextendedfixedperl之一作為值,將分別啟用 --basic-regexp--extended-regexp--fixed-strings--perl-regexp 選項,而值為default將使用 grep.extendedRegexp 選項在basicextended之間進行選擇。

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] 套件的一部分