【完全ガイド】git fatal: Unable to create ‘.git/index.lock’ の原因と解決方法|lock ファイル仕組み・IDE並行動作まで徹底解説

【完全ガイド】git fatal: Unable to create ‘.git/index.lock’ の原因と解決方法|lock ファイル仕組み・IDE並行動作まで徹底解説

Git を使っていて突然、しかも何もしていないタイミングで発生する謎めいたエラー:

$ git add .
fatal: Unable to create '/path/to/repo/.git/index.lock': File exists.

Another git process seems to be running in this repository, e.g.
an editor opened by 'git commit'. Please make sure all processes
are terminated then try again. If it still fails, a git process
may have crashed in this repository earlier:
remove the file manually to continue.

エラーメッセージ自体は割と親切:

  • 「別のGit プロセスが動いてるかも」
  • 「クラッシュしたなら手動で削除して」

しかし、実際は:

  • 自分は他に Git 実行していない!
  • 削除しても、また出る
  • 一度発生すると連続する
  • IDE や CI で頻発

現場では:

  • Ctrl+C で中断した後によく発生
  • VS Code や IDE の Git 統合が並行動作
  • Windows で Git プロセス残留
  • Docker 内 GitLab CI で発生
  • Git LFS 使用時に頻発
  • large repository で発生率高い

このエラーの本質を理解しないと、「削除して → また出る」の無限ループにハマります。

本記事では、Unable to create '.git/index.lock'完全な原因と解決方法を、リファレンスとして実用的に整理します。lock ファイルの仕組み、5つの発生原因、各パターン別対処、他の lock ファイル(HEAD.lock、refs.lock 等)、Docker / CI 対応、Windows特有の問題、実践シナリオ、予防のベストプラクティス、FAQまで完全網羅。この1本でこのエラーを恐れず、根本原因を特定できるようになります。


目次

結論:ほぼ「消せば解決」

時間がない方向けに、最短の対処を先に示します。

90%の場合の解決

# 1. lock ファイル削除
rm .git/index.lock

# 2. 再実行
git add .

これで動きます。ただし、根本原因が別プロセスなら再発します。

まず確認:Git プロセスが動いていないか

# macOS / Linux
ps aux | grep git

# Windows (PowerShell)
Get-Process | Where-Object {$_.ProcessName -like "*git*"}

# または
tasklist | findstr git

動いているなら、まずそちらを停止してから lock ファイル削除。

5大原因

原因症状解決
① 前コマンドの異常終了Ctrl+C 後、頻発rm .git/index.lock
② IDE と CLI の並行動作同時実行どちらかを終了
③ Git for Windows のプロセス残留WindowsTask Manager で終了
④ Git LFS大きいリポジトリLFS 完了待ち
⑤ 権限問題権限エラーchmod で調整

詳細は以下で解説します。


まず理解する:index.lock の仕組み

なぜ lock ファイルが存在するか

Git は複数プロセスが同時に index を書き換えるのを防ぐためにファイルロックを使います:

[プロセス A] git add . 実行中
  ↓ .git/index.lock を作成(ロック取得)
  ↓ .git/index を書き換え中
  ↓ 完了 → .git/index.lock を削除

[プロセス B] 同時に git add . 実行しようとする
  ↓ .git/index.lock がある → 拒否
  ↓ エラー: Unable to create '.git/index.lock'

データ破壊防止の重要な仕組み

.git/index とは

index = staging area の実体。ファイル状態を追跡する重要データ:

.git/
├── HEAD
├── index          ← ステージング情報
├── index.lock     ← 実行中のロック(一時的)
├── refs/
└── objects/

通常、コマンド完了とともに index.lock は自動削除されます。

残る原因

  • コマンドが正常終了しなかった(Ctrl+C、クラッシュ、電源断)
  • 本当に別プロセスが実行中
  • 削除権限がない
  • ディスクフルなどで削除できない

【原因①】前コマンドが異常終了

症状

git commit
# エディタが開く

# メッセージ書かずに Ctrl+C 中断

git add .
# fatal: Unable to create '.git/index.lock': File exists

なぜ起きる

  • git commit 起動 → .git/index.lock 作成
  • エディタが開いた状態でロック保持
  • Ctrl+C で強制中断 → エディタ終了しても lock 消えないケース
  • 別コマンド実行 → 拒否

特に git commit + エディタの組み合わせで多発。

解決

# プロセス確認(念のため)
ps aux | grep git
# または
pgrep -a git

# lock ファイル削除
rm .git/index.lock

# 再実行
git commit

詳細はLinux kill vs pkill vs killall の記事ss コマンドの使い方の記事も参照。


【原因②】IDE と CLI の並行動作

症状

VS Code / JetBrains IDE を開いた状態でCLIから git 実行:

# VS Code で開いているリポジトリ
git add .
# fatal: Unable to create '.git/index.lock': File exists

# → 実は VS Code の Git 統合が定期的に status 取得中

なぜ起きる

現代の IDE はバックグラウンドで git status を定期実行:

  • ファイル変更検知
  • ステータス更新
  • リポジトリスキャン

その瞬間に手動で git 実行するとロック競合。

影響を受けやすい環境

  • VS Code + GitLens 拡張
  • JetBrains IDE(IntelliJ、PyCharm等)
  • SourceTree、GitKraken(バックグラウンド更新)
  • Fork(頻繁に発生報告あり)

解決

方法A: 待って再実行

数秒待って再実行:

sleep 5
git add .

方法B: IDE の Git 統合を停止

VS Code: settings.json

{
  "git.enabled": false,          // 完全無効
  "git.autoRefresh": false,       // 自動更新無効
  "git.autofetch": false,         // 自動 fetch 無効
}

方法C: lock ファイル削除

rm .git/index.lock

方法D: どちらかで作業を統一

IDE内 or CLI のどちらか一つに絞る。


【原因③】Windows でのプロセス残留

症状

Git for Windows(Git Bash 等)で:

git status
# fatal: Unable to create '.git/index.lock': File exists

# lock 削除
rm .git/index.lock

git status
# → また出る!

なぜ起きる

Windows の Git プロセスは残留しやすい傾向:

  • CMD / PowerShell の親子プロセス
  • Git for Windows のヘルパー
  • SSH-agent、Credential Helper
  • IDE のバックグラウンド Git

診断

Task Manager で確認:

Ctrl+Shift+Esc
→ Processes タブ
→ "git" で検索
→ 大量にある可能性

PowerShell で:

Get-Process | Where-Object {$_.ProcessName -like "*git*"}

Cmd で:

tasklist | findstr git

解決

方法A: 全 Git プロセス終了

PowerShell:

Get-Process | Where-Object {$_.ProcessName -like "*git*"} | Stop-Process

Cmd:

taskkill /F /IM git.exe

方法B: 再起動(最終手段)

Windows 再起動で確実にクリア。

方法C: 特定プロセスだけ終了

Task Manager から個別に End Task。


【原因④】Git LFS(大容量リポジトリ)

症状

Git LFS 使用リポジトリで頻発:

git checkout branch
# LFS のダウンロード中
# fatal: Unable to create '.git/index.lock'

なぜ起きる

  • LFS がバックグラウンドでファイル取得中
  • ロック時間が長く、他コマンドと競合
  • 大きなリポジトリで顕著

解決

方法A: LFS 完了を待つ

git lfs pull
# 完了待ってから git 操作

方法B: ステータス確認

git lfs status
# 進行中の LFS 操作

方法C: LFS を一時無効化

git config --global lfs.fetchexclude "*"
# LFS 除外設定(用途に応じて)

方法D: 大きい repo は分割

必要ならリポジトリを機能別に分割。


【原因⑤】権限問題

症状

rm .git/index.lock
# rm: cannot remove '.git/index.lock': Permission denied

診断

ls -la .git/index.lock
# -rw-r--r-- 1 root root ...   ← 別ユーザー所有

解決

sudo で削除:

sudo rm .git/index.lock

所有者変更:

sudo chown -R $(whoami) .git

Windows 特有:

  • ファイル使用中エラー
  • Process Explorer で使用プロセス特定

その他の lock ファイル

.git/index.lock 以外にも lock ファイルが発生します:

.git/HEAD.lock

fatal: Unable to create '.git/HEAD.lock': File exists

HEAD 更新時のロック。同様に削除:

rm .git/HEAD.lock

.git/refs/heads/BRANCH.lock

fatal: Unable to create '.git/refs/heads/main.lock': File exists

ブランチ更新時のロック:

rm .git/refs/heads/main.lock

.git/packed-refs.lock

参照最適化時のロック:

rm .git/packed-refs.lock

一括削除

# 全 lock ファイル削除
find .git -name "*.lock" -type f -delete

⚠️ 実行中のGit プロセスがないことを確認してから


究極の対処法(それでも消せない場合)

.git を丸ごとコピー・削除・戻す

Rizqy Hidayat 氏の tricky solution:

# 1. .git を別の場所にコピー
cp -r .git ../.git.backup

# 2. 元の .git を削除(ここでロックも消える)
rm -rf .git

# 3. コピーから lock ファイル削除
rm ../.git.backup/index.lock

# 4. .git を戻す
mv ../.git.backup .git

# 5. 動作確認
git status

通常の削除でうまくいかない特殊ケースで有効。

Fresh clone(最終手段)

# 現在の変更をバックアップ
cp -r . /tmp/backup

# 削除して clone
cd ..
rm -rf project
git clone https://github.com/user/project.git

# 変更を戻す
cp -r /tmp/backup/src/* project/src/

Docker / CI/CD での対応

GitLab CI での発生

Fetching changes...
fatal: Unable to create '/builds/.../index.lock': File exists.

原因

  • 前回のビルドが異常終了
  • 並列ビルドで競合
  • Runner のキャッシュ問題

対処

方法A: Runner のキャッシュクリア

# .gitlab-ci.yml
variables:
  GIT_STRATEGY: clone   # 毎回 fresh clone

方法B: ビルド前に手動削除

before_script:
  - rm -f .git/index.lock
  - rm -f .git/HEAD.lock

方法C: 並列実行を制限

job1:
  needs: []
  resource_group: production    # 排他制御

GitHub Actions

- name: Clean lock files
  run: |
    find .git -name "*.lock" -type f -delete 2>/dev/null || true

CI 開始時に予防的削除。

Docker container 内

RUN git clone https://github.com/user/repo.git
# → lock file が残ると失敗

# 対処: 毎回削除
RUN find /app/.git -name "*.lock" -delete && git status

詳細はdocker daemon 接続エラーの記事Docker no space left on device の記事も参照。


実践シナリオ

シナリオ1:Ctrl+C 後の対応

git commit
# エディタ開く → Ctrl+C

git add .
# fatal: Unable to create '.git/index.lock'

# 対処
rm .git/index.lock
git add .
# → 成功

シナリオ2:VS Code と CLI 同時作業

# VS Code 開いた状態でCLI
git status
# fatal: Unable to create '.git/index.lock'

# 数秒待つ
sleep 3
git status
# → 通常成功

# 継続発生するなら
rm .git/index.lock

シナリオ3:Windows での大量プロセス

# 症状
git status
# fatal: Unable to create...

# 診断
Get-Process | Where-Object {$_.ProcessName -like "*git*"}
# → 5〜10 個の git.exe

# 全部終了
Stop-Process -Name "git" -Force

# lock 削除
Remove-Item .git/index.lock

git status
# → 成功

シナリオ4:Git LFS リポジトリ

# 大きい LFS リポジトリ
git checkout branch
# LFS ダウンロード中... 数分

# 別ターミナルで
git status
# fatal: Unable to create '.git/index.lock'

# 対処:LFS 完了を待つ
git lfs status
# 完了までしばらく待つ

# または一時的に別作業

シナリオ5:CI/CD で頻発

# .gitlab-ci.yml
variables:
  GIT_STRATEGY: clone   # 毎回 clean
  
before_script:
  - find . -name "*.lock" -delete 2>/dev/null || true

シナリオ6:Rails アプリでの発生

# Rails マイグレーション実行中に
bin/rails db:migrate
# 完了

git status
# → OK

# 別のケース: マイグレーション + git を並行
bin/rails g migration ...   # 内部で git 触る場合あり
git add .
# fatal: Unable to create...

# 対処
rm .git/index.lock
git add .

詳細はrails db:migrate 使い方の記事Rails 8 アップグレードガイドの記事も参照。

シナリオ7:Kamal デプロイ時

kamal deploy
# 内部で git 使用

# 同時にIDE の git status
# → lock 競合

# 対処:デプロイ中は他の git 操作を控える

詳細はKamal 2 デプロイの記事も参照。

シナリオ8:submodule での発生

git submodule update
# submodule 内で lock 発生

# 対処
cd submodule
rm .git    # submodule では .git は file
# fresh init
git submodule update --init --force submodule

シナリオ9:スクリプトの並列実行

# 悪い例
git add . & git commit & git push &
# 並列実行で lock 競合

# 良い例
git add . && git commit -m "..." && git push
# 順次実行

シナリオ10:ネットワークドライブでの問題

# NFS / SMB マウントで
git add .
# lock 応答遅延で問題

# 対処: ローカルストレージ推奨
# または NFS async オプション

予防のベストプラクティス

1. コマンドは順次実行

# ❌ 並列
git add . & git commit &

# ✅ 順次
git add . && git commit

2. IDE の Git 統合設定

VS Code の場合、必要に応じて:

{
  "git.autofetchPeriod": 600,   // 10分に1回
  "git.autoRefresh": true       // 手動で無効化する場合は false
}

3. Ctrl+C は慎重に

git commit のエディタ中断は特にリスク。エディタを正常に閉じる:wq 等)。

4. IDE か CLI どちらかで統一

同じリポジトリの操作は一方に絞る

5. Windows は Task Manager 定期確認

Get-Process git
# 定期的にプロセス数チェック

6. LFS は完了待ち

git lfs status   # 進行中を確認してから

7. スクリプトで pre-check

#!/bin/bash
# git-safe.sh
if [ -f .git/index.lock ]; then
  echo "Warning: index.lock exists, cleaning up..."
  rm .git/index.lock
fi
git "$@"

トラブルシューティング

削除しても再発

別プロセスが動いている証拠:

# 全 git プロセス列挙
ps aux | grep -i git

# 全部 kill
pkill -f git

# lock 削除
rm .git/index.lock

詳細はLinux kill vs pkill vs killall の記事も参照。

rm できない

rm .git/index.lock
# rm: cannot remove: Permission denied
# → sudo

# rm: cannot remove: Device or resource busy
# → 使用中プロセス確認
lsof .git/index.lock

Windows で「使用中」エラー

# Process Explorer で使用プロセス特定
# または Handle.exe
handle .git\index.lock

submodule 内で発生

cd submodule
rm .git   # submodule の .git はファイル
# 親の .git/modules/xxx/index.lock を削除する場合も

git-lfs で発生続ける

# LFS を一時停止
git config lfs.fetch.exclude "*"
git config lfs.fetch.include ""

# 通常作業
git checkout ...

# 復帰
git config --unset lfs.fetch.exclude
git config --unset lfs.fetch.include

CI で消えない

before_script:
  - test -f .git/index.lock && rm .git/index.lock || true

必ず削除する。


よくある質問(FAQ)

Q1. lock ファイル、勝手に削除して大丈夫?

Git プロセスが動いていないことを確認してから削除すれば OK。動作中に削除するとindex 破損の可能性

Q2. 頻繁に発生する

  • IDE の Git 統合が原因(設定見直し)
  • Windows のプロセス残留(再起動)
  • Git LFS(完了待ち)
  • 大きい repository(分割検討)

Q3. lock ファイルを見たい

ls -la .git/*.lock
find .git -name "*.lock"

Q4. 他の lock ファイル種類

  • .git/index.lock(最頻出)
  • .git/HEAD.lock
  • .git/refs/heads/*.lock
  • .git/packed-refs.lock
  • .git/config.lock

Q5. Windows で頻発する

Git for Windows のプロセス残留が主原因。Task Manager で確認・終了。

Q6. CI/CD で発生

GIT_STRATEGY: clone   # 毎回 fresh

または before_script で削除。

Q7. Docker で発生

RUN find /app/.git -name "*.lock" -delete

イメージビルド時に予防的削除。

Q8. GUI ツールでの対応

  • VS Code: 拡張機能の設定
  • SourceTree: 更新間隔設定
  • GitKraken: バックグラウンド更新
  • Fork: Preferences で調整

Q9. Rails / Django プロジェクトで

大量のファイル変更(マイグレーション、静的ファイル)で発生率高い。

対処:

  • IDE の Git 統合を無効化して作業
  • 完了してから git 操作

Q10. Kubernetes / Docker Swarm

複数コンテナが同じ volume を共有する場合、lock 競合発生。volume 分離を推奨。

Q11. LSP / linter が原因?

Language Server の一部は Git 情報を参照。可能性はある。

対処: 一時無効化してテスト。

Q12. リポジトリを共有マシンで使う

複数ユーザーが同時アクセスすると発生。排他利用推奨。


参考リンク・関連資料

Git 公式


まとめ

Unable to create '.git/index.lock' の解決、要点を再整理します。

5大原因

#原因診断解決
前コマンド異常終了Ctrl+C 後rm .git/index.lock
IDE と CLI 並行動作同時実行待機 or 一方停止
Windows プロセス残留Task Manager全プロセス終了
Git LFS大リポジトリ完了待ち
権限問題Permission deniedchmod / sudo

最速の解決手順

# 1. 実行中の git プロセス確認
ps aux | grep git

# 2. なければ削除
rm .git/index.lock

# 3. 再実行
git add .

lock ファイルの仕組み

git コマンド実行 → .git/xxx.lock 作成 → 処理 → lock 削除

正常終了なら自動削除異常終了で残る

削除できる lock ファイル

  • .git/index.lock(最頻出)
  • .git/HEAD.lock
  • .git/refs/heads/*.lock
  • .git/packed-refs.lock
  • .git/config.lock

一括削除:

find .git -name "*.lock" -type f -delete

⚠️ プロセスが動いていないことを確認してから

環境別対策

環境対策
WindowsTask Manager 定期確認
macOS/Linux`ps aux
VS Code拡張の設定
CI/CDbefore_script で削除
DockerDockerfile で予防的削除
Git LFS完了待ち

予防策

  • コマンドは順次実行(並列避ける)
  • IDE か CLI で統一
  • Ctrl+C は慎重に
  • エディタは正常に閉じる
  • CI/CD は fresh clone 戦略
  • large repository は分割検討

事故防止

  • プロセス確認せずに削除しない
  • 通常削除できないなら .git 全体コピー技
  • どうにもならなければ fresh clone

これらの知識は、日常の Git 操作・IDE との併用・Windows 開発・CI/CD・Docker / Kubernetes・大規模リポジトリ運用など、あらゆる場面で活用できます。本記事をブックマークしておけば、このエラーで作業が止まることはなくなります


本記事は2026年6月時点の情報をもとに、Git 2.40+ での動作確認・公式ドキュメントに基づき作成しています。Git のバージョンによって挙動が異なる場合があるため、最新の情報はGit公式ドキュメントもあわせてご確認ください。