科技 · 實用指南
Git 顯示 index.lock 已存在?刪除前先證明占用者
鎖可能屬於仍在寫入的 Git、崩潰殘留、持續重建它的 hook/IDE,或不可寫入的儲存庫。先解析真實路徑、核對持有者、保存暫存狀態,再修復已證明的邊界。

index.lock 是 Git 更新索引時的保護,不是看到就刪的垃圾。同一訊息可能代表活躍寫入、崩潰殘留、持續重建,或原子重新命名無法完成。
依證據處理:解析路徑、保存暫存狀態、找持有者、判斷重現與可寫性,最後只做一次窄幅修復。
保留狀態并解析真實鎖路徑
先保存完整错误,再运行 git status 與 git diff --cached --stat,確認索引里是否已有准備提交的改动。不要刪除 .git/index;那是二进制索引本体。使用 git rev-parse --path-format=absolute --git-path index.lock 获取 Git 實际使用的路徑。
记录该檔案是否存在、擁有者、權限、大小與修改時间。零字节或時间较旧只能提示可能陈旧,不能证明没有活跃寫入者。Git 用 index.lock 构建新索引,再原子重命名或回滚。
證明是谁占用或重建鎖
Linux/macOS 用 lsof 查询精确路徑;Windows 用 Process Explorer 或 Handle 搜索。先確認程序、账户和父程序,再决定是否停止。它可能是等待编辑器的 Git、IDE、GUI、hook、索引器或自动化任务。
如果没有当前持有者,观察一次受控重试。鎖立刻再出现,說明存在持續生产者或重叠 Git 命令。暫停相關 IDE、hook、watcher 或任务并串行化寫入,不要反复刪鎖。
只刪除已确认的陈旧鎖
只有在路徑准确、没有持有者、原操作已结束且檔案不会立刻重现時,才可判定為陈旧。先保存狀態和暫存摘要,然后只刪除這个 index.lock,不要一并刪除 index、HEAD、refs 或其他鎖。
先执行 git status,再单独重试原寫操作。確認成功后鎖消失,git diff --cached 仍只有预期改动。如果 Git 報出另一个鎖路徑,回到路徑解析,不要扩大刪除范围。
把權限與 unlink 錯誤当作另一类故障
如果 Git 无法创建、重命名或刪除鎖,檢查解析出的 Git 目录的所有权、可寫性與檔案系统。WSL 的 Windows 挂载路徑、網络共享、容器绑定挂载或安全扫描目录都可能與本地檔案系统不同。
不要把 sudo git 或递归 chown 当通用修复;它們可能制造混合所有权或改动无關檔案。只修复证據指向的用户、挂载、防病毒或策略边界,再以原用户重新測試。
用可复现檢查结束事件
只从一个终端运行原 Git 寫操作。核對退出码、鎖是否消失、git status 與 git diff --cached,并记录导致阻塞的程序或陈旧檔案。hook 修改索引時應审查设计,而不是用 --no-verify 隐藏冲突。
自动化應串行化同一索引的寫命令,并记录開始、结束和仓库路徑。不同 worktree 有独立索引狀態,但解析后的路徑始终是权威。
