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ファイル(リソースフォークや拡張属性を保存するための隠しファイル)」です。
発生のメカニズム
- macOSが外付けドライブ(exFAT/FAT32等)やネットワーク共有(SMB/NFS)、またはファイル同期ツール(iCloud Drive、Dropbox、Google Drive等)を経由して
.gitフォルダ内のファイルを扱った際、macOSが自動的に._から始まるメタデータファイルを生成します。 - Gitは
.git/objects/pack/配下にある拡張子.idxのファイルを「すべて正規のGitインデックスファイル」として読み込もうとします。 - 当然、中身は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 status や git push が通るようになれば復旧完了です。
git push
今後の再発を防ぐための予防策
この現象は、「GitリポジトリをmacOSがメタデータを生成しやすい環境に置いている」ことが根本的な原因です。以下のポイントを見直してください。
- クラウド同期フォルダ(iCloud / Google Drive / Dropbox等)にリポジトリを置かない
- 自動同期ツールがバックグラウンドで属性ファイルを生成しやすいため、Gitリポジトリはローカル専用領域(
~/Projectsや~/Developmentなど)に配置するのがベストプラクティスです。
- 自動同期ツールがバックグラウンドで属性ファイルを生成しやすいため、Gitリポジトリはローカル専用領域(
- 外付けストレージ(exFAT / FAT32)での運用を避ける
- どうしても外付けSSD等でGitを扱う場合は、APFS(Apple File System)形式でフォーマットされたドライブを利用するとトラブルが激減します。
- ネットワークドライブ(NAS / SMB)での
._生成を抑制する- ネットワーク越しで作業している場合、ターミナルで以下を実行しておくとmacOSがネットワークボリューム上に
.DS_Storeや._ファイルを作成するのを抑制できます。
Bashdefaults write com.apple.desktopservices DSDontWriteNetworkStores -bool TRUE
- ネットワーク越しで作業している場合、ターミナルで以下を実行しておくとmacOSがネットワークボリューム上に
まとめ
- エラーの正体: macOSが自動生成した
._pack-...というメタデータファイルをGitが誤認したことによるもの。 - 解決策:
dot_clean .gitまたはfind .git -name "._*" -deleteで不要ファイルを消すだけでOK。 - ソースコードやコミット履歴が消失したわけではないので、落ち着いて削除コマンドを実行しましょう。

コメント