web-dev-qa-db-ja.com

Mercurialでファイルのアクセス許可を保持することはできますか?

Mercurialは、あるリポジトリから別のリポジトリにプッシュされたファイルのアクセス許可を保持しないというブログ投稿をいくつか見て、自分自身で経験しました。パーミッションを保持するMercurial拡張機能を知っている人はいますか?フックは元のリポジトリでのアクセス許可について何を知っているので、フックでは実行できないと思いますか?

要求された詳細:

  • ファイルへの唯一の変更が権限の変更である場合(例: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
    

この例は、hg cloneは権限を保持しませんが、hg Pushもそれらを保存しません。

私のアプリケーションでは、1つのリポジトリが公的にアクセス可能なパス上にあり、それが非常に重要です。

  • 複数のユーザーがリポジトリを変更する権利を持っています

  • パブリックリポジトリ内のファイルは、明示的に読み取り可能にされた場合にのみ読み取り可能になります。

46
Norman Ramsey

フックと補助ツール(および小さなチューインガムと梱包ワイヤー)を使用して実行できるようです。

  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ファイルをリポジトリに追加する必要があります。

このラッシュアップはほとんどの場合機能しますが、only権限を変更してそれを伝達したい場合は、metastore -sを実行する必要があります。これらの変更を.metadataファイルにプッシュするために、hgは変更を確認します。それ以外の場合、コミットは何も新しいものではないと見なします。

33
Norman Ramsey

Mercurial FAQ からこのソリューションを使用するのはどうですか?

設定ファイルの管理にMercurialを使用している場合は、ファイルのプロパティ(所有権とアクセス許可)も追跡することをお勧めします。 Mercurialは、各ファイルの実行可能ビットのみを追跡します。

プロパティをファイルと一緒に保存する方法の例を次に示します(aclパッケージがインストールされている場合はLinuxで機能します)。

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

これは完璧にはほど遠いですが、あなたはその考えを理解します。より洗練されたソリューションについては、etckeeperをチェックしてください。

17
Alexei Tenitski

/ etcディレクトリの特定のケースでは、 etckeeper は面白そうです。

1
Omnifarious

metastoreは、作者のサイトの 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
0