代码之家  ›  专栏  ›  技术社区  ›  Norman Ramsey

是否可以使mercurial保留文件权限?

  •  45
  • Norman Ramsey  · 技术社区  · 15 年前

    我看到过许多博客文章,我自己也经历过,Mercurial不保留从一个repo推送到另一个repo的文件的权限。有人知道可以保留权限的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中的文件才变得可读。

    5 回复  |  直到 6 年前
        1
  •  33
  •   tshepang Arrie    10 年前

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

    1. 拿到大卫·哈德曼的 Metastore ,保存和恢复文件元数据。

    2. 更改源以便忽略目录 .hg 以及 .git .

    3. 使用以下汞钩:

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

    您必须添加 .metadata 向回购部备案。

    这种捆绑在大多数时候都有效,但是如果你改变 只有 权限和要传播它,必须运行 metastore -s 为了将这些更改推送到.metadata文件中,hg将在其中看到更改;否则提交会认为没有新的内容。

        2
  •  16
  •   Vadim Kotov First Zero    7 年前

    使用这个解决方案 Mercurial FAQ :

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

    下面是如何保存 属性和文件(有效 在Linux上,如果您有 国际计算语言学协会 包裹 安装):

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

    这远非完美,但你明白了。要获得更复杂的解决方案,请查看 ETCKER。

        3
  •  1
  •   tshepang Arrie    10 年前

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

        4
  •  0
  •   Daniel Sokolowski    6 年前

    我以为 元存储 是因为 dead git 链接作者的网站,所以我鞭打下面的直接放在回购的 .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
    
        5
  •  -1
  •   stepancheg    15 年前

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