1

请帮助我了解 Mercurial 与 ACL 相结合的机制。

我们的团队使用 Mercurial 作为版本控制系统。设置非常简单:两个开发人员(一个 linux,一个 windows),远程 repo(linux)。每次,windows 用户W签入修改并且 linux 用户L想要在之后拉取,都会显示以下错误消息(取决于更改的文件):

pulling from ssh://user@domain.com
searching for changes
adding changesets
transaction abort!
rollback completed
abort: stream ended unexpectedly (got 0 bytes, expected 4)
remote: abort: Permission denied: /repopath/.hg/store/data/paper/tmp.txt.i

这是因为文件访问是由 linux 的 ACL 列表处理的。使用命令更正 ACL 权限后setfacl,一切运行顺利,L能够拉取。即使W以正确的权限克隆 repo,目录中的(新的/修改的)文件.hg也具有错误的(默认)权限。repo 的父文件夹具有正确的权限集,所以我不知道这些权限是从哪里继承的。

有人遇到过类似的问题吗?先感谢您!

4

3 回答 3

1

在我的 Linux 机器上,我必须为组权限设置粘性位。本质上,当您创建一个将成为您需要使用的 mercurial 存储库的目录时,chmod g+s <repoDirectory> 这将强制在该目录下创建的任何内容对组成员具有读/写/执行权限,而不管他们创建文件的默认设置是什么。我使用的是标准的 Unix 组而不是 ACL 列表,所以我不确定这对你会有什么影响。

于 2012-06-11T14:23:20.740 回答
1

在 .hg/store 中创建新文件时,Mercurial 从.hg/store目录本身复制(经典)文件权限并使用写入用户的用户/组,除非被提到的粘性组位(如@Eric Y)覆盖。在修改其中一个文件时,如果您的用户允许,它会保留现有的所有权和权限umask

据我所知,Mercurial 没有对文件系统级别的 ACL 进行特殊处理——几乎没有工具会这样做,这就是为什么 ACL 系统还包括继承规则的原因,其中目录有自己的 ACL,也有default由其中新创建的对象继承的 ACL目录 -default ACL除了设置其 ACL 之外,您可能还需要考虑设置存储库。

也就是说,您确定您真的要使用 ACL 吗?如果您已经在使用它们并且熟悉它们,那很好,但如果您打破它们只是为了让 2-user-access 在 Mercurial 中工作,那么您将使用专用组(如developers)和粘性组位或使用单个共享 ssh 帐户 dev@unixhost,每个帐户都有单独的 ssh 私钥(有关示例,请参见 Mercurial wiki 中的 SharedSSH 页面)。

ACL 非常强大,但很少需要。

其他读者注意:我们在这个问题中所说的与 Mercurial 的 ACL 扩展无关——它在 Mercurial 中,这是文件系统 ACL 级别的东西。

于 2012-06-11T14:38:26.217 回答
0

只有基于 Debian 的系统(如 Ubuntu)的版本,但您应该查看mercurial-server。它以灵活的方式处理 Mercurial 存储库的访问控制,但在文件系统 ACL 之外。

于 2012-06-16T01:19:13.370 回答