Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可以让Mercurial保留文件权限吗?_Mercurial_File Permissions - Fatal编程技术网

可以让Mercurial保留文件权限吗?

可以让Mercurial保留文件权限吗?,mercurial,file-permissions,Mercurial,File Permissions,我看过很多博客文章,也亲身经历过,Mercurial不保留从一个回购协议推送到另一个回购协议的文件的权限。有人知道Mercurial扩展可以保留权限吗?我假设它不能用钩子来完成,因为钩子对原始repo的权限了解多少 要求的详细说明: 如果对文件的唯一更改是权限更改(例如,chmod o+r filename),则尝试提交文件失败,并显示一条消息,说明文件未更改 如果我提交了一个权限为600(rw----)的文件,那么克隆repo,克隆中的同一个文件的权限为664(rw-rw-r----):

我看过很多博客文章,也亲身经历过,Mercurial不保留从一个回购协议推送到另一个回购协议的文件的权限。有人知道Mercurial扩展可以保留权限吗?我假设它不能用钩子来完成,因为钩子对原始repo的权限了解多少

要求的详细说明:

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

  • 如果我提交了一个权限为600(rw----)的文件,那么克隆repo,克隆中的同一个文件的权限为664(rw-rw-r----):

此示例显示
hg clone
不保留权限,但
hg push
也不保留权限

在我的应用程序中,一个回购协议是在一个公共可访问的路径上,这一点非常重要

  • 多个用户有权更改回购协议

  • 公共repo中的文件只有在显式设置为可读时才变得可读


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

      看起来可以使用挂钩和辅助工具(以及少量口香糖和捆扎线)来完成:

    • 获取David Hardeman的,它可以保存和恢复文件元数据

    • 更改源代码,使其忽略目录
      .hg
      以及
      .git

    • 使用以下Mercurial挂钩:

       precommit.meta = metastore -s
      
       changegroup.update = hg update
       update.meta   = /usr/unsup/nr/bin/metastore -a
      
    • 您必须将
      .metadata
      文件添加到repo


      此捆绑大部分时间都可以工作,但是如果您只更改权限并希望传播它,则必须运行
      metastore-s
      ,以便将这些更改推送到.metadata文件中,hg将在其中看到更改;否则,提交认为没有什么是新的。

      从以下位置使用此解决方案如何:

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

      下面是一个如何保存 属性以及文件(工作) 在Linux上,如果您有acl包 已安装):

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


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

      我假设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
      

      一般来说,这可能不是一个好主意,但在我的应用程序中,权限是关键元数据,它们必须是正确的。DVCS不是理想的工具,但似乎是最好的工具。你能详细说明一下吗?我可以更改本地文件的权限,提交更改,将它们推送到克隆,克隆将在我更新它时更改权限。关键是我必须提交和更新。是否希望推送到克隆仅从推送更改权限?要在不提交的情况下通知本地更改?推断所有现有权限?确切的问题是什么/我遗漏了什么?@quark:怎么做到的?我在DebianLinux上使用HG1.2.1,我甚至不能让它承认permissinos的更改是值得提交的更改。(注意,我已经按照你的要求进行了详细阐述。)诺曼:事实证明,我缺少的是你想要保留更改为“r”和“w”的事实,而我所说的是更改为“x”(Mercurial从0.6开始跟踪)。我应该意识到你的意思是读/写不可执行。我同意不能轻松管理远程权限可能是一个真正的痛苦。在工作中,通过使用
      setfacl
      ,可以绕过我们的许多权限问题,但它(a)要求您在服务器上实际进行更改,并且(b)更改权限仍然只是文件所有者的权限范围。(b) 这意味着,即使hg允许记录对“rw”的更改,它仍然需要运行
      setuid
      才能在远程端进行更改,但存储库所有者除外。指向Devid Hardeman的链接已过时。新链接:顺便说一句。这里:又提到了一个工具git-cache-meta.sh
      # cd /etc && getfacl -R . >/tmp/acl.$$ && mv /tmp/acl.$$ .acl
      # hg commit
      
      [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