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

TIPS
TIPS

Mac環境で git push や git fetch、git 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)」と判定され、処理が停止します。
[rust]cat代替ツール「bat」
Rust製のcat代替ツール「bat」の導入方法や活用術を解説。シンタックスハイライトやGit連携などのメリットを紹介し、Ubuntuでのコマンド名競合問題(batcat)の解決策や、fzfと連携した強力なプレビュー設定まで徹底解説します。

解決策:対処ステップ

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 status や git push が通るようになれば復旧完了です。

git push
[Certbot]新規発行・更新・削除ライフサイクル
Certbotを用いたLet's Encrypt証明書の新規発行、自動更新、そしてrmを使わない正しい完全削除の手順を解説。Apache/Nginxへの反映方法や、削除時のWebサーバー起動エラーを防ぐ注意点など、安全なライフサイクル管理の知見が得られます。

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

この現象は、「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。
  • ソースコードやコミット履歴が消失したわけではないので、落ち着いて削除コマンドを実行しましょう。
Q よくある質問 (FAQ)
Q. 「error: non-monotonic index」が発生すると、コミット履歴やソースコードは消失してしまいますか?
A.
いいえ、ソースコードやコミット履歴は消失していません。macOSが自動生成した不要なメタデータファイル(._ファイル)をGitが誤認しているだけなので、該当ファイルを削除すれば安全に復旧できます。
Q. クラウド同期フォルダ(iCloudやDropbox等)にGitリポジトリを置くとなぜこのエラーが起きるのですか?
A.
同期ツールがバックグラウンドでファイルを処理する際、macOSが拡張属性を保存するための「._」から始まる隠しファイルを生成し、それをGitがインデックスファイルとして読み込んでしまうためです。

コメント

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