Git
English ▾ 主题 ▾ 最新版本 ▾ 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>…​]

描述

验证数据库中对象的连接性和有效性。

选项

<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 中找到的打包 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 发出警告。

有关 <msg-id> 的支持值,请参阅 git-fsck[1] 的“Fsck 消息”部分。

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 为真,则还会使用 git commit-graph verify 检查提交图文件。参见 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) 树包含错误的文件模式条目。

badName

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

badObjectSha1

(ERROR) 对象的 sha1 无效。

badParentSha1

(ERROR) 提交对象的父 sha1 无效。

badRefFiletype

(ERROR) 引用具有错误的文件类型。

badRefName

(ERROR) 引用格式无效。

badTagName

(INFO) 标签格式无效。

badTimezone

(ERROR) 在作者/提交者行中发现无效的时区。

badTree

(ERROR) 无法解析树。

badTreeSha1

(ERROR) 树格式无效。

badType

(ERROR) 发现无效的对象类型。

duplicateEntries

(ERROR) 树包含重复的文件条目。

emptyName

(WARN) 路径包含空名称。

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 对象。

gitmodulesLarge; (ERROR) .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) 树包含指向空 sha1 的条目。

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] 套件的一部分

scroll-to-top