我看过许多博客文章,并且亲身经历过,Mercurial 不会保留从一个存储库推送到另一个存储库的文件的权限。有谁知道可以保留权限的 Mercurial 扩展吗?我假设它不能用钩子(Hook)来完成,因为钩子(Hook)知道原始存储库的权限是什么?
要求详细说明:
如果对文件的唯一更改是权限更改(例如,
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
此示例显示 hgclone
不保留权限,但 hgpush
也不保留权限。
在我的应用程序中,一个存储库位于可公开访问的路径上,这一点非常重要
多个用户有权更改repo
公共(public)存储库中的文件只有在明确设为可读时才可读。
请您参考如下方法:
看起来可以使用钩子(Hook)和辅助工具(以及一点口香糖和打包线)来完成:
获取 David Hardeman 的 Metastore ,它保存和恢复文件元数据。
更改源代码,使其忽略目录
.hg
以及.git
。使用以下 Mercurial Hook :
precommit.meta = metastore -s changegroup.update = hg update update.meta = /usr/unsup/nr/bin/metastore -a
您必须将 .metadata
文件添加到存储库中。
此 lashup 在大多数情况下都有效,但如果您仅更改权限并希望传播它,则必须运行 metastore -s
才能将这些更改推送到 .metadata 文件中,hg 将在其中看到更改;否则提交认为没有什么新鲜事。