簡體中文 ▾ 主題 ▾ 最新版本 ▾ 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 管理。這與執行常規的 grep(1) 工具並指定其 -r 選項非常相似,但有一些額外的好處,例如使用 pathspec 模式來限制路徑;有關更多資訊,請參閱 gitglossary[7] 中的 pathspec 條目。

此選項不能與 --cached--untracked 一起使用。另請參閱下面的 CONFIGURATION 中的 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-indexed 位元組偏移量作為字首。

-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]Defining a custom hunk-header)。

-<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]Defining a custom hunk-header)。

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

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

--threads <num>

要使用的 grep 工作執行緒數。有關更多資訊,請參閱 NOTES ON THREADSCONFIGURATION 中的 grep.threads

-f <file>

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

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

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

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

在未來的版本中,我們可能會學會為更多搜尋後端支援包含 \0 的模式,在此之前,如果相關模式型別不支援它們,我們將停止執行。

-e

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

--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 配置)將被忽略,強制執行單執行緒。

當在物件儲存中進行 grep(使用 --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 倉庫外部執行 git grep 時,回退到 git grep --no-index。預設為 false。

GIT

Git[1] 套件的一部分

scroll-to-top