我们在映射网络驱动器(Windows)上有一个 Mercurial 存储库(稳定分支)。
我想知道如果多个用户同时尝试推送会发生什么情况。或者如果某人在推送过程中拉动另一人,会发生什么情况。
操作系统是否会通知 Mercurial 客户端该文件正在被另一个进程使用并退出?使用此设置是否存在损坏存储库的风险?
答案1
Mercurial 使用锁定文件来保护存储库,避免并发更改。每次只有一个用户可以获取锁定并更改存储库,其他用户会收到“等待存储库锁定”消息。
SMB 支持锁,所以不应该有任何问题(TM)。
答案2
Mercurial 旨在处理并发访问。你可以
- 单个
hg push
操作(写操作)和 - 多重
hg pull
与hg clone
运算(读取运算)
同时。换句话说,读者不必等待彼此,也不必等待单个写入者。写入者必须等待其他写入者。
正如 pehrs 所指出的,这是通过锁。然而,不是通过使用文件系统锁锁定文件本身来完成。相反,会创建一个锁定文件。
在支持锁文件的系统上,锁文件是一个符号链接;在其他系统上,锁文件是一个普通文件。该文件或符号链接包含获取锁的进程的主机名和进程标识符 (PID)。这用于检测过期锁:如果获取锁的进程不再处于活动状态,那么我们可以安全地解除锁。
上述方法可确保每次只有一个进程将数据写入给定存储库。但是,使用网络文件系统时会存在更多危险。一个潜在的问题是
$ hg clone foo bar
foo
在和之间创建硬链接bar
。这样做是为了节省空间并大大加快克隆操作。如果在 中进行新的提交bar
,Mercurial 会在将新数据写入文件之前小心地断开硬链接。它基本上会
$ cp abc abc.tmp
$ rm abc
$ mv abc.tmp abc
确保文件abc
不与任何其他人共享。只有当链接数abc
大于 1 时才会执行此操作。如果链接数为 1,那么首先复制文件将是一种巨大的浪费。现在,问题是一些网络文件系统一直在向 Mercurial 谎报链接数!他们报告了 1,而他们应该报告 2 或更多,这欺骗了 Mercurial 不破坏硬链接。Mercurial 1.6.3 针对这种情况进行了错误修复 — Mercurial 现在将在写入网络驱动器时无条件破坏硬链接。
因此,请确保您使用最新版本的 Mercurial 进行这样的设置。