Skip to main content
 首页 » 编程设计

mercurial之Mercurial 可以保留文件权限吗

2024年06月03日53freeliver54

我看过许多博客文章,并且亲身经历过,Mercurial 不会保留从一个存储库推送到另一个存储库的文件的权限。有谁知道可以保留权限的 Mercurial 扩展吗?我假设它不能用钩子(Hook)来完成,因为钩子(Hook)知道原始存储库的权限是什么?

要求详细说明:

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

  • 如果我提交一个权限为 600 (rw--------) 的文件,然后克隆存储库,则克隆中的同一文件的权限为 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 
    

此示例显示 hgclone 不保留权限,但 hgpush 也不保留权限。

在我的应用程序中,一个存储库位于可公开访问的路径上,这一点非常重要

  • 多个用户有权更改repo

  • 公共(public)存储库中的文件只有在明确设为可读时才可读。

请您参考如下方法:

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

  1. 获取 David Hardeman 的 Metastore ,它保存和恢复文件元数据。

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

  3. 使用以下 Mercurial Hook :

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

您必须将 .metadata 文件添加到存储库中。

此 lashup 在大多数情况下都有效,但如果您更改权限并希望传播它,则必须运行 metastore -s 才能将这些更改推送到 .metadata 文件中,hg 将在其中看到更改;否则提交认为没有什么新鲜事。