可以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上,这是非常重要的
-
多个用户有权更改回购
-
只有在明确可读的情况下,公共回购中的文件才可读。
它看起来可以使用钩子和一个辅助工具(和一些口香糖和打包线)完成:
-
获取David Hardeman的Metastore ,它可以保存和恢复文件元数据。
-
改变源代码,以便忽略目录
.hg
和.git
。 -
使用以下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可执行标志是权限的一部分)。