47

我看过许多博客文章,并且亲身体验过,Mercurial 不会保留从一个存储库推送到另一个存储库的文件的权限。有谁知道会保留权限的 Mercurial 扩展?我假设它不能用钩子完成,因为钩子对原始仓库的权限了解多少?

要求详细说明:

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

  • 如果我提交一个权限为 600 (rw--------) 的文件,然后克隆 repo,克隆中的同一文件具有权限 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也不保留它们。

在我的应用程序中,一个 repo 位于可公开访问的路径上,重要的是

  • 多个用户有权更改 repo

  • 公共存储库中的文件只有在明确可读时才变得可读。

4

5 回答 5

32

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

  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文件添加到存储库。

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

于 2009-08-18T02:30:29.587 回答
17

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

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

这是一个如何将属性与文件一起保存的示例(如果您安装了acl包,则适用于 Linux):

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

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

于 2009-10-05T22:48:39.833 回答
1

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

于 2009-11-19T07:13:12.080 回答
0

由于作者网站上的死 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
于 2018-10-21T18:37:34.363 回答
-1

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

于 2009-08-17T19:08:16.057 回答