web-dev-qa-db-ja.com

Mercurial変換ファイル名エンコーディング

Apacheでmod_wsgiを実行しているMercurialリポジトリがあります。リポジトリには、windows-1251でエンコードされたすべてのファイル名があります。このエンコーディングは歴史的な理由で使用されています:それらはsvnからMercurialに変換され、windows-1251はロシア語ロケールのデフォルトのWindowsエンコーディングです。

今プログラマーはコードレビューに Crucible ツールを使用したいと考えています。 utf-8以外のエンコーディングのファイル名をアンダーサンドすることはできません。だから私はそれらをwindows-1251からutf-8に変換する必要があります。誰でもこれを行う方法を知っていますか? Mercurial変換拡張機能には、エンコーディングを変換するオプションがありません。

hgweb.config:

[web]
#encoding = UTF-8
encoding = windows-1251
#allow_archive = gz, Zip, bz2
allow_archive = Zip
allow_Push = *
Push_ssl = false

[extensions]

[collections]
/data/Mercurial = /data/Mercurial
12
Selivanov Pavel

現在、変換拡張機能はこれを適切にサポートしていません。つまり、エンコーディング[〜#〜] x [〜#〜]からエンコーディング[〜#〜] y [に再コーディングするように要求することはできません。 〜#〜]。ただし、ファイル名を1つずつ変更するように要求できます。まず、rename.pyというファイルを作成します。

import sys
for path in sys.stdin:
    old = path[:-1] # strip newline
    new = old.decode("cp1251").encode("utf-8")
    print 'rename "%s" "%s"' % (old, new)

次に実行します

$ hg manifest --all | python rename.py > rename.txt

これにより、ファイルマップが作成されます。これで使用できます

$ hg convert --filemap rename.txt cp1251-repo utf-8-repo

リポジトリを新しいリポジトリに変換します。新しいリポジトリでは、ファイルは常にUTF-8ファイル名を使用して保存されているように見えます。

注:ファイル名がリポジトリにUTF-8として保存されるようになりました。これは、最新のLinuxマシンではチェックアウトが正常に表示されることを意味します。ただし、WindowsはUTF-8ファイル名を使用しません。 FixUtf-8拡張子 を使用して、MercurialでUTF-8ファイル名をその場でUTF-16に変換する必要があります。これにより、Windowsでも読み取り可能なファイル名が作成されます。

注:全員が新しいリポジトリのクローンを再作成する必要があります!履歴の一部を変更すると、必然的にすべてのチェンジセットハッシュも変更されます。これを取り除くには、次のいずれかを行う必要があります

  1. 全員をサーバーにプッシュさせ、
  2. サーバー上のリポジトリを変換し、
  3. 人々に再クローンを作成させる

または

  1. 誰もがローカルリポジトリで上記のコマンドを実行するようにする
  2. サーバー上のリポジトリを変換します

変換は決定論的であり、Pythonが利用可能であれば、ユーザーは自分で実行できます。TortoiseHgがインストールされているだけの場合は、変換が最も簡単です。サーバ。

私はこれをより直接的にサポートするために変換拡張をサポートすることを検討しました これをより直接サポートするためにMercurialメーリングリストにパッチを送信しました .

6
Martin Geisler

私も同じ問題を抱えていました。たくさんのリポジトリを変換する必要があったので、リストとして指定されたすべてのリポジトリを変換するスクリプトを作成しました。

使用法:

hg_convert_filenames_encoding.py [-h] [-i INPUT_ENCODING] [-o OUTPUT_ENCODING] [-b] [-u] [repositories [repositories ...]]

私のリポジトリ からBitBucketで入手できます。

2
rominf

Mercurial Wiki FYIからの抜粋

以下は、不明なエンコーディングのバイナリデータとして明示的に扱われます。

  • ファイルの内容
  • ファイル名

これらのアイテムはバイナリデータとして扱われ、可能な限りロスレスで保存する必要があります。

したがって、encoding =のプレゼンテーション文字セットを変更するだけで、問題が発生する可能性があると思います。

この仮定が間違っている場合(それは常に可能です)、 FixUtf8 Extension を試して、Readmeから既存のファイル名を注意深く修正する

0
Lazy Badger