一个仓库同时并发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
2
3
exec 9>/tmp/gitpull.lock
flock -n 9 || exit 1
git pull

保证同一时间只有一个 pull。


3.预防与工程实践建议

在生产部署节点,建议:

  • 部署目录 禁止多人同时操作

  • CI/CD 使用单独 workspace

  • pull 前做锁判断

  • 部署采用:

    • git clone 到新目录
    • 切换软链接
    • 或容器镜像部署
      而不是线上目录直接 pull

大型系统里,“线上 pull”本身就是一种风险操作,成熟方案通常转向不可变部署(immutable deployment),让 Git 只发生在构建阶段,而不是运行阶段