簡體中文 ▾ 主題 ▾ 最新版本 ▾ git-fsck 上次更新於 2.50.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>…​]

描述

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

選項

<物件>

一個被視為不可達追溯起點的物件。

如果沒有指定物件,*git fsck* 預設將索引檔案、refs 名稱空間中所有 SHA-1 引用以及所有引用日誌(除非給定 --no-reflogs 選項)作為起點。

--unreachable

打印出存在但無法從任何引用節點訪問到的物件。

--[no-]dangling

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

--root

報告根節點。

--tags

報告標籤。

--cache

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

--no-reflogs

不要將僅由引用日誌條目引用的提交視為可達。此選項僅用於查詢曾經在引用中但現在不在,但仍在其相應引用日誌中的提交。

--full

不僅檢查 GIT_OBJECT_DIRECTORY ($GIT_DIR/objects) 中的物件,還檢查 GIT_ALTERNATE_OBJECT_DIRECTORIES 或 $GIT_DIR/objects/info/alternates 中列出的備用物件池中以及 $GIT_DIR/objects/pack 中和備用物件池中相應打包子目錄中找到的打包 Git 歸檔檔案中的物件。這現在是預設設定;您可以使用 --no-full 關閉它。

--connectivity-only

僅檢查可達物件的連線性,確保可達標籤、提交或樹引用的任何物件都存在。這透過完全避免讀取二進位制物件(儘管它仍然檢查引用的二進位制物件是否存在)來加速操作。這將檢測提交和樹中的損壞,但不執行任何語義檢查(例如,格式錯誤)。二進位制物件中的損壞將完全無法檢測到。

不可達的標籤、提交和樹也將被訪問,以查詢歷史中懸空片段的尖端。如果您不關心此輸出並希望進一步加速,請使用 --no-dangling

--strict

啟用更嚴格的檢查,即捕獲由舊版本 Git 建立的、檔案模式中設定了 g+w 位的記錄。現有倉庫,包括 Linux 核心、Git 本身和稀疏倉庫,都包含會觸發此檢查的舊物件,但建議使用此標誌檢查新專案。

--verbose

顯示詳細資訊。

--lost-found

將懸空物件寫入 .git/lost-found/commit/ 或 .git/lost-found/other/,具體取決於型別。如果物件是二進位制物件,其內容將寫入檔案,而不是其物件名稱。

--name-objects

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

--[no-]progress

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

--[no-]references

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

配置

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

fsck.<訊息ID>

在 fsck 過程中,git 可能會發現舊資料的問題,這些資料不會由當前版本的 git 生成,並且如果設定了 transfer.fsckObjects 也不會透過網路傳送。此功能旨在支援處理包含此類資料的舊倉庫。

設定 fsck.<訊息ID> 將被 git-fsck[1] 識別,但要接受此類資料的推送,請改為設定 receive.fsck.<訊息ID>,或者要克隆或抓取它,請設定 fetch.fsck.<訊息ID>

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

color.uicore.editor 等變數不同,如果未設定 receive.fsck.<訊息ID>fetch.fsck.<訊息ID> 變數,它們將不會回退到 fsck.<訊息ID> 配置。要在不同情況下統一配置相同的 fsck 設定,所有這三個變數都必須設定為相同的值。

當設定 fsck.<訊息ID> 時,可以透過配置 fsck.<訊息ID> 設定來將錯誤切換為警告,反之亦然,其中 <訊息ID> 是 fsck 訊息 ID,值為 errorwarnignore 之一。為了方便起見,fsck 會在錯誤/警告前加上訊息 ID,例如“missingEmail: invalid author/committer line - missing email”表示設定 fsck.missingEmail = ignore 將隱藏該問題。

通常,最好使用 fsck.skipList 列舉存在問題的現有物件,而不是列出這些問題物件共有的要忽略的損壞型別,因為後者將允許新的相同損壞例項被忽視。

設定一個未知的 fsck.<訊息ID> 值將導致 fsck 終止,但對 receive.fsck.<訊息ID>fetch.fsck.<訊息ID> 執行相同的操作只會導致 git 發出警告。

有關 <訊息ID> 支援的值,請參閱 git-fsck[1]Fsck 訊息 部分。

fsck.skipList

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

此功能在已建立的專案中很有用,即使早期提交包含可以安全忽略的錯誤(例如無效的提交者電子郵件地址),也應接受它們。注意:損壞的物件不能透過此設定跳過。

fsck.<訊息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* 檢查提交圖檔案。請參閱 git-commit-graph[1]

提取的診斷資訊

unreachable <型別> <物件>

<型別> 物件 <物件> 實際上並未在任何已見的樹或提交中直接或間接引用。這可能意味著您沒有指定另一個根節點,或者該樹已損壞。如果您沒有遺漏根節點,那麼您也可以刪除不可達節點,因為它們無法使用。

missing <型別> <物件>

<型別> 物件 <物件> 被引用但資料庫中不存在。

dangling <型別> <物件>

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

雜湊不匹配 <物件>

資料庫中存在一個物件的雜湊值與物件資料庫中的值不匹配。這表明存在嚴重的資料完整性問題。

FSCK 訊息

以下列出了 git fsck 檢測到的錯誤型別及其含義,以及它們的預設嚴重程度。除了標記為“(FATAL)”的錯誤外,其他錯誤的嚴重程度可以透過設定相應的 fsck.<訊息ID> 配置變數進行調整。

badDate

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

badDateOverflow

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

badEmail

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

badFilemode

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

badName

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

badObjectSha1

(錯誤)物件的 SHA-1 值不正確。

badPackedRefEntry

(錯誤)“packed-refs”檔案包含無效條目。

badPackedRefHeader

(錯誤)“packed-refs”檔案包含無效頭。

badParentSha1

(錯誤)提交物件的父級 SHA-1 值不正確。

badRefContent

(錯誤)引用內容不正確。

badRefFiletype

(錯誤)引用的檔案型別不正確。

badRefName

(錯誤)引用格式無效。

badReferentName

(錯誤)符號引用的被引用名稱無效。

badTagName

(資訊)標籤格式無效。

badTimezone

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

badTree

(錯誤)無法解析樹。

badTreeSha1

(錯誤)樹的格式無效。

badType

(錯誤)發現無效物件型別。

duplicateEntries

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

emptyName

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

emptyPackedRefsFile

(資訊)“packed-refs”檔案為空。如果您看到此錯誤,請報告到 git@vger.kernel.org 郵件列表。由於只有非常早期的 Git 版本才會建立這樣的空“packed_refs”檔案,我們將來可能會收緊此規則。

extraHeaderEntry

(忽略)在 tagger 之後發現額外頭部。

fullPathname

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

gitattributesBlob

(錯誤)在 .gitattributes 處發現非二進位制物件。

gitattributesLarge

(錯誤).gitattributes 二進位制物件過大。

gitattributesLineLength

(錯誤).gitattributes 二進位制物件包含過長的行。

gitattributesMissing

(錯誤)無法讀取 .gitattributes 二進位制物件。

gitattributesSymlink

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

gitignoreSymlink

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

gitmodulesBlob

(錯誤)在 .gitmodules 處發現非二進位制物件。

gitmodulesLarge

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

gitmodulesMissing

(錯誤)無法讀取 .gitmodules 二進位制物件。

gitmodulesName

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

gitmodulesParse

(資訊)無法解析 .gitmodules 二進位制物件。

gitmodulesLarge;(錯誤).gitmodules 二進位制物件過大無法解析。

gitmodulesPath

(錯誤).gitmodules 路徑無效。

gitmodulesSymlink

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

gitmodulesUpdate

(錯誤)發現無效的子模組更新設定。

gitmodulesUrl

(錯誤)發現無效的子模組 URL。

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

(警告)提交物件主體中發現空位元組。

nulInHeader

(致命)物件頭部存在空位元組。

nullSha1

(警告)樹包含指向空 SHA-1 的條目。

packedRefEntryNotTerminated

(錯誤)“packed-refs”檔案包含一個未以換行符終止的條目。

packedRefUnsorted

(錯誤)“packed-refs”檔案未排序。

refMissingNewline

(資訊)一個未以換行符(LF)結尾的鬆散引用。由於 Git 的有效實現從未建立過此類鬆散引用檔案,未來這可能會成為一個錯誤。如果您看到此錯誤,請報告到 git@vger.kernel.org 郵件列表,因為我們需要知道是哪個工具建立了此類檔案。

symlinkRef

(資訊)符號連結被用作符號引用。如果您看到此錯誤,請報告到 git@vger.kernel.org 郵件列表,因為我們正在評估取消支援將符號連結建立為符號引用的可行性。

symrefTargetIsNotARef

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

trailingRefContent

(資訊)鬆散引用有尾隨內容。由於 Git 的有效實現從未建立過此類鬆散引用檔案,未來這可能會成為一個錯誤。如果您看到此錯誤,請報告到 git@vger.kernel.org 郵件列表,因為我們需要知道是哪個工具建立了此類檔案。

treeNotSorted

(錯誤)樹未正確排序。

unknownType

(錯誤)發現未知物件型別。

unterminatedHeader

(致命)物件頭部缺少行尾符。

zeroPaddedDate

(錯誤)作者/提交者行中發現零填充日期。

zeroPaddedFilemode

(警告)在樹中發現零填充檔案模式。

環境變數

GIT_OBJECT_DIRECTORY

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

GIT_INDEX_FILE

用於指定索引的索引檔案

GIT_ALTERNATE_OBJECT_DIRECTORIES

用於指定附加物件資料庫根目錄(通常未設定)

GIT

Git[1] 套件的一部分

scroll-to-top