Git
英文 ▾ 主題 ▾ 最新版本 ▾ git-fsck 最後更新於 2.47.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] [<object>…​]

描述

驗證資料庫中物件的連線能力和有效性。

選項

<物件>

作為無法連線追蹤起點的物件。

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

--unreachable

印出存在但無法從任何參照節點連線到的物件。

--[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/

--[no-]progress

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

組態

此部分中此行下方的所有內容都從 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 發出警告。

請參閱 git-fsck[1]Fsck Messages 部分,了解 <msg-id> 的支援值。

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 <類型> <物件>

類型為 <類型> 的物件 <物件>,實際上在任何看到的樹狀結構或提交中,都未被直接或間接引用。這可能表示您未指定另一個根節點,或是樹狀結構已損壞。如果您沒有遺漏任何根節點,那麼您不妨刪除無法連線的節點,因為它們無法被使用。

missing <類型> <物件>

類型為 <類型> 的物件 <物件> 被引用,但不存在於資料庫中。

dangling <類型> <物件>

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

hash mismatch <物件>

資料庫中存在一個物件,其雜湊值與物件資料庫的值不符。這表示嚴重的資料完整性問題。

FSCK 訊息

以下列出 git fsck 偵測到的錯誤類型,以及每個錯誤的含義,以及其預設嚴重性。除了標記為「(FATAL)」的錯誤外,其他錯誤的嚴重性可以透過設定對應的 fsck.<msg-id> 組態變數來調整。

badDate

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

badDateOverflow

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

badEmail

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

badFilemode

(資訊) 一個樹狀結構包含錯誤的檔案模式條目。

badName

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

badObjectSha1

(錯誤) 物件的 sha1 值錯誤。

badParentSha1

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

badRefFiletype

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

badRefName

(錯誤) 參照的格式無效。

badTagName

(資訊) 標籤的格式無效。

badTimezone

(錯誤) 在作者/提交者行中找到無效的時區。

badTree

(錯誤) 無法解析樹狀結構。

badTreeSha1

(錯誤) 樹狀結構的格式無效。

badType

(錯誤) 找到無效的物件類型。

duplicateEntries

(錯誤) 樹狀結構包含重複的檔案條目。

emptyName

(警告) 路徑包含一個空的名稱。

extraHeaderEntry

(忽略) 在 tagger 之後找到額外的標頭。

fullPathname

(警告) 路徑包含以「/」開頭的完整路徑。

gitattributesBlob

(錯誤) 在 .gitattributes 找到非 blob 的物件。

gitattributesLarge

(錯誤) .gitattributes blob 過大。

gitattributesLineLength

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

gitattributesMissing

(錯誤) 無法讀取 .gitattributes blob。

gitattributesSymlink

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

gitignoreSymlink

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

gitmodulesBlob

(錯誤) 在 .gitmodules 找到非 blob 的物件。

gitmodulesLarge

(錯誤) .gitmodules 檔案過大,無法解析。

gitmodulesMissing

(錯誤) 無法讀取 .gitmodules blob。

gitmodulesName

(錯誤) 子模組名稱無效。

gitmodulesParse

(資訊) 無法解析 .gitmodules blob。

gitmodulesLarge; (錯誤) .gitmodules blob 過大,無法解析。

gitmodulesPath

(錯誤) .gitmodules 路徑無效。

gitmodulesSymlink

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

gitmodulesUpdate

(錯誤) 找到無效的子模組更新設定。

gitmodulesUrl

(錯誤) 找到無效的子模組網址。

hasDot

(警告) 樹狀結構包含一個名為 . 的條目。

hasDotdot

(警告) 樹狀結構包含一個名為 .. 的條目。

hasDotgit

(警告) 樹狀結構包含一個名為 .git 的條目。

largePathname

(警告) 樹狀結構包含一個路徑名稱非常長的條目。如果 fsck.largePathname 的值包含冒號,則該值會用作允許的最大長度(例如,「warn:10」會抱怨任何 11 個或更多位元組的路徑組件)。預設值為 4096。

mailmapSymlink

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

missingAuthor

(錯誤) 作者遺失。

missingCommitter

(錯誤) 提交者遺失。

missingEmail

(錯誤) 作者/提交者行中遺失電子郵件。

missingNameBeforeEmail

(錯誤) 在作者/提交者行的電子郵件之前遺失名稱。

missingObject

(錯誤) 標籤物件中遺失 object 行。

missingSpaceBeforeDate

(錯誤) 作者/提交者行的日期之前遺失空格。

missingSpaceBeforeEmail

(錯誤) 作者/提交者行的電子郵件之前遺失空格。

missingTag

(錯誤) 在標籤物件的 type 行之後出現非預期的結尾。

missingTagEntry

(錯誤) 標籤物件中遺失 tag 行。

missingTaggerEntry

(資訊) 標籤物件中遺失 tagger 行。

missingTree

(錯誤) 提交物件中遺失 tree 行。

missingType

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

missingTypeEntry

(錯誤) 標籤物件中遺失 type 行。

multipleAuthors

(錯誤) 在一個提交中找到多個作者行。

nulInCommit

(警告) 在提交物件的主體中找到 NUL 位元組。

nulInHeader

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

nullSha1

(警告) 樹狀結構包含指向 null sha1 的條目。

treeNotSorted

(錯誤) 樹狀結構未正確排序。

unknownType

(錯誤) 找到未知的物件類型。

unterminatedHeader

(致命) 物件標頭中遺失行尾符號。

zeroPaddedDate

(錯誤) 在作者/提交者行中找到以零填充的日期。

zeroPaddedFilemode

(警告) 在樹狀結構中找到以零填充的檔案模式。

環境變數

GIT_OBJECT_DIRECTORY

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

GIT_INDEX_FILE

用於指定索引的索引檔案

GIT_ALTERNATE_OBJECT_DIRECTORIES

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

GIT

屬於 git[1] 工具組的一部分

scroll-to-top