[Mac] gitでerror: non-monotonic index対策

TIPS

Mac環境で git pushgit fetchgit status などのコマンドを実行した際、以下のようなエラーに遭遇することがあります。

error: non-monotonic index .git/objects/pack/._pack-44f2698444c0181e4a.idx
fatal: index file .git/objects/pack/._pack-44f2698444c0181e4a.idx is corrupt

このエラーが発生すると、Gitの操作が一切受け付けられなくなります。

今回はこのエラーが発生する原因と、安全に復旧させる解決策をステップバイステップで解説します。

結論:何が起きているのか?(原因)

ファイル名に注目してください。

.git/objects/pack/._pack-....idx

先頭に ._ が付いています。これはmacOS特有の「AppleDoubleファイル(リソースフォークや拡張属性を保存するための隠しファイル)」です。

発生のメカニズム

  1. macOSが外付けドライブ(exFAT/FAT32等)やネットワーク共有(SMB/NFS)、またはファイル同期ツール(iCloud Drive、Dropbox、Google Drive等)を経由して .git フォルダ内のファイルを扱った際、macOSが自動的に ._ から始まるメタデータファイルを生成します。
  2. Gitは .git/objects/pack/ 配下にある拡張子 .idx のファイルを「すべて正規のGitインデックスファイル」として読み込もうとします。
  3. 当然、中身はAppleのメタデータなのでGitのインデックス規格を満たしておらず、「中身の順序が不正(non-monotonic)」あるいは「破損している(corrupt)」と判定され、処理が停止します。

解決策:対処ステップ

Gitのコミット履歴やソースコード自体が壊れたわけではないため、ゴミとして紛れ込んだ ._ ファイルを削除するだけで即座に解決します。

ステップ1:対象の ._ ファイルを削除する

リポジトリのルートディレクトリ(.git がある場所)で以下のコマンドを実行します。

パターンA:macOS標準の dot_clean コマンドを使う(推奨)

macOSには、この ._ ファイルを本来のファイルに統合・クリーンアップする専用コマンドが用意されています。

dot_clean .git

パターンB:find コマンドで ._ ファイルのみを検索・一括削除する

明示的に .git 内部の不要な ._* ファイルだけを一括削除します。

find .git -name "._*" -delete

(※心配な場合は、まず find .git -name "._*" だけで実行して該当ファイル一覧を確認してから -delete を付与してください)

ステップ2:Gitの整合性を確認する

削除が完了したら、Gitのリポジトリが正常に戻っているかチェックします。

git fsck

エラーが表示されず、git statusgit push が通るようになれば復旧完了です。

git push

今後の再発を防ぐための予防策

この現象は、「GitリポジトリをmacOSがメタデータを生成しやすい環境に置いている」ことが根本的な原因です。以下のポイントを見直してください。

  1. クラウド同期フォルダ(iCloud / Google Drive / Dropbox等)にリポジトリを置かない
    • 自動同期ツールがバックグラウンドで属性ファイルを生成しやすいため、Gitリポジトリはローカル専用領域(~/Projects~/Development など)に配置するのがベストプラクティスです。
  2. 外付けストレージ(exFAT / FAT32)での運用を避ける
    • どうしても外付けSSD等でGitを扱う場合は、APFS(Apple File System)形式でフォーマットされたドライブを利用するとトラブルが激減します。
  3. ネットワークドライブ(NAS / SMB)での ._ 生成を抑制する
    • ネットワーク越しで作業している場合、ターミナルで以下を実行しておくとmacOSがネットワークボリューム上に .DS_Store._ ファイルを作成するのを抑制できます。
      Bashdefaults write com.apple.desktopservices DSDontWriteNetworkStores -bool TRUE

まとめ

  • エラーの正体: macOSが自動生成した ._pack-... というメタデータファイルをGitが誤認したことによるもの。
  • 解決策:dot_clean .git または find .git -name "._*" -delete で不要ファイルを消すだけでOK。
  • ソースコードやコミット履歴が消失したわけではないので、落ち着いて削除コマンドを実行しましょう。

コメント

タイトルとURLをコピーしました