Skip to content

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>...]

描述

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

选项

  • <object> - 要视为不可达性跟踪头的对象。 如果未给出对象,'git fsck' 默认使用索引文件、refs 命名空间中的所有 SHA-1 引用以及所有 reflog(除非给出 --no-reflogs)作为头。

  • --unreachable - 打印存在但从任何引用节点不可达的对象。

  • --dangling, --no-dangling - 打印存在但从未被"直接"使用的对象(默认)。--no-dangling 可用于从输出中省略此信息。

  • --root - 报告根节点。

  • --tags - 报告标签。

  • --cache - 将索引中记录的任何对象也视为不可达性跟踪的头节点。

  • --no-reflogs - 不将仅由 reflog 中的条目引用的提交视为可达。此选项仅用于搜索曾经在引用中但现在不在但仍在此引用相应 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 本身和 sparse 仓库)有触发此检查的旧对象,但建议使用此标志检查新项目。

  • --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.<msg-id> 值将导致 fsck 终止,但对 receive.fsck.<msg-id>fetch.fsck.<msg-id> 做同样的事只会导致 git 警告。

  • fsck.skipList - 已知以非致命方式损坏且应忽略的对象名称列表(即每行一个未缩写的 SHA-1)的路径。在 Git 2.20 及更高版本上,注释('#')、空行和任何前导和尾随空格被忽略。在旧版本上,每行除 SHA-1 外的任何内容都会报错。 当已建立的项目应被接受(尽管早期提交包含可以安全忽略的错误,例如无效的提交者电子邮件地址)时,此功能很有用。注意:损坏的对象不能通过此设置跳过。 与 fsck.<msg-id> 一样,此变量有相应的 receive.fsck.skipListfetch.fsck.skipList 变体。

讨论

git-fsck 测试 SHA-1 和一般对象健全性,并对结果的可达性和其他所有内容进行完全跟踪。它打印出发现的任何损坏(缺失或错误的对象),如果您使用 --unreachable 标志,它还将打印存在但从任何指定头节点(或如上所述的默认集)不可达的对象。

您必须在备份或其他存档中找到任何损坏的对象(即,您可以删除它们并与其他站点进行 'rsync',希望有人拥有您损坏的对象)。

如果 core.commitGraph 为 true,commit-graph 文件也将使用 '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) 树包含错误的文件模式条目。
  • badGpgsig - (ERROR) 标签包含错误的(截断的)签名头。
  • badHeadTarget - (ERROR) HEAD 引用是不指向分支的符号引用。
  • badHeaderContinuation - (ERROR) 续行头被意外截断。
  • badName - (ERROR) 作者/提交者名称为空。
  • badObjectSha1 - (ERROR) 对象的 sha1 错误。
  • badPackedRefEntry - (ERROR) "packed-refs" 文件包含无效条目。
  • badPackedRefHeader - (ERROR) "packed-refs" 文件包含无效头。
  • badParentSha1 - (ERROR) 提交对象的父 sha1 错误。
  • badRefContent - (ERROR) 引用内容错误。
  • badRefFiletype - (ERROR) 引用文件类型错误。
  • badRefName - (ERROR) 引用格式无效。
  • badRefOid - (ERROR) 引用指向无效的对象 ID。
  • badReferentName - (ERROR) 符号引用的引用名称无效。
  • badReftableTableName - (WARN) reftable 表名称无效。
  • badTagName - (INFO) 标签格式无效。
  • badTimezone - (ERROR) 在作者/提交者行中发现无效时区。
  • badTree - (ERROR) 无法解析树。
  • badTreeSha1 - (ERROR) 树格式无效。
  • badType - (ERROR) 发现无效的对象类型。
  • duplicateEntries - (ERROR) 树包含重复的文件条目。
  • emptyName - (WARN) 路径包含空名称。
  • emptyPackedRefsFile - (INFO) "packed-refs" 文件为空。
  • 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。
  • gitmodulesPath - (ERROR) .gitmodules 路径无效。
  • gitmodulesSymlink - (ERROR) .gitmodules 是符号链接。
  • gitmodulesUpdate - (ERROR) 发现无效的子模块更新设置。
  • gitmodulesUrl - (ERROR) 发现无效的子模块 url。
  • hasDot - (WARN) 树包含名为 . 的条目。
  • hasDotdot - (WARN) 树包含名为 .. 的条目。
  • hasDotgit - (WARN) 树包含名为 .git 的条目。
  • largePathname - (WARN) 树包含路径名非常长的条目。
  • 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 的条目。
  • packedRefEntryNotTerminated - (ERROR) "packed-refs" 文件包含未以换行符终止的条目。
  • packedRefUnsorted - (ERROR) "packed-refs" 文件未排序。
  • refMissingNewline - (INFO) 松散引用不以换行符(LF)结尾。
  • symlinkRef - (INFO) 符号链接用作符号引用。
  • symrefTargetIsNotARef - (INFO) 符号引用的目标既不指向根引用也不指向以 "refs/" 开头的引用。
  • trailingRefContent - (INFO) 松散引用有尾随内容。
  • 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) 套件的一部分

基于 CC BY-NC-SA 3.0 许可发布