Pre-commit钩子因index.lock已存在持续失败的解决求助
解决pre-commit钩子git锁冲突及自动暂存问题
问题根源
pre-commit运行期间会持有.git/index.lock锁,你在钩子的entry里手动执行git add -u时,会因为锁被占用而触发fatal: Unable to create 'xxx/.git/index.lock': File exists错误,导致钩子执行失败。而且pre-commit本身就支持自动暂存钩子修改的文件,不需要手动调用git命令。
解决方案
1. 清理残留的git锁文件
先手动删除已存在的锁文件,避免后续操作继续报错:
rm -f .git/index.lock
2. 修改pre-commit配置,移除手动git add操作
修改.pre-commit-config.yaml,去掉钩子entry中的bash -c 'xxx; git add -u' --部分,恢复钩子的默认执行逻辑,让pre-commit自动处理文件暂存:
修改后的配置片段:
repos: - repo: https://github.com/psf/black rev: 22.12.0 hooks: - id: black name: Run black on staged py files # 移除手动git add,pre-commit会自动暂存修改 - repo: local hooks: - id: pretty-quick name: Prettify staged js/ts/yml files language: system entry: bash -c "if [ -d \"frontend\" ]; then cd frontend; yarn pretty-quick; else echo 'Skipped'; fi" - repo: https://github.com/IamTheFij/docker-pre-commit rev: v2.1.1 hooks: - id: docker-compose-check - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.4.0 hooks: - id: check-toml - id: requirements-txt-fixer - id: fix-encoding-pragma args: [--remove] # 仅保留需要的参数,使用钩子默认entry - id: debug-statements # 使用钩子默认entry,无需手动git add
3. 重新运行pre-commit验证
配置修改完成后,执行以下命令验证钩子是否正常工作:
pre-commit run --all-files
之后再尝试提交代码,钩子会自动处理文件修改并完成暂存,不会再出现锁冲突错误。
补充说明
pre-commit的工作机制是:在运行钩子时,会将暂存的文件复制到临时目录(或直接在原目录操作但持有索引锁),钩子修改文件后,pre-commit会自动识别这些修改并将其合并回主暂存区,完全不需要手动执行git add。手动添加git命令反而会破坏这个流程,导致锁冲突。
内容的提问来源于stack exchange,提问作者Fanto
相关产品推荐
相关产品推荐

