我有一些 Mercurial 存储库,它们由 Apache 通过 HTTP 提供服务。但是有一个专门的用户执行一些自动化测试,需要检查本地存储库。最近,这开始失败,似乎是由于缺乏对大型文件子目录中的文件的权限.hg
:
-rw------- 2 www-data www-data 6.3M 2012-01-02 17:23 9358b828fb64feb37d3599a8735320687fa8a3b2
.hg
默认 umask 应该是 022。我根据以下内容使用了目录的 setgid 设置多个提交者 wiki 页面,但这并不包括.hg/largefiles
在内。但是,据我了解,为此目录设置 gid 并不能解决问题,因为它对hg
这些文件设置了这样的限制性权限。我尝试通过文件系统访问此存储库的其他用户也在该www-data
组中,因此组的额外读取权限足以解决我的问题。
我如何说服 Mercurial 或系统为新文件正确授予此权限?
我正在使用:Mercurial分布式SCM(版本2.1)
答案1
事实证明,这是 Mercurial 中的一个问题,并且 Mercurial 2.1 中没有简单的解决方法。我刚刚发送了三个补丁到 Mercurial 邮件列表来修复这个问题 — 希望您一周后能在 Mercurial 2.1.1 中看到修复。
问题在于,大文件扩展.hg/largefiles/<hash>
通过将数据写入临时文件来创建文件,然后将其重命名为真实名称。它使用标准创建临时文件tempfile
模块在Python中。该模块将权限限制为,600
因为您通常不希望任何人读取您的临时文件。 Largefiles 扩展没有考虑到这一点,只是重命名了该文件。
.hg/store
我的补丁通过在创建临时文件时考虑权限来修复此问题。这应该使大文件与 Mercurial 的其余部分保持一致。
答案2
我不知道是否有 Mercurial 答案,但这是一个通用答案,它可能有效也可能无效,具体取决于 Mercurial 如何选择文件权限。
在文件系统上启用访问控制列表 (ACL)。 (看这个答案以获得说明。)然后设置工作副本的默认 ACL 和当前 ACL,以允许需要访问权限的其他用户或组进行访问。
setfacl -R -d -m group:www-data:rwx /path/to/working/copy
setfacl -R -m group:www-data:rwx /path/to/working/copy