Mercurial可以保留文件权限吗?

Nor*_*sey 46 mercurial file-permissions

我已经看过很多博客文章,并且亲身经历过,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
    
    Run Code Online (Sandbox Code Playgroud)

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

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

  • 多个用户有权更改回购

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

Nor*_*sey 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
    
    Run Code Online (Sandbox Code Playgroud)

您必须将.metadata文件添加到仓库.

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


Ale*_*ski 17

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

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

以下是如何将属性与文件一起保存的示例(如果安装了acl软件包,则在Linux上运行):

# cd /etc && getfacl -R . >/tmp/acl.$$ && mv /tmp/acl.$$ .acl
# hg commit
Run Code Online (Sandbox Code Playgroud)

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