Mercurial konvertiert Dateinamencodierung

12

Ich habe Mercurial-Repositorys, die unter Apache mit mod_wsgi ausgeführt werden. In Repositorys sind alle Dateinamen in Windows-1251 codiert. Diese Codierung wird aus historischen Gründen verwendet: Sie wurden von svn in mercurial konvertiert. Windows-1251 ist die Standard-Windows-Codierung für das russische Gebietsschema.

Jetzt möchten Programmierer das Crucible- Tool zur Codeüberprüfung verwenden. Es kann keine Dateinamen in einer anderen Codierung als utf-8 unterschätzen. Also muss ich sie von Windows-1251 nach UtF-8 konvertieren. Weiß jemand, wie man das macht? Die Mercurial-Konvertierungserweiterung bietet keine Optionen zum Konvertieren von Codierungen.

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
Selivanov Pavel
quelle
1
Russische Dateinamen?! Denken Sie nicht über das Umbenennen von Dateien nach?
Lazy Badger
1
Ich bin Systemadministrator und kein Entwickler. Meine Aufgabe ist es, einen stabilen Arbeitsdienst bereitzustellen und nicht zu lernen, wie man ihn verwendet.
Selivanov Pavel
Matt Mackall hat vor langer Zeit geschrieben, möglicherweise bereits veraltet. # Wenn Sie Seiten mit UTF-8 anstelle Ihres Standard-Zeichensatzes für das Gebietsschema # bereitstellen möchten, können Sie dies tun, indem Sie die folgenden Zeilen auskommentieren. # Beachten Sie, dass dies dazu führt, dass Ihre .hgrc-Dateien in # UTF-8 interpretiert werden und alle Ihre Repo-Dateien mit UTF-8 angezeigt werden. # #import os # os.environ ["HGENCODING"] = "UTF-8"
Lazy Badger
Ich habe in den Kommentaren zu der folgenden Antwort geschrieben: Ändern encoding = windows-1251zu encoding = UTF-8nur Dateinamen unlesbar gemacht. Dies liegt daran, dass sie in Windows-1251 gespeichert sind. "UTF-8" os.environ ["HGENCODING"] = "UTF-8" entspricht dieser Einstellung.
Selivanov Pavel

Antworten:

6

Sie haben Recht, dass die Konvertierungserweiterung dies derzeit nicht auf nette Weise unterstützt. Das heißt, Sie können es nicht bitten, von der Codierung X zur Codierung Y neu zu codieren . Sie können es jedoch bitten, die Dateien einzeln für Sie umzubenennen! Erstellen Sie zuerst eine Datei rename.pymit dem Namen

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)

Dann renne

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

Dadurch wird Ihre Dateikarte erstellt. Sie können jetzt verwenden

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

um das Repository in ein neues Repository zu konvertieren. Im neuen Repository sieht es so aus, als ob die Dateien immer mit UTF-8-Dateinamen gespeichert wurden.

Hinweis: Die Dateinamen werden jetzt als UTF-8 im Repository gespeichert. Dies bedeutet, dass Kassen auf modernen Linux-Computern gut aussehen. Windows verwendet jedoch keine UTF-8-Dateinamen. Die FixUtf-8-Erweiterung muss verwendet werden, damit Mercurial die UTF-8-Dateinamen im laufenden Betrieb in UTF-16 konvertiert. Dadurch werden auch unter Windows lesbare Dateinamen erstellt.

Hinweis: Jeder muss das neue Repository neu klonen! Durch Ändern eines Teils des Verlaufs werden zwangsläufig auch alle Hashes der Änderungssätze geändert. Um dies zu erreichen, müssen Sie entweder

  1. Lassen Sie alle auf den Server pushen,
  2. Konvertieren Sie die Repositorys auf dem Server.
  3. Lassen Sie die Leute neu klonen

oder

  1. Lassen Sie alle die oben genannten Befehle in ihren lokalen Repositorys ausführen
  2. Konvertieren Sie die Repositorys auf dem Server

In beiden Fällen funktioniert dies, da die Konvertierung deterministisch ist und Ihre Benutzer sie selbst ausführen können, wenn Python verfügbar ist. Wenn sie nur eine TortoiseHg-Installation haben, ist es wahrscheinlich am einfachsten, wenn Sie sie auf Ihrem Server konvertieren.

Ich habe versucht , die Konvertierungserweiterung direkter zu unterstützen, und habe einen Patch an die Mercurial-Mailingliste gesendet, um dies direkter zu unterstützen.

Martin Geisler
quelle
Ich habe einen vollständigen Patch auf der Mailingliste veröffentlicht.
Martin Geisler
Der Tiegel-Evangelist hat unser Unternehmen verlassen, sodass das Problem verschwunden ist. Vielen Dank, dass Sie Code geschrieben haben, um mein Problem zu beheben und Quecksilber zu verbessern :) Ich werde es versuchen, wenn ich etwas Freizeit habe.
Selivanov Pavel
Ah, Problem gelöst :-) Fühlen Sie sich frei, meine Antwort zu akzeptieren, wenn Sie es ausprobiert haben.
Martin Geisler
Kein hg - manifestiert sich alles in mercurial 1.8. Ich habe hg --manifest -r Tipp. Alles funktioniert auf einem Linux-Computer: Ich sehe die richtigen Dateinamen im Repo mit der Codierung = UTF-8 in hgweb.config und die Dateinamen sind im geklonten Repository korrekt. Auf einem Windows-Computer habe ich nach dem Klonen den Dateinamen "РџРsяснител СЊРЅР ° СЏ Р · Р ° РїРёСЃРєР ° .docx ".
Selivanov Pavel
Ja, dies ist zu erwarten. Die Dateinamen werden beim Klonen auf Windows nicht neu codiert, sodass Ihre Kaufabwicklung zu Müll wird. Verwenden Sie vorerst die FixUtf8-Erweiterung.
Martin Geisler
2

Ich hatte das gleiche Problem. Ich musste eine Reihe von Repositorys konvertieren, also schrieb ich ein Skript, das alle als Liste angegebenen Repositorys konvertiert.

Verwendung:

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

Sie können von meinem Repository bei BitBucket erhalten.

rominf
quelle
0

Nur Extraktion aus Mercurial Wiki FYI

Folgendes wird in einer unbekannten Codierung explizit als Binärdaten behandelt:

  • Dateiinhalt
  • Dateinamen

Diese Elemente sollten als Binärdaten behandelt und nach Möglichkeit verlustfrei aufbewahrt werden.

So nehme ich an , nur in der Darstellung charset ändern encoding =kann die dicken tun

Wenn diese Annahme falsch ist (es ist immer möglich), versuchen Sie es mit der FixUtf8-Erweiterung . Lesen Sie den Abschnitt Korrigieren vorhandener Dateinamen aus der Readme- Datei sorgfältig

Fauler Dachs
quelle
Durch Ändern encoding = windows-1251auf encoding = UTF-8nur Dateinamen unlesbar gemacht. FixUtf8 hat auch nicht geholfen.
Selivanov Pavel
IN ORDNUNG. Versuchen Sie, encoding = windows-1251 zurückzugeben und versuchen Sie es AddDefaultCharset utf-8in Apache. Eine andere Idee - ändern Sie WAMP in LAMP mit UTF8 als Gebietsschema und tun Sie nichts mit Dateinamen, sondern haben Sie encoding = UTF-8wieder
Lazy Badger
Das ist LAMPE. Früher wurde das Repository mit Subversion auf WAMP gestellt, später konvertierte ich es in Mercurial und wechselte auf einen Linux-Computer mit dem Gebietsschema UTF-8. encoding = windows-1251wurde festgelegt, weil sich die Daten bereits in dieser Codierung befanden.
Selivanov Pavel
Wiki noch einmal lesen! 1251 ist nur Präsentationsschicht, nicht Speicher
Lazy Badger
werden explizit als Binärdaten in einer unbekannten Codierung behandelt. Und diese Codierung ist Windows-1251, Dateinamen werden darin gespeichert. Ich brauche eine Möglichkeit, sie in UTF-8 umzuwandeln
Selivanov Pavel