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.ui和core.editor等变量不同,receive.fsck.<msg-id>和fetch.fsck.<msg-id>变量不会回退到fsck.<msg-id>配置(如果未设置)。要在不同情况下统一配置相同的 fsck 设置,必须将所有三个设置为相同的值。 当设置fsck.<msg-id>时,可以通过配置fsck.<msg-id>设置将错误切换为警告,反之亦然,其中<msg-id>是 fsck 消息 ID,值为error、warn或ignore之一。 设置未知的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.skipList和fetch.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).gitattributesblob 太大。gitattributesLineLength- (ERROR).gitattributesblob 包含太长的行。gitattributesMissing- (ERROR) 无法读取.gitattributesblob。gitattributesSymlink- (INFO).gitattributes是符号链接。gitignoreSymlink- (INFO).gitignore是符号链接。gitmodulesBlob- (ERROR) 在.gitmodules处发现非 blob。gitmodulesLarge- (ERROR).gitmodules文件太大无法解析。gitmodulesMissing- (ERROR) 无法读取.gitmodulesblob。gitmodulesName- (ERROR) 子模块名称无效。gitmodulesParse- (INFO) 无法解析.gitmodulesblob。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) 套件的一部分
