简体中文 ▾ 主题 ▾ 最新版本 ▾ 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>…​]

描述

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

选项

<对象>

一个要作为不可达性追踪头部的对象。

如果没有给出对象,git fsck 默认使用索引文件,refs 命名空间中所有 SHA-1 引用,以及所有引用日志(除非给出 --no-reflogs)作为头部。

--unreachable

打印出存在的但从任何引用节点都不可达的对象。

--dangling
--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 和备用对象池中相应 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 为真,则还会使用 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

(错误) 作者/提交者行中的日期格式无效。

badDateOverflow

(错误) 作者/提交者行中的日期值无效。

badEmail

(错误) 作者/提交者行中的电子邮件格式无效。

badFilemode

(信息) 树中包含一个错误的文件模式条目。

badGpgsig

(错误) 标签包含一个损坏(截断)的签名(例如,gpgsig)头部。

badHeadTarget

(错误) HEAD 引用是一个符号引用,它不指向一个分支。

badHeaderContinuation

(错误) 延续头部(例如gpgsig)意外截断。

badName

(错误) 作者/提交者名称为空。

badObjectSha1

(错误) 对象具有错误的 sha1。

badPackedRefEntry

(错误) "packed-refs" 文件包含无效条目。

badPackedRefHeader

(错误) "packed-refs" 文件包含无效头部。

badParentSha1

(错误) 提交对象具有错误的父级 sha1。

badRefContent

(错误) 引用内容错误。

badRefFiletype

(错误) 引用文件类型错误。

badRefName

(错误) 引用格式无效。

badRefOid

(错误) 引用指向无效的对象 ID。

badReferentName

(错误) 符号引用的参照名称无效。

badReftableTableName

(警告) reftable 表名无效。

badTagName

(信息) 标签格式无效。

badTimezone

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

badTree

(错误) 树无法解析。

badTreeSha1

(错误) 树格式无效。

badType

(错误) 发现无效对象类型。

duplicateEntries

(错误) 树中包含重复的文件条目。

emptyName

(警告) 路径包含空名称。

emptyPackedRefsFile

(信息) "packed-refs" 文件为空。如果您看到此错误,请报告给 git@vger.kernel.org 邮件列表。由于只有非常早期的 Git 版本会创建这种空的 "packed_refs" 文件,我们将来可能会收紧此规则。

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。

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

(警告) 在提交对象正文中发现 NUL 字节。

nulInHeader

(致命) 对象头中存在 NUL 字节。

nullSha1

(警告) 树中包含指向 null sha1 的条目。

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