可以Mercurial保存文件权限吗?

我见过很多博客文章,并且经历过我自己的经验,Mercurial不保留从一个repo推送到另一个repo的文件的权限。 有谁知道将保留权限的Mercurial扩展? 我假设它不能用钩子来完成,因为钩子在原始仓库中知道什么权限?

请求详细说明:

  • 如果对文件的唯一更改是权限更改(例如, chmod o+r filename ),则尝试提交文件失败,并显示文件未更改的消息。

  • 如果我提交权限为600(rw ——-)的文件,那么克隆回购,克隆中的同一文件的权限为664(rw-rw-r–):

     : nr@yorkie 6522 ; hg clone one two updating working directory 1 files updated, 0 files merged, 0 files removed, 0 files unresolved : nr@yorkie 6523 ; ls -l one two one: total 4 -rw------- 1 nr nr 8 Aug 18 21:50 foo two: total 4 -rw-rw-r-- 1 nr nr 8 Aug 18 21:51 foo 

这个例子显示, hg clone不保留权限,但是hg push并不保留它们。

在我的应用程序中,一个回购是在一个公共可访问的path上,这是非常重要的

  • 多个用户有权更改回购

  • 只有在明确可读的情况下,公共回购中的文件才可读。

它看起来可以使用钩子和一个辅助工具(和一些口香糖和打包线)完成:

  1. 获取David Hardeman的Metastore ,它可以保存和恢复文件元数据。

  2. 改变源代码,以便忽略目录.hg.git

  3. 使用以下Mercurial钩子:

      precommit.meta = metastore -s changegroup.update = hg update update.meta = /usr/unsup/nr/bin/metastore -a 

您必须将.metadata文件添加到回购。

这种捆绑在大多数情况下都会起作用,但是如果更改权限并传播权限,则必须运行metastore -s ,以便将这些更改推送到.metadata文件,其中hg将会看到更改; 否则承诺认为没有什么是新的。

从Mercurial常见问题解答中使用这个解决scheme怎么样:

如果您使用Mercurial进行configuration文件pipe理,则可能还需要跟踪文件属性(所有权和权限)。 Mercurial只跟踪每个文件的可执行位。

下面是一个如何保存属性以及文件的例子(如果你已经安装了acl软件包,可以在Linux上运行):

 # cd /etc && getfacl -R . >/tmp/acl.$$ && mv /tmp/acl.$$ .acl # hg commit 

这远非完美,但你明白了。 对于更复杂的解决scheme,请检查etckeeper。

对于/ etc目录的具体情况, etckeeper看起来很有趣。

在VCS中存储权限并不是一个好主意。 但是,Mercurial支持“可执行”标志(即不同于权限,虽然在Unix可执行标志是权限的一部分)。