--local-branching-on-the-cheap
English ▾ 主题 ▾ 最新版本 ▾ git-fsck 上次更新于 2.48.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 和备用对象池中相应 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 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 标志,它还会打印出存在的但从任何指定的 head 节点(或如上所述的默认集合)都无法访问的对象。

对于任何损坏的对象,你都需要在备份或其他存档中查找(也就是说,你可以直接删除它们,然后与另一个站点进行rsync,希望其他人拥有你已损坏的对象)。

如果 core.commitGraph 为 true,则 commit-graph 文件也将使用 *git commit-graph verify* 进行检查。请参阅 git-commit-graph[1]

提取的诊断信息

unreachable <类型> <对象>

<类型> 对象 <对象> 实际上没有在任何已看到的树或提交中直接或间接引用。 这可能意味着你未指定另一个根节点,或者树已损坏。 如果你没有遗漏根节点,那么不妨删除无法访问的节点,因为它们无法使用。

missing <类型> <对象>

<类型> 对象 <对象>,已被引用,但不存在于数据库中。

dangling <类型> <对象>

<类型> 对象 <对象>,存在于数据库中,但从未使用过 *直接* 。 悬空提交可能是根节点。

hash mismatch <对象>

数据库中有一个对象的哈希与对象数据库值不匹配。 这表明存在严重的数据完整性问题。

FSCK 信息

以下列表列出了 git fsck 检测到的错误类型以及每个错误的含义,以及它们的默认严重程度。 除了标记为“(FATAL)”的错误外,可以通过设置相应的 fsck.<msg-id> 配置变量来调整错误的严重程度。

badDate

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

badDateOverflow

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

badEmail

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

badFilemode

(INFO) 树包含错误的 filemode 条目。

badName

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

badObjectSha1

(ERROR) 对象的 sha1 错误。

badParentSha1

(ERROR) 提交对象的父 sha1 错误。

badRefContent

(ERROR) ref 包含错误内容。

badRefFiletype

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

badRefName

(ERROR) ref 的格式无效。

badReferentName

(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 的条目。

refMissingNewline

(INFO) 不以换行符(LF)结尾的松散引用。 由于 Git 的有效实现从未创建过这样的松散引用文件,因此将来可能会出现错误。 如果你看到此错误,请报告给 git@vger.kernel.org 邮件列表,因为我们需要知道什么工具创建了这样的文件。

symlinkRef

(信息) 一个符号链接被用作 symref。如果您看到此错误,请报告给 git@vger.kernel.org 邮件列表,因为我们正在评估放弃支持将创建符号链接作为 symref 的可行性。

symrefTargetIsNotARef

(信息) 符号引用的目标既不指向根引用,也不指向以 "refs/" 开头的引用。虽然我们允许使用 git symbolic-ref 创建指向 "ref" 之外的引用目标的符号引用,但我们可能会在未来收紧该规则。如果您看到此错误,请报告给 git@vger.kernel.org 邮件列表,因为我们需要知道哪些工具创建了这样的文件。

trailingRefContent

(信息) 一个松散引用有尾随内容。由于 Git 的有效实现从未创建过这样的松散引用文件,因此将来可能会变成一个错误。如果您看到此错误,请报告给 git@vger.kernel.org 邮件列表,因为我们需要知道哪些工具创建了这样的文件。

treeNotSorted

(错误) 一棵树没有正确排序。

unknownType

(错误) 发现一个未知的对象类型。

unterminatedHeader

(致命) 对象头部缺少换行符。

zeroPaddedDate

(错误) 在 author/committer 行中发现一个零填充的日期。

zeroPaddedFilemode

(警告) 在一棵树中发现一个零填充的文件模式。

环境变量

GIT_OBJECT_DIRECTORY

用于指定对象数据库根目录 (通常是 $GIT_DIR/objects)

GIT_INDEX_FILE

用于指定索引的索引文件

GIT_ALTERNATE_OBJECT_DIRECTORIES

用于指定附加的对象数据库根目录 (通常未设置)

GIT

属于 git[1] 套件的一部分

scroll-to-top