SMB 网络盘上的 Git 锁文件:一个网络文件系统引发的坑
712 字
4 分钟
SMB 网络盘上的 Git 锁文件:一个网络文件系统引发的坑
把 Git 仓库放在网络盘上(比如用 Obsidian 管理一个远程服务器上的笔记库,本地通过 SMB 挂载),平时没事,某次网络抖动之后,Git 突然全部操作报错:
fatal: Unable to create '.git/index.lock': File exists.fatal: cannot lock ref 'HEAD': Unable to create '.git/refs/heads/main.lock': File exists.添加、提交、推送全挂了。这是 Git 的锁文件机制在网络文件系统上被”坑”了。
根因:网络文件系统不保证原子删除
Git 的锁机制依赖文件系统的一个原子操作:创建锁文件用 O_CREAT | O_EXCL——“如果文件不存在就创建,存在就报错”,这个操作是原子的,用来防止两个进程同时写。
但在 SMB 网络文件系统上,这个保证不牢靠。网络抖动时:
- Git 进程创建了锁文件(
index.lock) - 删除锁文件的操作因为 SMB 网络延迟 / 抖动失败
- 锁文件残留在
.git目录里 - 下次任何 Git 操作看到锁文件存在 → 认为”有进程正在写” → 拒绝执行
网络断一下,锁就永远留下来了。
哪些锁文件会阻塞什么
| 锁文件 | 阻塞的操作 |
|---|---|
.git/index.lock | 任何改暂存区的操作(add、commit) |
.git/HEAD.lock | 改 HEAD(commit、merge、rebase) |
.git/refs/heads/*.lock | 更新分支引用(commit、push、pull) |
立即修复:删掉残留锁文件
在仓库根目录执行:
find .git -name "*.lock" -deleteWindows 命令提示符:
del /q .git\index.lock .git\HEAD.lock 2>nuldel /q .git\refs\heads\*.lock 2>nul注意:删锁文件前确认没有 Git 进程在真正运行——如果有个卡死的 Git 进程握着锁,删了也会被重新创建。
预防:降低碰撞概率
1. 降低自动提交频率。 如果用了”自动备份”类插件(定时自动 commit),把间隔调大到 10-30 分钟。自动提交越频繁,并发碰撞的概率越高。
2. 避免设置包装脚本。 某些工具支持配置自定义 Git 路径 / 包装脚本,但配置可能被迁移到工具内部存储里,之后即使从配置文件删掉也不生效——必须在工具设置界面里手动清空。
3. 考虑本地 + 远程双副本。 如果对可靠性要求高,把仓库放本地,通过同步工具推送到远程,而不是直接在网络盘上跑 Git。
一句话经验
网络文件系统(SMB / NFS / 网盘)对 Git 的原子锁操作支持不稳定。仓库尽量放本地盘,放网络盘就要接受”网络抖动 = 锁残留”的风险,并准备好清理手段。
这不是 Git 的 bug,是”网络文件系统不保证本地盘语义”这个通用事实。凡是依赖原子操作的工具(数据库、Git、构建缓存),放在网络盘上都要多一份警惕。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!
SMB 网络盘上的 Git 锁文件:一个网络文件系统引发的坑
https://heaven-1314.github.io/posts/smb-git-lock-files/相关文章智能推荐
1
Windows 网络盘的"双幽灵"事故:换盘符不是容灾
架构映射网络盘断开后,加了第二个"备用盘符",结果 Explorer 显示两个断开的幽灵盘,越修越乱。根因是把盘符名当成了独立故障域。
2
定时任务凌晨配置白天跑?先查时区
工程实践守护进程内置的定时任务如果用 UTC 解析 cron,配置的"凌晨低峰"实际会在北京时间上午 10 点跑——正好撞高峰。
3
SSH 频繁断连的系统化排查:先列排除清单,别重复试错
运维SSH 天天断连,试了一堆"常见解法"都没用。问题在于每次只换一个变量的纪律没建立,乱试一通。
4
一份342页PDF转Word的活,逼我把6.3GB大模型塞进了8GB笔记本
工程实践百度Unlimited-OCR本地部署全纪录:8GB显存、Blackwell无声失败、Windows反超WSL2、大PDF逐页架构——两天踩坑记。
5
一个人 + AI 的团队,开发测试体系怎么建
工程实践没有测试同事、没有产品经理、没有专职 QA,一个人用 AI 交付业务系统,靠的是把"测试职责"写成制度——三层测试、数据管道检查点、修复验证清单。
随机文章随机推荐







