簡體中文 ▾ 主題 ▾ 最新版本 ▾ git-fsck 最後更新於 2.52.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>

一個用於作為不可達跟蹤的起點的物件。

如果沒有給出物件,git fsck 預設使用索引檔案、refs 名稱空間下的所有 SHA-1 引用以及所有 reflog(除非給出了 --no-reflogs)作為起點。

--unreachable

列印存在但無法從任何引用節點到達的物件。

--dangling
--no-dangling

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

--root

報告根節點。

--tags

報告標籤。

--cache

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

--no-reflogs

不要將僅由 reflog 條目引用的提交視為可達。此選項僅用於查詢曾經在 ref 中但現在不再存在,但仍存在於相應 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

啟用更嚴格的檢查,即捕獲用 g+w 位集記錄的檔案模式,該檔案模式是由舊版本 Git 建立的。現有儲存庫,包括 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]。預設行為是檢查引用資料庫。

配置

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

fsck.<msg-id>

在 fsck 期間,git 可能會發現舊資料存在問題,這些問題不會被當前版本的 git 生成,並且在設定 transfer.fsckObjects 時不會透過網路傳輸。此功能旨在支援處理包含此類資料的舊儲存庫。

設定 fsck.<msg-id> 將被 git-fsck[1] 讀取,但要接受此類資料的推送,請改而設定 receive.fsck.<msg-id>,或者要克隆或獲取它,請設定 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 MESSAGES

以下列出了 git fsck 檢測到的錯誤型別及其含義和預設嚴重性。除標記為“(FATAL)”的錯誤外,錯誤的嚴重性都可以透過設定相應的 fsck.<msg-id> 配置變數來調整。

badDate

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

badDateOverflow

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

badEmail

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

badFilemode

(INFO) 樹中包含無效的檔案模式條目。

badGpgsig

(ERROR) 標籤包含無效(截斷)的簽名(例如,gpgsig)頭。

badHeaderContinuation

(ERROR) 繼續頭(例如,用於 gpgsig)意外被截斷。

badName

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

badObjectSha1

(ERROR) 物件具有無效的 sha1。

badPackedRefEntry

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

badPackedRefHeader

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

badParentSha1

(ERROR) 提交物件具有無效的父 sha1。

badRefContent

(ERROR) ref 具有無效內容。

badRefFiletype

(ERROR) ref 具有無效的檔案型別。

badRefName

(ERROR) ref 格式無效。

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) 發現無效的子模組 URL。

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) 一個鬆散的 ref 不以換行符 (LF) 結尾。由於有效的 Git 實現從不建立如此鬆散的 ref 檔案,因此將來它可能會成為一個錯誤。如果您看到此錯誤,請報告給 git@vger.kernel.org 郵件列表,因為我們需要知道哪些工具建立了這樣的檔案。

symlinkRef

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

symrefTargetIsNotARef

(INFO) 符號引用的目標既不是根引用,也不是以“refs/”開頭的引用。儘管我們允許使用 git symbolic-ref 建立指向 ref 外部的引用的符號引用,但我們將來可能會收緊此規則。如果您看到此錯誤,請報告給 git@vger.kernel.org 郵件列表,因為我們需要知道哪些工具建立了這樣的檔案。

trailingRefContent

(INFO) 鬆散的 ref 包含尾隨內容。由於有效的 Git 實現從不建立如此鬆散的 ref 檔案,因此將來它可能會成為一個錯誤。如果您看到此錯誤,請報告給 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] 套件的一部分