Mercurial 同时访问

Mercurial 同时访问

我们在映射网络驱动器(Windows)上有一个 Mercurial 存储库(稳定分支)。

我想知道如果多个用户同时尝试推送会发生什么情况。或者如果某人在推送过程中拉动另一人,会发生什么情况。

操作系统是否会通知 Mercurial 客户端该文件正在被另一个进程使用并退出?使用此设置是否存在损坏存储库的风险?

答案1

Mercurial 使用锁定文件来保护存储库,避免并发更改。每次只有一个用户可以获取锁定并更改存储库,其他用户会收到“等待存储库锁定”消息。

SMB 支持锁,所以不应该有任何问题(TM)。

答案2

Mercurial 旨在处理并发访问。你可以

  • 单个hg push操作(写操作)和
  • 多重hg pullhg 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 进行这样的设置。

相关内容