2012-01-10 55 views
1

我有一个“中央”Mercurial存储库,它被配置为使用HTTPS并要求验证克隆推入推送更改。开发人员在自己的计算机上拥有自己的存储库。他们配置其本地设置随意,例如像历史上的Mercurial认证信息

[ui] 
username = anyname 

栏目添加到他们的本地mercurial.ini文件。

当用户尝试将其更改推送到“中央”存储库时,他会进行身份验证,但身份验证信息未存储在Mercurial中。 Mercurial存储在本地配置的用户名作为中央存储库中的修订版本。所以我无法找到真正在中央存储库中进行更改的人员,但我强烈希望这样做。 Mercurial开发人员并不关心它,并认为这种行为是正确的。

但我想保持认证信息附近的变化。我认为最好的方法是在修订说明中添加一个额外的字段,如“推送者ID”并存储认证数据。

我发现的扩展没有实现类似的功能。你可以给我关于一些第三方扩展,钩子或只是代码模板或想法如何做的信息? (我在Python中绝对是新的)

回答

4

使Mercurial开发者(像我自己)拒绝这个的根本问题是,变更集是不可变的。服务器在推送时向变更集添加额外信息是不可能的。

更具体地说:变更集由其变更集散列标识。这个哈希是基于变更集包含的所有信息计算出来的,例如用户名,日期,提交消息和更改本身。如果不更改changset哈希值,则不能更改其中的任何部分 - 否则会损坏储存库的完整性。

这给你安全对服务器上发生意外(或恶意的!)的变化:如果Alice和Bob谈“变更X”,那么他们可以确信他们真正的意思是一样的。如果服务器(或其他人)可以在不影响ID的情况下更改变更集的内容,那么Alice和Bob将不能保证“X”在他们的存储库中真正意味着相同的 。该属性当然也是Mercurial在同步存储库时工作的基础。

你这里有两种选择:

  1. 您可以让服务器拒绝推如果Alice试图推动与鲍勃在名字的变更。这可以通过服务器上的pretxnchangegroup钩子完成。它将检查HG_SOURCE环境变量并确认列出的用户也是HG_NODEtip之间的所有推送更改集的提交者。

  2. 您可以让服务器登录推动器。这被称为“推力日志”。 Mozilla项目uses one和源appears to be here。在那里你可以让你的服务器存储谁推动什么的信息。这是在一个changegroup钩子中完成的,该钩子在一个小型数据库中记录必要的信息。

    如果你想推日志,然后看看Kallithea,它内置了这个功能。卡里地亚是一般举办的Mercurial库的好方法!它的功能比正常的hgweb CGI脚本多得多。

+0

Martin,谢谢你的回答。是的,我的意思是我需要知道“谁推动变革”,而不是“谁创造了它”。不幸的是,我没有发现自己的mozilla的扩展(我认为是错误的关键字)。不幸的是,这个项目非常适合mozilla,不能用于“开箱即用”。无论如何,经过几个小时的阅读文档和测试后,我发现了一个简单的解决方案:只需在授权用户名(HG_URL中提供)和当前时间(具有唯一标记名)的情况下在传入挂钩上标记变更集。 – Sergey 2012-01-11 13:33:50

+0

但我绝对确信这些功能必须立即可用,并希望Hg开发人员能够找到一种方法将“变更集推送者名称”与变更集相关联,至少可以使用即时可用的挂接或扩展。 – Sergey 2012-01-11 13:36:19

+0

@Sergey我同意开箱即可使用此功能可能很酷。它在Kallithea确实退出**。所有解决方案最终都会维护Mercurial历史以外的数据库 - 您可以推出自己的产品,也可以使用Kallithea提供的产品。查看[他们自己的实例](https://kallithea-scm.org/repos/kallithea/)作为示例。 – 2014-07-30 16:19:33