Mercurial変換ファイル名エンコード


12

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

1
ロシアのファイル名?!ファイル名の変更について考えていませんか?
Lazy Badger

1
私はシステム管理者であり、開発者ではありません。私の仕事は、安定したサービスを提供することであり、その使用方法を学ぶことではありません。
セリバノフパベル

Matt Mackall ずっと前に書いた、おそらくすでに古くなっているかもしれません#デフォルトのロケール文字セットの代わりにUTF-8でページを提供したい場合は、#次の行のコメントを外してください。#これにより、.hgrcファイルがUTF-8で解釈され、すべてのリポジトリファイルがUTF-8を使用して表示されることに注意してください。##import os#os.environ ["HGENCODING"] = "UTF-8"
レイジーバジャー

私は以下の回答へのコメントに書いています:ファイル名を読み取り不可能に変更encoding = windows-1251するencoding = UTF-8。これは、windows-1251に格納されているためです。"UTF-8" os.environ ["HGENCODING"] = "UTF-8"はこの設定と同じです。
セリバノフパベル2011

回答:


6

現在、変換拡張機能がこれを適切にサポートしていないことは間違いありません。つまり、エンコーディング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-16にUTF-8のファイル名を変換するために使用する必要があります。これにより、Windowsでも読み取り可能なファイル名が作成されます。

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

  1. みんなにサーバーにプッシュさせ、
  2. サーバー上のリポジトリを変換し、
  3. 人々に再クローンしてもらいます

または

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

変換は確定的であるため、どちらの方法でも機能し、ユーザーがPythonを使用できる場合は、ユーザーが自分で実行できます。TortoiseHgのみがインストールされている場合は、サーバーで変換するのがおそらく最も簡単です。

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


完全なパッチをメーリングリストに投稿しました。
マーティンガイスラー、

クルーシブルエバンジェリストが退職したため、問題は解消されました。私の問題と水銀の改善を修正するためのコードを書いてくれてありがとう:)私が自由時間があるときにこれを試してみます。
セリバノフパヴェル2011

ああ、問題は解決しました:-)試してみたら、私の回答を自由に受け入れてください。
Martin Geisler、2011

hgはありません-Mercurial 1.8ですべてを表しています。hg --manifest -r tipを使用しました。すべてがLinuxマシンで機能します。hgweb.configでエンコード= UTF-8を使用してリポジトリに適切なファイル名が表示され、クローンされたリポジトリでファイル名が正しいことがわかります。Windowsマシンでは、クローン後に「ПояснительнаяР・аписка.docx」というファイル名を取得しました。
パヴェル

はい、これは予想されることです。Windowsにクローンを作成するときにファイル名が再コード化されないため、チェックアウトが不要になります。ここでは、FixUtf8拡張機能を使用します。
Martin Geisler、2011

2

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

使用法:

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

BitBucketの私のリポジトリから取得できます。


0

Mercurial Wiki FYI からの抜粋

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

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

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

したがって、私は、プレゼンテーションの文字セットを変更するだけでencoding =

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


ファイル名を読み取り不可能に変更encoding = windows-1251しましたencoding = UTF-8。FixUtf8も役に立ちませんでした。
セリバノフパベル2011

OK。エンコーディング= windows-1251に戻してAddDefaultCharset utf-8、Apache で試してください。別のアイデア-ロケールとしてUTF8を使用してWAMPをLAMPに変更し、ファイル名に対しては何もしないが、encoding = UTF-8もう一度行う
Lazy Badger

これランプです。昔、リポジトリはSubversionでWAMPに配置されていましたが、後でMercurialに変換し、UTF-8ロケールでLinuxマシンに移動しました。encoding = windows-1251データがすでにこのエンコーディングであったために設定されました。
セリバノフパベル2011

ウィキをもう一度読んでください!1251はプレゼンテーション層であり、ストレージではありません
Lazy Badger

不明なエンコーディングのバイナリデータとして明示的に処理されます。このエンコーディングはwindows-1251であり、ファイル名はその中に格納されます。それらをUTF-8に変換する方法が必要です
Selivanov Pavel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.