水银资料库损坏


14

这在某种程度上与这个问题有关,但是是一个不同的问题。

我们有一个中央汞库,可通过SSH和mercurial-server向用户提供服务。我们有许多Mac,Linux和Windows客户端连接到它。

现在,有两次Windows用户之一损坏了他们的存储库,然后又将其推回了中央,从而破坏了它的存储库。我想在中央存储库上编写一个传入的钩子脚本,以防止如果事务会破坏中央存储库而被接受。

尽管不幸的是,我对Mercurial的了解还不足以编写这样的脚本。有人遇到过这种可能性吗?我个人不太确定为什么hg在默认情况下不这样做。


我在这里找到了一个解决方案:davidherron.com/blog/topics/…需要在所有客户端上完成。但是,如果有人能够为中央存储库本身做一个更好的解决方案,那就更好了。
bobinabottle

请提供更多详细信息:您在服务器和每个客户端上使用的是哪个版本的Mercurial?
马丁·盖斯勒

2
另外,如果您可以重现此内容,那么对我们(Mercurial开发人员)也将非常有用。也请直接通过我们的邮件列表将此类问题报告给我们:mercurial.selenic.com/wiki/MailingLists或错误跟踪器:selenic.com/mercurial/bts这比在此处发布效率更高:-)
Martin Geisler,2009年

Answers:


4

Mercurial的最新版本(从1.5开始)支持验证传入的数据。加

[server]
validate = True

到服务器的hg配置(或者.hg/hgrchgwebdir配置应该可以正常运行),以使服务器验证传入的数据并拒绝无效的推送。然后,客户端将看到类似于以下内容的错误:

remote: abort: missing file data for beta:dddc47b3ba30e54484720ce0f4f768a0f4b6efb9 - run hg verify

希望有帮助!


2

也许您应该避免完全推送到存储库。借助Mercurial及其分散的性质,每个人都可以拥有自己的分支机构,当他们感觉自己已准备就绪时,他们会告诉您,您就会退出。没有提交访问问题,没有会破坏内容的推送...

当我从SVN迁移到Mercurial时,这至少是我的一个朋友给我的建议。

我不知道,如果这是您的选择,但是为每个人建立一个个人存储库,然后从需要的人员那里拉来,可能比尝试抓住危险的推动力所需的工作更少。


不推到HG失败的全部目的-多个用户一起工作
Anonymouse

0

您是否可以做与David Herron的Blog相同的事情,而不是在预路由上做,而是在中央存储库上的precommit挂钩上做?


否:-(我已经尝试过,但是最终陷入死锁。当客户端尝试推送时,它会在存储库上保留一个锁。运行“ hg verify”还需要一个锁,因此最终只能在其中永久等待一个无休止的循环
。– bobinabottle

同样,即使这确实在预提交上起作用,它也将验证存储库,确定它是可以的,然后提交将破坏它的更改。真的,我需要一个钩子来评估传入的更改是否会破坏回购协议,如果这样做会回滚事务。因此,进入changegroup挂钩将更有意义。
bobinabottle

(使用changegroup钩子仍然会导致死锁)
bobinabottle

有趣的是-钩子似乎是基于python的。您知道什么在破坏存储库吗?每次都是一样的吗?
Ryan Gibbons

0

一种可能的选择是:

  1. 推送后克隆存储库。
  2. 验证一下。
  3. 如果存储库是好的,则将其归档为最新的好数据库
  4. 如果存储库已损坏,则发出警报
  5. 发生警报时,还原最新的已知正常存储库。

此解决方案不是您所需要的,但是至少,您可以通过一种方法来还原存储库以防损坏。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.