同時 Git 操作でのテスト
前のステップでは、.git/index.lock
が存在すると git status
などの Git コマンドが実行できなくなることを見ました。このロックファイルは、複数の Git 操作が同時にインデックスを変更しようとする際の問題を防ぐために重要です。
Git 操作が進行中でロックファイルが作成されるシナリオをシミュレートしてみましょう。このシンプルな実験環境では、2 つの Git コマンドをまったく同じ瞬間に実行することはできませんが、その概念を理解することができます。長時間実行される Git コマンド(複雑なリベースや大規模なコミットなど)を実行中に中断されたと想像してみてください。この場合、ロックファイルが残ってしまいます。
前のステップですでに .git/index.lock
ファイルが存在するので、別の Git 操作、たとえばファイルの追加を試してみましょう。まず、新しいファイルを作成します。
echo "This is another file." > another_file.txt
では、このファイルをステージングエリアに追加してみましょう。
git add another_file.txt
おそらく同じ fatal: Unable to create ... .git/index.lock: File exists.
というエラーメッセージが表示されるでしょう。これは、ロックファイルが存在する限り、インデックスとやり取りするほとんどの Git コマンドがブロックされることを確認しています。
他に Git プロセスが実行中でないことを確認したら、この問題を解決するには、手動で .git/index.lock
ファイルを削除する必要があります。rm
コマンドを使用してファイルを削除します。
rm .git/index.lock
ロックファイルが削除されたので、再度 git add
コマンドを試してみましょう。
git add another_file.txt
今度は、ロックエラーなしでコマンドが実行されるはずです。これを git status
を実行することで確認できます。
git status
another_file.txt
が "Changes to be committed" の下に表示され、ステージングエリアに正常に追加されたことを示しているはずです。
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: another_file.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
message.txt
注意: 前の実験で message.txt
をコミットしていない場合、このファイルが追跡対象外のファイルとして表示されることがあります。これは正常な動作です。
この演習では、.git/index.lock
ファイルがどのように保護機能を果たし、中断によって残った場合に手動で削除する方法を示しています。手動でロックファイルを削除する際は常に注意し、他に Git プロセスがアクティブでないことを確認してください。