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