为什么Mercurial在尝试推送存储库时返回"Abort:Access is Denied"?

Mut*_*enu 18 mercurial access-control

我遇到了一个问题,用户无法将他的提交推送到Mercurial存储库,并且为什么它不能为他工作而感到困惑.我已经尝试了几件事来弄清楚是什么了,谷歌搜索没有发现任何有用的东西......所以我在这里.

一,配置.我们的网络上有一台Windows XP SP2 x64机器作为我们的官方存储库服务器.它包含几个存储库.我们使用共享的驱动器上的文件夹克隆/推/拉.每个人都有权限进行读取访问.可以推送的用户(包括有问题的用户)可以完全控制.用户的机器是基于Win XP的.我的机器(用于帮助排除故障)也是基于Win XP的.

二,症状.用户正在使用TortoiseHg 2.1.1来完成他的工作.他可以克隆得很好,承诺他的本地回购是等等.当他试图推,但是,TortoiseHg返回一个"abort,ret 255"代码.不是很有帮助.所以,我们已经去了命令行并发布了"hg push -v --debug".这里返回"abort:Access is Denied".这个用户可以写到服务器的共享文件夹没问题 - 他也可以创建文件,目录和删除相同的文件.因此,读/写访问驱动器/文件夹不是问题.

第三,我们的实验结果.以下是测试中的一些奇怪结果.用户创建了一个新的本地测试存储库.我登录到服务器机器并创建了一个测试仓库供他推送.用户签入文件,然后将其推送到服务器计算机上的测试仓库.这很好.没有中止.生活很美好.他能够做更多的推动,并继续按预期工作.然后我将repo克隆到我的机器上,更新了一个文件,并将其推回原处.在用户然后拉入我的更改并尝试推回服务器之后,他再一次遇到了可怕的"访问被拒绝"消息.同时,我仍然可以毫无问题地更新项目.

作为另一个实验,我们让用户注销,另一个用户登录.他们这样做了,并且能够毫无问题地推送到服务器仓库.原始用户重新登录,进行一些更改等,再次点击"访问被拒绝"的砖墙.

据我们所知,该问题与Windows凭据无关.否则,我们希望在服务器的共享文件夹上创建任意文件是行不通的.此外,在我对用户创建的测试仓库进行更新之前,他可以推送到该特定仓库.

有任何想法吗?Mercurial进行哪些额外的凭证检查可能会导致此问题?

更新:

在Wim提示之后,我开始使用'cacls'查看repo各种对象的权限.这是一个"显示或修改文件的访问控制列表"的Windows工具.我让用户创建了一个新的repo,然后获取了权限的快照.然后我检查了一个文件到同一个repo并拍摄了另一个更改快照.

事实证明,有几个repo文件权限因此而得到更新:undo.bookmarks,undo.branch,undo.desc,undo.dirstate,branchheads,00changelog.i,00manifest.i,undo和single存储库的文件.所有这些文件都具有类似于以下内容的权限:

C:\Projects\Mercurial\hgtest4\.hg\store\undo BUILTIN\Administrators:F 
                                         NT AUTHORITY\SYSTEM:F 
                                         DOMAINxxxx\USERIDxxxx:F 
                                         BUILTIN\Users:R 
Run Code Online (Sandbox Code Playgroud)

(实际的DOMAINxxxx和USERIDxxxx值已被更改).在我办理登机手续之前,DOMAINxxxx和USERIDxxxx反映了用户的域名和用户ID.在我办理登机手续后,这些已经更新到我的(我们在同一个域,但用户ID显然是不同的.)我能够检查进出的内容,即使我的用户ID没有列出因为我是BUILTIN\Administrators组的成员.有问题的用户不是.所以,我猜测在我检查完之后,系统不再将他视为具有写访问权限的凭证用户(BUILTIN\User:R表示只读访问),因此导致访问拒绝.

我现在有一个非常严格的Q&D修复程序(用户现在是Admin组的一部分......)真正的修复方法是将repo从Windows共享中恢复到适当的服务器配置.

Wim*_*nen 14

他能够做更多的推动,并继续按预期工作.然后我将repo克隆到我的机器上,更新了一个文件,并将其推回原处.在用户然后拉入我的更改并尝试推回服务器之后,他再一次遇到了可怕的"访问被拒绝"消息.

听起来你的推送创建或修改.hg文件夹中的文件,使得它们(或变得)对其他用户不可访问.

我不是NTFS文件权限的专家,但我认为您可以通过强制该文件夹的所有内容继承其权限来修复此类情况.尝试在文件夹的"高级安全性"设置中选择" 使用此对象的可继承权限替换所有子对象权限 ".

但是,不建议直接与Windows文件共享共享存储库文件.出于性能,数据完整性和安全性的考虑,您需要在用户和存储库文件之间建立服务器进程.如果没有这样的网守,授予提交访问权限也意味着授予销毁/损坏存储库文件的能力(或者在这种情况下发现,更改其权限).

有关其他选项的更多信息,请参阅Mercurial wiki上的发布Mercurial存储库.