English ▾ 主題 ▾ 最新版本 ▾ git-fsck 最後更新於 2.53.0

名稱

git-fsck - 驗證資料庫中物件的連通性與有效性

概要

git fsck [--tags] [--root] [--unreachable] [--cache] [--no-reflogs]
	 [--[no-]full] [--strict] [--verbose] [--lost-found]
	 [--[no-]dangling] [--[no-]progress] [--connectivity-only]
	 [--[no-]name-objects] [--[no-]references] [<object>…​]

描述

驗證資料庫中物件的連通性與有效性。

選項

<object>

要作為不可達追蹤(unreachability trace)起始點的物件。

如果未提供物件,git fsck 預設會使用索引檔、refs 命名空間中的所有 SHA-1 參照,以及所有 reflogs(除非指定了 --no-reflogs)作為起始點。

--unreachable

列出存在但無法從任何參照節點到達的物件。

--dangling
--no-dangling

列出存在但從未被直接使用的物件(預設值)。--no-dangling 可用於從輸出中省略此資訊。

--root

報告根節點。

--tags

報告標籤(tags)。

--cache

將索引中記錄的任何物件也視為不可達追蹤的根節點。

--no-reflogs

不要將僅由 reflog 中的條目參照的提交視為可達。此選項僅用於搜尋過去存在於某個引用中,但現在不在其中,卻仍存在於該對應 reflog 中的提交。

--full

不僅檢查 GIT_OBJECT_DIRECTORY ($GIT_DIR/objects) 中的物件,也檢查列在 GIT_ALTERNATE_OBJECT_DIRECTORIES 或 $GIT_DIR/objects/info/alternates 中的替代物件池,以及在 $GIT_DIR/objects/pack 中及其替代物件池對應 pack 子目錄中找到的封裝 Git 存檔。現在這是預設行為;您可以使用 --no-full 將其關閉。

--connectivity-only

僅檢查可達物件的連通性,確保任何由可達標籤、提交或樹狀物件所參照的物件都存在。這可以透過完全避免讀取 blob 來加快操作速度(儘管仍會檢查參照的 blob 是否存在)。這將檢測提交和樹狀物件中的損壞,但不會進行任何語義檢查(例如格式錯誤)。Blob 物件中的損壞將完全無法被檢測。

不可達的標籤、提交和樹狀物件也將被存取以找出懸空歷史片段的尖端。如果您不關心此輸出並希望進一步加快速度,請使用 --no-dangling

--strict

啟用更嚴格的檢查,即捕捉由舊版本 Git 建立的設置了 g+w 位元的檔案模式。現有的儲存庫,包括 Linux 核心、Git 本身和稀疏儲存庫都有會觸發此檢查的舊物件,但建議對新專案使用此旗標進行檢查。

--verbose

輸出詳細訊息。

--lost-found

根據類型將懸空物件寫入 .git/lost-found/commit/ 或 .git/lost-found/other/。如果物件是 blob,則將內容寫入檔案,而不是寫入其物件名稱。

--name-objects

顯示可達物件的名稱時,除了顯示 SHA-1 外,還顯示一個描述其如何可達的名稱,格式與 git-rev-parse[1] 相容,例如 HEAD@{1234567890}~25^2:src/

--progress
--no-progress

預設情況下,當連接到終端時,進度狀態會報告在標準錯誤流上,除非指定了 --no-progress 或 --verbose。即使標準錯誤流未導向至終端,--progress 也會強制顯示進度狀態。

--references
--no-references

控制是否透過 git refs verify 檢查參照資料庫的一致性。詳情請參閱 git-refs[1]。預設行為是檢查參照資料庫。

組態設定 (CONFIGURATION)

本節中此行以下的內容是從 git-config[1] 文件中選擇性包含的。內容與該處找到的內容相同

fsck.<msg-id>

在 fsck 期間,git 可能會發現舊資料的問題,這些問題不會由當前版本的 git 產生,如果設置了 transfer.fsckObjects,也不會透過網路發送。此功能旨在支援處理包含此類資料的舊式儲存庫。

設置 fsck.<msg-id> 會被 git-fsck[1] 採用,但若要接受此類資料的推送,請改為設置 receive.fsck.<msg-id>,或者若要複製(clone)或抓取(fetch)它,請設置 fetch.fsck.<msg-id>

本文件的其餘部分為簡潔起見討論 fsck.*,但同樣適用於對應的 receive.fsck.*fetch.fsck.* 變數。

color.uicore.editor 等變數不同,如果未設置 receive.fsck.<msg-id>fetch.fsck.<msg-id> 變數,它們不會回退到 fsck.<msg-id> 配置。若要在不同情況下統一配置相同的 fsck 設置,必須將這三者都設置為相同的值。

當設置了 fsck.<msg-id> 後,可以透過配置 fsck.<msg-id> 設置將錯誤轉為警告,反之亦然。其中 <msg-id> 是 fsck 訊息 ID,值為 errorwarnignore 之一。為了方便起見,fsck 會在錯誤/警告前加上訊息 ID,例如 "missingEmail: invalid author/committer line - missing email" 意味著設置 fsck.missingEmail = ignore 將隱藏該問題。

總體而言,最好使用 fsck.skipList 枚舉現有的有問題物件,而不是列出這些有問題物件所共享的破壞類型以將其忽略,因為後者會讓相同破壞類型的後續實例未被察覺。

設置未知的 fsck.<msg-id> 值會導致 fsck 終止,但對 receive.fsck.<msg-id>fetch.fsck.<msg-id> 做同樣的操作只會導致 git 發出警告。

關於 <msg-id> 的支援值,請參閱 git-fsck[1]Fsck Messages 章節。

fsck.skipList

指向物件名稱列表的路徑(即每行一個未縮寫的 SHA-1),這些物件已知以非致命方式損壞且應被忽略。在 Git 2.20 及更高版本中,註解(#)、空行以及任何開頭和結尾的空白都會被忽略。在舊版本中,除每行一個 SHA-1 外的所有內容都會報錯。

當一個既有的專案儘管包含早期提交中的錯誤(例如無效的提交者電子郵件地址)仍應被接受時,此功能非常有用。注意:損壞的物件無法透過此設置跳過。

fsck.<msg-id> 一樣,此變數也有對應的 receive.fsck.skipListfetch.fsck.skipList 變體。

color.uicore.editor 等變數不同,如果未設置 receive.fsck.skipListfetch.fsck.skipList 變數,它們不會回退到 fsck.skipList 配置。若要在不同情況下統一配置相同的 fsck 設置,必須將這三者都設置為相同的值。

舊版本的 Git(2.20 之前)記錄說物件名稱列表應該是排序過的。這從來都不是必要條件;物件名稱可以以任何順序出現,但在讀取列表時,我們會追蹤列表是否已排序,以用於內部的二元搜尋實作,這樣可以節省已經排序過的列表的一些處理工作。除非您有一個龐大的列表,否則沒有理由特地去預先排序列表。在 Git 2.20 版本之後,改用了雜湊實作,因此現在沒有理由預先排序列表。

討論

git-fsck 會測試 SHA-1 和一般的物件健全性,並對產生的可達性及其他所有內容進行完整追蹤。它會印出發現的任何損壞(遺失或損壞的物件),如果您使用 --unreachable 旗標,它也會印出存在但無法從任何指定根節點(或上述提到的預設集合)到達的物件。

任何損壞的物件,您都必須在備份或其他存檔中找到(即您可以將其刪除,然後與其他站點進行 rsync,希望別人有您損壞的物件)。

如果 core.commitGraph 為 true,也會使用 git commit-graph verify 檢查 commit-graph 檔案。請參閱 git-commit-graph[1]

擷取的診斷訊息

unreachable <type> <object>

<type> 物件 <object> 在看到的任何樹狀物件或提交中,實際上並沒有被直接或間接地參照到。這可能意味著存在另一個您未指定的根節點,或者該樹狀物件已損壞。如果您沒有漏掉根節點,那麼刪除不可達節點也是可以的,因為它們無法被使用。

missing <type> <object>

<type> 物件 <object> 已被參照但未存在於資料庫中。

dangling <type> <object>

<type> 物件 <object> 存在於資料庫中但從未被直接使用。一個懸空的提交可能是個根節點。

hash mismatch <object>

資料庫中的物件雜湊值與物件資料庫中的值不符。這顯示嚴重的資料完整性問題。

FSCK 訊息

以下列出了 git fsck 偵測到的錯誤類型及其含義,以及它們的預設嚴重性。除了標記為 "(FATAL)" 的錯誤外,錯誤的嚴重性可以透過設置對應的 fsck.<msg-id> 配置變數來調整。

badDate

(ERROR) 作者/提交者行中的日期格式無效。

badDateOverflow

(ERROR) 作者/提交者行中的日期值無效。

badEmail

(ERROR) 作者/提交者行中的電子郵件格式無效。

badFilemode

(INFO) 樹狀物件包含錯誤的檔案模式(filemode)條目。

badGpgsig

(ERROR) 標籤包含錯誤(被截斷)的簽章(例如 gpgsig)標頭。

badHeadTarget

(ERROR) HEAD 參照是一個不指向分支的符號參照(symref)。

badHeaderContinuation

(ERROR) 延續標頭(例如 gpgsig 的)意外被截斷。

badName

(ERROR) 作者/提交者名稱為空。

badObjectSha1

(ERROR) 物件的 sha1 錯誤。

badPackedRefEntry

(ERROR) "packed-refs" 檔案包含無效條目。

badPackedRefHeader

(ERROR) "packed-refs" 檔案包含無效標頭。

badParentSha1

(ERROR) 提交物件的父代 sha1 錯誤。

badRefContent

(ERROR) 參照(ref)內容錯誤。

badRefFiletype

(ERROR) 參照的檔案類型錯誤。

badRefName

(ERROR) 參照格式無效。

badRefOid

(ERROR) 參照指向無效的物件 ID。

badReferentName

(ERROR) 符號參照指向的名稱無效。

badReftableTableName

(WARN) Reftable 表格名稱無效。

badTagName

(INFO) 標籤格式無效。

badTimezone

(ERROR) 在作者/提交者行中發現無效的時區。

badTree

(ERROR) 樹狀物件無法被解析。

badTreeSha1

(ERROR) 樹狀物件格式無效。

badType

(ERROR) 發現無效的物件類型。

duplicateEntries

(ERROR) 樹狀物件包含重複的檔案條目。

emptyName

(WARN) 路徑包含空名稱。

emptyPackedRefsFile

(INFO) "packed-refs" 檔案為空。如果您看到此錯誤,請回報給 git@vger.kernel.org 郵件列表。由於只有極早期的 Git 版本會建立此類空的 "packed_refs" 檔案,我們將來可能會收緊此規則。

extraHeaderEntry

(IGNORE) 在 tagger 之後發現額外標頭。

fullPathname

(WARN) 路徑包含以 "/" 開頭的完整路徑。

gitattributesBlob

(ERROR) 在 .gitattributes 發現非 blob 物件。

gitattributesLarge

(ERROR) .gitattributes blob 太大。

gitattributesLineLength

(ERROR) .gitattributes blob 包含過長的行。

gitattributesMissing

(ERROR) 無法讀取 .gitattributes blob。

gitattributesSymlink

(INFO) .gitattributes 是一個符號連結。

gitignoreSymlink

(INFO) .gitignore 是一個符號連結。

gitmodulesBlob

(ERROR) 在 .gitmodules 發現非 blob 物件。

gitmodulesLarge

(ERROR) .gitmodules 檔案太大而無法解析。

gitmodulesMissing

(ERROR) 無法讀取 .gitmodules blob。

gitmodulesName

(ERROR) 子模組名稱無效。

gitmodulesParse

(INFO) 無法解析 .gitmodules blob。

gitmodulesPath

(ERROR) .gitmodules 路徑無效。

gitmodulesSymlink

(ERROR) .gitmodules 是一個符號連結。

gitmodulesUpdate

(ERROR) 發現無效的子模組更新設置。

gitmodulesUrl

(ERROR) 發現無效的子模組網址。

hasDot

(WARN) 樹狀物件包含名為 . 的條目。

hasDotdot

(WARN) 樹狀物件包含名為 .. 的條目。

hasDotgit

(WARN) 樹狀物件包含名為 .git 的條目。

largePathname

(WARN) 樹狀物件包含一個路徑名稱非常長的條目。如果 fsck.largePathname 的值包含冒號,該值將用作最大允許長度(例如,"warn:10" 會針對任何 11 個位元組或以上的路徑元件發出警告)。預設值為 4096。

mailmapSymlink

(INFO) .mailmap 是一個符號連結。

missingAuthor

(ERROR) 缺少作者。

missingCommitter

(ERROR) 缺少提交者。

missingEmail

(ERROR) 作者/提交者行中缺少電子郵件。

missingNameBeforeEmail

(ERROR) 作者/提交者行中電子郵件前缺少名稱。

missingObject

(ERROR) 標籤物件中缺少 object 行。

missingSpaceBeforeDate

(ERROR) 作者/提交者行中日期前缺少空格。

missingSpaceBeforeEmail

(ERROR) 作者/提交者行中電子郵件前缺少空格。

missingTag

(ERROR) 標籤物件中的 type 行後意外結束。

missingTagEntry

(ERROR) 標籤物件中缺少 tag 行。

missingTaggerEntry

(INFO) 標籤物件中缺少 tagger 行。

missingTree

(ERROR) 提交物件中缺少 tree 行。

missingType

(ERROR) 標籤物件中 type 行的類型值無效。

missingTypeEntry

(ERROR) 標籤物件中缺少 type 行。

multipleAuthors

(ERROR) 在提交中發現多個作者行。

nulInCommit

(WARN) 在提交物件主體中發現 NUL 位元組。

nulInHeader

(FATAL) 物件標頭中存在 NUL 位元組。

nullSha1

(WARN) 樹狀物件包含指向 null sha1 的條目。

packedRefEntryNotTerminated

(ERROR) "packed-refs" 檔案包含一個未以換行符號結尾的條目。

packedRefUnsorted

(ERROR) "packed-refs" 檔案未排序。

refMissingNewline

(INFO) 一個未以換行符號(LF)結尾的鬆散參照(loose ref)。由於合法的 Git 實作從未建立過此類鬆散參照檔案,未來可能會變成錯誤。如果您看到此錯誤,請回報給 git@vger.kernel.org 郵件列表,因為我們需要知道是什麼工具建立了這樣的檔案。

symlinkRef

(INFO) 符號連結被用作符號參照。如果您看到此錯誤,請回報給 git@vger.kernel.org 郵件列表,因為我們正在評估放棄支援建立作為符號參照的符號連結的可行性。

symrefTargetIsNotARef

(INFO) 符號參照的目標既不指向根參照,也不指向以 "refs/" 開頭的參照。雖然我們允許使用 git symbolic-ref 建立指向 "ref" 之外目標的符號參照,但未來可能會收緊規則。如果您看到此錯誤,請回報給 git@vger.kernel.org 郵件列表,因為我們需要知道是什麼工具建立了這樣的檔案。

trailingRefContent

(INFO) 一個鬆散參照具有尾隨內容。由於合法的 Git 實作從未建立過此類鬆散參照檔案,未來可能會變成錯誤。如果您看到此錯誤,請回報給 git@vger.kernel.org 郵件列表,因為我們需要知道是什麼工具建立了這樣的檔案。

treeNotSorted

(ERROR) 樹狀物件未正確排序。

unknownType

(ERROR) 發現未知的物件類型。

unterminatedHeader

(FATAL) 物件標頭中缺少換行符號。

zeroPaddedDate

(ERROR) 在作者/提交者行中發現零填充的日期。

zeroPaddedFilemode

(WARN) 在樹狀物件中發現零填充的檔案模式。

環境變數

GIT_OBJECT_DIRECTORY

用於指定物件資料庫根目錄(通常為 $GIT_DIR/objects)

GIT_INDEX_FILE

用於指定索引的索引檔

GIT_ALTERNATE_OBJECT_DIRECTORIES

用於指定額外的物件資料庫根目錄(通常未設置)

GIT

git[1] 套件的一部分