一个仓库同时并发git pull 触发git并发锁
问题
git pull并发异常:
error: Unable to create '/local/auto/.git/HEAD.lock': File exists.
分析
1.问题本质:Git 并发锁冲突
当执行 git pull 时,Git 需要修改 .git/HEAD,为了避免多个进程同时写入,Git 会先创建一个锁文件 HEAD.lock。
1.1 报错原因
报错:
error: Unable to create .../.git/HEAD.lock: File exists
说明 已经存在一个 Git 进程持有锁,或者之前的 Git 操作异常退出,锁文件没有被清理。
换句话说:
要么现在有人正在 pull / fetch / rebase;
要么上一次 Git 操作被强制终止,留下了“僵尸锁”。
1.2 常见触发场景
- 多个脚本/CI/CD 同时
git pull - 运维脚本并发执行
- git 操作过程中 SSH 断开
- kill -9 强杀 git 进程
- IDE 或自动同步工具后台运行 git
这类问题在自动化部署节点上非常常见。
2.处理方式(安全解锁流程)
2.1 推荐安全处理步骤
先确认是否仍有 Git 进程运行:
1 | ps aux | grep git |
如果存在 git pull/fetch/rebase 等进程,等待其完成或结束进程。
确认没有 Git 进程后,删除锁:
1 | rm -f .git/HEAD.lock |
然后重新执行:
1 | git pull |
即可恢复。
2.2 如果经常出现(自动化环境优化)
如果是 CI/CD 或脚本并发触发:
建议增加互斥锁,例如:
1 | flock -n /tmp/gitpull.lock git pull |
或:
1 | exec 9>/tmp/gitpull.lock |
保证同一时间只有一个 pull。
3.预防与工程实践建议
在生产部署节点,建议:
部署目录 禁止多人同时操作
CI/CD 使用单独 workspace
pull 前做锁判断
部署采用:
- git clone 到新目录
- 切换软链接
- 或容器镜像部署
而不是线上目录直接 pull
大型系统里,“线上 pull”本身就是一种风险操作,成熟方案通常转向不可变部署(immutable deployment),让 Git 只发生在构建阶段,而不是运行阶段。