Git
英文 ▾ 主題 ▾ 最新版本 ▾ 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>…​]

描述

在工作樹中追蹤的檔案、索引檔中註冊的 blobs 或給定樹狀物件中的 blobs 中尋找指定的模式。模式是由一個或多個以換行符號分隔的搜尋表達式組成的列表。空的搜尋表達式會匹配所有行。

選項

--cached

不要在工作樹中搜尋追蹤的檔案,而是在索引檔中搜尋註冊的 blobs。

--untracked

除了在工作樹中搜尋追蹤的檔案外,也搜尋未追蹤的檔案。

--no-index

搜尋目前目錄中未由 Git 管理的檔案,或忽略目前目錄由 Git 管理的事實。這與執行一般 grep(1) 公用程式並指定其 -r 選項非常相似,但具有一些額外的好處,例如使用路徑規格模式來限制路徑;有關更多資訊,請參閱 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 為基礎的位元組偏移量作為前綴。

-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 計算 patch hunk 標頭的方式相同(請參閱 gitattributes[5] 中的「定義自訂 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 計算 patch hunk 標頭的方式相同(請參閱 gitattributes[5] 中的「定義自訂 hunk-header」)。

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

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

--threads <num>

要使用的 grep 工作執行緒數。有關詳細資訊,請參閱「關於執行緒的注意事項」和「組態」中的 grep.threads

-f <file>

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

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

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

在 2.23.0 之前的 Git 版本中,包含 \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 \)

尋找包含 #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 設定),強制單執行緒執行。

當 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 儲存庫外部執行 git grep 時,會回退到 git grep --no-index。預設為 false。

GIT

屬於 git[1] 套件的一部分

scroll-to-top