Mercurial可以保留文件权限吗?

时间:2009-08-17 19:05:39

标签: mercurial file-permissions

我已经看过很多博客帖子,并且我自己也经历过,Mercurial不保留从一个repo推送到另一个repo的文件的权限。有没有人知道保留权限的Mercurial扩展?我假设它不能用钩子完成,因为钩子知道原始仓库的权限是什么?

要求详细说明:

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

    < / LI>
  • 如果我提交的文件具有权限600(rw -------),则克隆repo,克隆中的同一文件具有权限664(rw-rw-r - ):< / p>

    : 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也不保留权限。

在我的应用程序中,一个回购邮件是在公共可访问的路径上,并且它非常重要

  • 多个用户有权更改回购

  • 公共仓库中的文件只有在明确可读时才可读。

5 个答案:

答案 0 :(得分:33)

看起来可以使用挂钩和辅助工具(以及一点点口香糖和打包线)来完成:

  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
    
  4. 您必须将.metadata文件添加到repo。

    此lashup大部分时间都可以使用,但如果您只更改 权限并想要传播它,则必须运行metastore -s才能将这些更改推送到.metadata文件,其中hg将看到更改;否则提交认为没有什么是新的。

答案 1 :(得分:16)

如何使用Mercurial FAQ中的此解决方案:

  

如果您使用Mercurial进行配置    文件管理,你可能想要    跟踪文件属性(所有权和    权限)。只有Mercurial    跟踪每个的可执行位    文件。

     

以下是如何保存的示例    属性和文件(工作    在Linux上如果你有 acl 包    安装的):

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

这远非完美,但你明白了。有关更复杂的解决方案,请查看 etckeeper。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

由于作者站点上的dead git链接,我认为 metastore 被放弃了,所以我剔除了下面的内容,这些内容直接放置在repo的.hc/hgrc配置文件中:

[paths]
default = ...

[hooks]
# NOTE: precommit is different than pre-commit, see https://www.mercurial-scm.org/repo/hg/help/hgrc for list of hooks
pre-commit  =
        # export permissions
        hg st -camn0 | sort -z | xargs -0 getfacl > .hg.hook.pre-commit.acl.export
        hg add .hg.hook.pre-commit.acl.export

        # export timestamps
        hg st -camn0 | sort -z | xargs -0 stat > .hg.hook.pre-commit.stat.export
        hg add .hg.hook.pre-commit.stat.export

update =
        # import permissions
        setfacl --restore=.hg.hook.pre-commit.acl.export

        # import timestamps
        # TODO: use touch to restore timestamps

答案 4 :(得分:-1)

在VCS中存储权限不是一个好主意。但是,Mercurial支持“可执行”标志(这与权限不同,尽管在Unix中可执行标志是权限的一部分)。