テクノロジー · 実用ガイド

Git の「cannot lock ref」?削除前にエラー末尾を分類する

「is at… but expected」「exists; cannot create」「unable to resolve」は別の障害です。正確な ref と OID を保存し、競合する書き手を止め、証明できた分岐だけを修復します。

expected old OID の競合、ref 名前空間衝突、壊れた ref または有効な lock を分けるオリジナルイラスト。
オリジナルイラスト:ref を変更する前にエラー末尾で分類します。 Watch at Ease

「Cannot lock ref」はエラーの接頭辞であり、単一の診断ではありません。残りの文が、expected old OID の競合、階層名の衝突、壊れた ref、または lock 作成失敗を示します。

何かを削除する前に完全な行と現在の ref 値を保存します。background fetcher や CI writer を止め、末尾を分類し、新しい作業を残す狭い修復だけを行います。

正確な ref、末尾、OID を保存

完全なエラー、command、repository path と「remote:」の有無を保存します。git rev-parse --git-common-dir、git version、git status --short --branch、完全な ref 名も記録します。

完全な ref に git show-ref --verify を使い、git for-each-ref で周辺名前空間を確認します。変更前に現在 OID と remote 値を保存します。

「is at A but expected B」を競合として扱う

これは compare-and-swap 保護です。Git は B を期待し A を再読しました。background fetch、IDE integration、重複 CI を止め、A が有効な更新か確認します。

A が有効なら fresh fetch または push を一度だけ再実行します。B を強制的に戻したり ref を削除したりすると新しい作業を失います。

名前空間と大小文字衝突を意図的に解決

「X exists; cannot create X/Y」では local と remote の完全な refs を一覧します。file-based storage では foo が foo/bar を妨げます。owner と名称を決め、OID を保存してから変更します。

Windows などでは case-insensitive な比較も行います。clean clone は衝突確認に使えますが、remote branch の無断 rename はできません。

active lock と broken ref を分ける

「unable to resolve reference」では Git command で ref を調べます。packed、loose、symbolic、reftable の可能性があります。git fsck --full を実行し packed-refs を手編集しません。

.lock がある場合は Git process、hook、IDE、backup、server task が所有していないことを証明します。停止済み操作の orphan lock だけが stale-lock 分岐です。

狭い修復を検証して原因を閉じる

local ref 修正が必要なら expected old OID 付き git update-ref を優先します。namespace 衝突は合意した rename/delete 後に fetch、race は fresh retry 一回です。

git show-ref、git fsck --full、一回の fetch または push と remote OID 比較で終了し、並行 writer、階層名、case folding、中断 lock、権限、broken ref の原因を記録します。

Git ref lock 障害の観察、隔離、修復、検証を示すオリジナルイラスト。
オリジナルイラスト:OID を保存し、書き手を隔離し、狭い修復後に検証します。 Watch at Ease