このエラー メッセージは、「ローカルの作業コピーには、更新プログラムが削除しようとする変更済みファイルが含まれています」という意味です。
リモート サーバー (つまり、リモート リポジトリ内) で "hg st" を実行すると、変更されたファイルが表示されます。ファイルのパーミッションの変更は、変更と見なされることに注意してください。
それで何が起こるかはこれです:
- ローカルの Mercurial がファイルをリモート リポジトリにプッシュします
- フックは、リモート リポジトリ内のファイルを変更します (パーミッションを変更することにより)。
- 誰かがそれらのファイルの 1 つを削除しようとしています
Mercurial は常にデータの損失を防ごうとするため、デフォルトのオプションは「ローカルの変更を保存する」です (必要に応じて後でいつでもこれらのファイルを削除できますが、復元できない場合があるため)。
あなたは何ができますか?
リモートリポジトリのアクセス許可を「修正」する代わりに、間違ったアクセス許可を持つ変更セットの受け入れを拒否します。つまり、パーミッションを修正する代わりに、pretxnchangegroup
フックでチェックします。権限が間違っている場合は、中止します。そうすれば、権限が壊れている限りプッシュできません。ドキュメント.
作業コピーを変更する代わりに、ファイルを新しい場所にコピーして、そこで権限を変更します。これはいくらかのディスク容量を浪費します (ただし、ソフト リンクまたはハード リンクを使用する場合に考えられるほどではありません) が、問題を分離します (バージョン管理されたファイルからの特別なアクセス許可)。
[編集]
新しいファイルがローカルに追加され、リモート リポジトリにプッシュされると、実行権限が失われます。
彼らはそれを失うことはありません。そもそも持っていなかったのです。Windows はこの Unix 機能をサポートしていません。
残念ながら、Windows からビットを設定するように Mercurial に指示することはできません。
これを適切に修正するには、次のアプローチを使用します。
- 以前と同様に、Windows からファイルを追加してプッシュする
- パーミッションをチェックし、パーミッションが間違っている場合は電子メールを送信する cron ジョブを Unix サーバー上に作成します。
- メールが来たらUnixサーバーに接続してパーミッションを修正
- Unix からの変更をコミットしてプッシュします。
Windows でファイルを変更すると、Mercurial は実行ビットを保持します。
最後の 2 つのステップをスクリプトに入れることをお勧めします。完全に自動化できるとは思いません。実行中に誰かが変更をプッシュすると、スクリプトは (しばしば?) 失敗します。
PS: より良い解決策を求める機能要求を提出しました: Windows から Unix のアクセス許可を変更する方法を提供する