我已经建立了一个通过apache2提供的存储库。用户首先需要对apache进行身份验证才能读取/写入存储库。 我注意到,如果用户将一些疯狂的名称设置为“用户名”,则此名称将用于提交 - 而不是apache身份验证名称。
现在,有没有办法让
我知道颠覆& apache将始终使用apache登录名,因此也应该使用mercurial,对吧?
修改 我认为我需要的是编写一个钩子,它提取http用户名并检查它是否与提交用户名匹配。如果没有,则应拒绝推送请求。 有谁知道怎么做?
答案 0 :(得分:3)
这是错误的做法,并且保证比你现在试图解决的任何问题更令人头疼和问题。
让我们假设您成功实现了所提出的方法,会发生什么?
好吧,在我的本地存储库中,我正在尝试推送,我有更改集1,2和3,具有哈希ABC,DEF和KLM。出于某种原因,我在提交时没有使用apache用户名,所以根据你提出的修改,它们是错的。
我推送到服务器。
在飞行中,您的代码会更改我的提交,以改为使用apache用户名。这会导致这些变更集的哈希值重新计算,并且不同。换句话说,我的变更集1,2和3现在将具有哈希值XYZ,DEF和JKL。
所以现在我的更改都在服务器上。因为我是最后一个克隆人,所以我在推动期间没有发生冲突。
然而,如果我现在尝试拉动,我现在突然发现有3个我没有的变更集,所以我拉出那些,并发现我现在有3个变更集与我拥有的3个并行,相同的内容,不同的提交者名称和不同的哈希值。
这是每次推送和拉动从现在开始的行为。
你推,然后你可以立即将“相同”的变更集拉回到新的哈希值,与你的并行分支。
现在好玩的开始了。您的本地客户如何发现如何推送?它询问服务器“你有什么?”,然后比较一下。好吧,服务器仍然没有你的3个原始变更集,所以传出命令将会计算,那么应该推送这3个变更集。
但是如果你试图推动它,你就会重新创建相同的3 new 变更集,这些变更集无法推送,所以你会遇到麻烦。
您需要做的是对用户施加以下工作流程:
更好的方法是服务器首先阻止推送,并显示有关使用错误提交名称的消息。
然后,您在尝试推送之前将负担放在用户上以修复这些更改集,例如将它们导入MQ并一次重新应用它们。
或者......不是。
如果我向你拉扯怎么办?你修复了一个错误,而你还没有准备好将所有内容都推送到服务器,所以你允许我从你那里取出,现在我有你的名字的外发变更集,以及一个强制执行 my的服务器所有名称。
现在你应该意识到这种方法会导致很多问题,你基本上试图使分布式版本控制系统像集中式版本控制系统一样。