Mercurial推送至远程仓库遭自身锁阻塞问题求助
问题:Linux向CIFS挂载的Windows共享Mercurial仓库推送失败
背景
- 此前多年正常使用Linux通过CIFS挂载Windows网络共享目录中的Mercurial仓库进行推送操作
- 近期Ubuntu系统更新后出现网络连接问题,重装Network Manager后网络恢复,但Mercurial推送功能失效
故障现象
- 推送前远程仓库无
.hg/lock或.hg/store/wlock锁文件 - 执行推送时提示:
waiting for lock on working directory of
held by '' - 推送过程中远程仓库自动生成
.hg/wlock锁文件,手动删除后会立即重建,推送进程持续阻塞,仅能通过CTRL-C终止
锁状态测试结果
- 在远程仓库执行
hg debuglocks,首次输出:lock: (0s)
wlock: (0s)
(说明执行该命令时创建了锁) - 约1分钟后再次执行
hg debuglocks,输出:lock: (87s)
wlock: (87s)
(锁持续存在,需手动删除或执行hg debuglocks -L -W才能清除) - 本地磁盘仓库执行
hg debuglocks结果正常:lock: free
wlock: free
其他排查信息
- CIFS挂载目录的常规文件操作(创建、删除等)均正常,仅Mercurial锁机制受影响
- 怀疑CIFS的原子文件/锁创建支持失效,但缺乏调试经验
解决思路
1. 检查并调整CIFS挂载参数
Mercurial的锁依赖文件系统的原子操作,系统更新可能导致挂载参数变更。检查/etc/fstab或挂载命令,确保添加以下关键参数:
nobrl:禁用CIFS字节范围锁,避免与Mercurial文件锁冲突serverino:使用服务器端inode编号,保证文件标识一致性file_mode=0777,dir_mode=0777:确保Mercurial有足够权限创建锁文件
示例挂载命令:
mount -t cifs //win-share/path /mnt/hg-repo -o username=xxx,password=xxx,nobrl,serverino,file_mode=0777,dir_mode=0777
2. 验证Mercurial版本兼容性
- 执行
hg --version查看本地版本,若近期更新过Mercurial,尝试回退到之前正常工作的版本测试 - 确认Mercurial是否有已知的CIFS锁机制适配问题,优先使用长期支持版本
3. 测试CIFS原子文件创建能力
手动模拟Mercurial锁的创建逻辑,验证CIFS是否支持原子操作:
mkdir -p /mnt/hg-repo/test-lock cd /mnt/hg-repo/test-lock python3 -c "import os; try: os.open('test.lock', os.O_CREAT | os.O_EXCL); print('原子创建成功'); except FileExistsError: print('原子创建失败')"
若测试失败,说明CIFS挂载的原子操作支持异常,需调整Windows端SMB设置或挂载参数
4. 检查Windows端SMB配置
- 强制Windows共享使用SMB 2.0或3.0版本(避免旧版SMB的锁机制缺陷)
- 确认Windows共享目录的权限设置,确保Linux挂载用户拥有
.hg目录的读写、创建权限 - 查看Windows事件日志,排查是否存在SMB锁相关的错误记录
5. 临时替代方案:使用SSH推送
若以上方法无法快速解决,可绕过CIFS直接通过SSH推送:
- 在Windows端配置SSH服务,开放仓库目录的访问权限
- 本地执行
hg push ssh://user@win-host/path/to/repo完成推送
内容的提问来源于stack exchange,提问作者jjarmagost
相关产品推荐
相关产品推荐

