日本語 ▾ トピック ▾ 最新バージョン ▾ 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 参照、およびすべての参照ログ (--no-reflogs が指定されていない限り) をヘッドとして使用します。

--unreachable

存在するが、どの参照ノードからも到達できないオブジェクトを出力します。

--[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

到達可能なオブジェクトの接続性のみをチェックし、到達可能なタグ、コミット、またはツリーによって参照されるすべてのオブジェクトが存在することを確認します。これにより、ブロブを完全に読み込むことを回避することで操作を高速化します (ただし、参照されるブロブが存在するかどうかはチェックします)。これはコミットやツリーの破損を検出しますが、意味論的チェック (例: フォーマットエラー) は行いません。ブロブオブジェクトの破損は全く検出されません。

到達不能なタグ、コミット、ツリーも、履歴のぶら下がりセグメントの先端を見つけるためにアクセスされます。この出力に関心がなく、さらに高速化したい場合は --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 は、標準エラー出力ストリームがターミナルに接続されていない場合でも、強制的に進行状況を報告します。

設定

このセクションのこの行より下のすべては、git-config[1] ドキュメントから選択的に含まれています。内容はそちらにあるものと同じです。

fsck.<msg-id>

fsck の実行中に、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 設定を統一的に設定するには、3つすべてを同じ値に設定する必要があります。

fsck.<msg-id> が設定されている場合、エラーを警告に、またはその逆に切り替えるには、fsck.<msg-id> 設定を構成します。ここで <msg-id> は fsck メッセージ ID であり、値は errorwarn、または ignore のいずれかです。便宜上、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

致命的ではない方法で破損していることが分かっており、無視すべきオブジェクト名 (つまり、1行に1つの非省略 SHA-1) のリストへのパス。Git 2.20 以降のバージョンでは、コメント (#)、空行、および先頭と末尾の空白は無視されます。古いバージョンでは、1行に SHA-1 以外が含まれているとエラーになります。

この機能は、無効なコミッターのメールアドレスなど、安全に無視できるエラーを初期コミットに含んでいるにもかかわらず、確立されたプロジェクトを受け入れる必要がある場合に役立ちます。注: 破損したオブジェクトは、この設定でスキップすることはできません。

fsck.<msg-id> と同様に、この変数には対応する receive.fsck.skipListfetch.fsck.skipList バリアントがあります。

color.uicore.editor のような変数とは異なり、receive.fsck.skipListfetch.fsck.skipList 変数は、設定されていない場合に fsck.skipList 設定にフォールバックしません。異なる状況で同じ fsck 設定を統一的に設定するには、3つすべてを同じ値に設定する必要があります。

古いバージョンのGit (2.20以前) では、オブジェクト名のリストはソートされているべきだと記述されていました。これは決して必須条件ではありませんでした。オブジェクト名はどのような順序でも出現できましたが、リストを読み込む際に、内部的な二分探索の実装のためにリストがソートされているかどうかを追跡していました。これにより、すでにソートされたリストでは一部の作業を節約できました。非常に巨大なリストでない限り、リストを事前にソートするためにわざわざ手間をかける必要はありませんでした。Gitバージョン2.20以降ではハッシュ実装が代わりに使用されるため、リストを事前にソートする必要はなくなりました。

議論

git-fsck は SHA-1 と一般的なオブジェクトの健全性をテストし、その結果として得られる到達可能性などすべてのものを完全に追跡します。見つかった破損 (欠落または不正なオブジェクト) をすべて出力し、--unreachable フラグを使用すると、存在するが指定されたヘッドノード (または上記のデフォルトセット) のいずれからも到達できないオブジェクトも出力します。

破損したオブジェクトは、バックアップや他のアーカイブで見つける必要があります (つまり、それらを削除して、他のサイトと rsync を行い、誰かが破損したオブジェクトを持っていることを期待するだけです)。

core.commitGraph が true の場合、コミットグラフファイルも 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) author/committer 行の日付フォーマットが無効です。

badDateOverflow

(ERROR) author/committer 行の日付値が範囲外です。

badEmail

(ERROR) author/committer 行のメールアドレスのフォーマットが無効です。

badFilemode

(INFO) ツリーに不正なファイルモードエントリが含まれています。

badName

(ERROR) author/committer 名が空です。

badObjectSha1

(ERROR) オブジェクトの SHA1 が不正です。

badParentSha1

(ERROR) コミットオブジェクトの親の SHA1 が不正です。

badRefContent

(ERROR) ref の内容が不正です。

badRefFiletype

(ERROR) ref のファイルタイプが不正です。

badRefName

(ERROR) ref のフォーマットが無効です。

badReferentName

(ERROR) シンボリック参照の参照先名が無効です。

badTagName

(INFO) タグのフォーマットが無効です。

badTimezone

(ERROR) author/committer 行に無効なタイムゾーンが見つかりました。

badTree

(ERROR) ツリーを解析できません。

badTreeSha1

(ERROR) ツリーのフォーマットが無効です。

badType

(ERROR) 無効なオブジェクトタイプが見つかりました。

duplicateEntries

(ERROR) ツリーに重複するファイルエントリが含まれています。

emptyName

(WARN) パスに空の名前が含まれています。

extraHeaderEntry

(IGNORE) tagger の後に余分なヘッダーが見つかりました。

fullPathname

(WARN) パスに "/" から始まるフルパスが含まれています。

gitattributesBlob

(ERROR) .gitattributes にブロブ以外のものがみつかりました。

gitattributesLarge

(ERROR) .gitattributes ブロブが大きすぎます。

gitattributesLineLength

(ERROR) .gitattributes ブロブに長すぎる行が含まれています。

gitattributesMissing

(ERROR) .gitattributes ブロブを読み取れません。

gitattributesSymlink

(INFO) .gitattributes がシンボリックリンクです。

gitignoreSymlink

(INFO) .gitignore がシンボリックリンクです。

gitmodulesBlob

(ERROR) .gitmodules にブロブ以外のものがみつかりました。

gitmodulesLarge

(ERROR) .gitmodules ファイルが大きすぎて解析できません。

gitmodulesMissing

(ERROR) .gitmodules ブロブを読み取れません。

gitmodulesName

(ERROR) サブモジュール名が無効です。

gitmodulesParse

(INFO) .gitmodules ブロブを解析できませんでした。

gitmodulesLarge; (ERROR) .gitmodules ブロブが大きすぎて解析できません。

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) author/committer 行にメールアドレスがありません。

missingNameBeforeEmail

(ERROR) author/committer 行のメールアドレスの前に名前がありません。

missingObject

(ERROR) タグオブジェクトに object 行がありません。

missingSpaceBeforeDate

(ERROR) author/committer 行の日付の前にスペースがありません。

missingSpaceBeforeEmail

(ERROR) author/committer 行のメールアドレスの前にスペースがありません。

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) ツリーに null SHA1 を指すエントリが含まれています。

refMissingNewline

(INFO) 改行 (LF) で終わっていないルーズリファレンス。Git の有効な実装では、このようなルーズリファレンスファイルは作成されないため、将来的にはエラーになる可能性があります。このエラーが表示された場合は、どのようなツールがこのようなファイルを作成したかを知る必要があるため、git@vger.kernel.org メーリングリストに報告してください。

symlinkRef

(INFO) シンボリックリンクが symref として使用されています。このエラーが表示された場合は、どのようなツールがこのようなファイルを作成したかを知る必要があるため、git@vger.kernel.org メーリングリストに報告してください。

symrefTargetIsNotARef

(INFO) シンボリック参照のターゲットがルート参照も "refs/" で始まる参照も指していません。git symbolic-ref を使用して "ref" 外の参照を指す symref を作成することは許可されていますが、将来的にはこのルールを厳格化する可能性があります。このエラーが表示された場合は、どのようなツールがこのようなファイルを作成したかを知る必要があるため、git@vger.kernel.org メーリングリストに報告してください。

trailingRefContent

(INFO) ルーズリファレンスに末尾のコンテンツがあります。Git の有効な実装では、このようなルーズリファレンスファイルは作成されないため、将来的にはエラーになる可能性があります。このエラーが表示された場合は、どのようなツールがこのようなファイルを作成したかを知る必要があるため、git@vger.kernel.org メーリングリストに報告してください。

treeNotSorted

(ERROR) ツリーが正しくソートされていません。

unknownType

(ERROR) 未知のオブジェクトタイプが見つかりました。

unterminatedHeader

(FATAL) オブジェクトヘッダーの行末がありません。

zeroPaddedDate

(ERROR) author/committer 行にゼロパディングされた日付が見つかりました。

zeroPaddedFilemode

(WARN) ツリーにゼロパディングされたファイルモードが見つかりました。

環境変数

GIT_OBJECT_DIRECTORY

オブジェクトデータベースのルートを指定するために使用されます (通常は $GIT_DIR/objects)

GIT_INDEX_FILE

インデックスのインデックスファイルを指定するために使用されます

GIT_ALTERNATE_OBJECT_DIRECTORIES

追加のオブジェクトデータベースルートを指定するために使用されます (通常は未設定)

GIT

git[1] スイートの一部

scroll-to-top