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つのリポジトリが公的にアクセス可能なパス上にあり、それが非常に重要です。
複数のユーザーがリポジトリを変更する権利を持っています
パブリックリポジトリ内のファイルは、明示的に読み取り可能にされた場合にのみ読み取り可能になります。
フックと補助ツール(および小さなチューインガムと梱包ワイヤー)を使用して実行できるようです。
David Hardemanの Metastore を取得します。これは、ファイルのメタデータを保存および復元します。
ディレクトリ.hg
と.git
を無視するようにソースを変更します。
次のMercurialフックを使用します。
precommit.meta = metastore -s
changegroup.update = hg update
update.meta = /usr/unsup/nr/bin/metastore -a
.metadata
ファイルをリポジトリに追加する必要があります。
このラッシュアップはほとんどの場合機能しますが、only権限を変更してそれを伝達したい場合は、metastore -s
を実行する必要があります。これらの変更を.metadataファイルにプッシュするために、hgは変更を確認します。それ以外の場合、コミットは何も新しいものではないと見なします。
Mercurial FAQ からこのソリューションを使用するのはどうですか?
設定ファイルの管理にMercurialを使用している場合は、ファイルのプロパティ(所有権とアクセス許可)も追跡することをお勧めします。 Mercurialは、各ファイルの実行可能ビットのみを追跡します。
プロパティをファイルと一緒に保存する方法の例を次に示します(aclパッケージがインストールされている場合はLinuxで機能します)。
# cd /etc && getfacl -R . >/tmp/acl.$$ && mv /tmp/acl.$$ .acl # hg commit
これは完璧にはほど遠いですが、あなたはその考えを理解します。より洗練されたソリューションについては、etckeeperをチェックしてください。
/ etcディレクトリの特定のケースでは、 etckeeper は面白そうです。
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