【完全ガイド】git fatal: Unable to create ‘.git/index.lock’ の原因と解決方法|lock ファイル仕組み・IDE並行動作まで徹底解説
- 作成日 2026.07.14
- その他
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本でこのエラーを恐れず、根本原因を特定できるようになります。
- 1. 結論:ほぼ「消せば解決」
- 2. まず理解する:index.lock の仕組み
- 3. 【原因①】前コマンドが異常終了
- 4. 【原因②】IDE と CLI の並行動作
- 5. 【原因③】Windows でのプロセス残留
- 6. 【原因④】Git LFS(大容量リポジトリ)
- 7. 【原因⑤】権限問題
- 8. その他の lock ファイル
- 9. 究極の対処法(それでも消せない場合)
- 10. Docker / CI/CD での対応
- 11. 実践シナリオ
- 12. 予防のベストプラクティス
- 13. トラブルシューティング
- 14. よくある質問(FAQ)
- 14.1. Q1. lock ファイル、勝手に削除して大丈夫?
- 14.2. Q2. 頻繁に発生する
- 14.3. Q3. lock ファイルを見たい
- 14.4. Q4. 他の lock ファイル種類
- 14.5. Q5. Windows で頻発する
- 14.6. Q6. CI/CD で発生
- 14.7. Q7. Docker で発生
- 14.8. Q8. GUI ツールでの対応
- 14.9. Q9. Rails / Django プロジェクトで
- 14.10. Q10. Kubernetes / Docker Swarm
- 14.11. Q11. LSP / linter が原因?
- 14.12. Q12. リポジトリを共有マシンで使う
- 15. 参考リンク・関連資料
- 16. まとめ
結論:ほぼ「消せば解決」
時間がない方向けに、最短の対処を先に示します。
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 のプロセス残留 | Windows | Task 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 公式
- git-add Documentation – add 公式
- gitrepository-layout – .git 構造
まとめ
Unable to create '.git/index.lock' の解決、要点を再整理します。
5大原因
| # | 原因 | 診断 | 解決 |
|---|---|---|---|
| ① | 前コマンド異常終了 | Ctrl+C 後 | rm .git/index.lock |
| ② | IDE と CLI 並行動作 | 同時実行 | 待機 or 一方停止 |
| ③ | Windows プロセス残留 | Task Manager | 全プロセス終了 |
| ④ | Git LFS | 大リポジトリ | 完了待ち |
| ⑤ | 権限問題 | Permission denied | chmod / 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
⚠️ プロセスが動いていないことを確認してから。
環境別対策
| 環境 | 対策 |
|---|---|
| Windows | Task Manager 定期確認 |
| macOS/Linux | `ps aux |
| VS Code | 拡張の設定 |
| CI/CD | before_script で削除 |
| Docker | Dockerfile で予防的削除 |
| 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公式ドキュメントもあわせてご確認ください。
-
前の記事
【完全ガイド】git fatal: not a git repository の原因と解決方法|.git探索順序・Docker/WSL/worktree対応まで徹底解説 2026.07.14
-
次の記事
【完全ガイド】git error: cannot lock ref の原因と解決方法|stale locks・packed-refs・namespace衝突まで徹底解説 2026.07.15
コメントを書く