Mercurial dönüştürme dosya adı kodlaması


12

Mod_wsgi ile Apache üzerinde çalışan Mercurial depoları var. Depoların tüm dosya adları windows-1251 ile kodlanmıştır. Bu kodlama tarihsel nedenlerden dolayı kullanılır: svn'den cıvaya dönüştürüldü, windows-1251 rus yerelini kodlayan varsayılan pencerelerdir.

Şimdi programcılar kod incelemesi için Pota aracını kullanmak istiyor . Utf-8 dışında başka bir kodlamada dosya adlarının altını çizemez. Bu yüzden onları windows-1251'den utf-8'e dönüştürmem gerekiyor. Bunu nasıl yapacağını bilen var mı? Mercurial convert uzantısının kodlamaları dönüştürme seçenekleri yoktur.

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
Rus dosya adları ?! Dosya yeniden adlandırma hakkında düşünmüyor musunuz?
Tembel Porsuk

1
Ben sistem yöneticisi değilim, geliştiriciyim, görevim istikrarlı bir çalışma hizmeti sağlamak, nasıl kullanılacağını öğrenmek değil.
Selivanov Pavel

Matt Mackall uzun zaman önce yazmış , belki de eskidir # Varsayılan # yerel ayar kümeniz yerine UTF-8 ile sayfa sunmak istiyorsanız, bunu aşağıdaki satırları açarak yapabilirsiniz. # Bunun, .hgrc dosyalarınızın # UTF-8'de yorumlanmasına ve tüm repo dosyalarınızın UTF-8 kullanılarak görüntülenmesine neden olacağını unutmayın. # #import os # os.environ ["HGENCODING"] = "UTF-8"
Tembel Porsuk

Aşağıdaki cevaba yorumlarda yazdım: Dosya adlarını okunamaz hale encoding = windows-1251getirmek için değiştirdim encoding = UTF-8. Bunun nedeni, Windows-1251'de depolanmasıdır. "UTF-8" os.environ ["HGENCODING"] = "UTF-8" bu ayara eşittir.
Selivanov Pavel

Yanıtlar:


6

Convert uzantısının şu anda bunu güzel bir şekilde desteklemediğinden emin olabilirsiniz. Yani, X kodlamasından Y kodlamasına yeniden kodlamasını isteyemezsiniz . Ancak, dosyaları sizin için tek tek yeniden adlandırmasını isteyebilirsiniz! İlk olarak adlandırılan bir dosya oluşturmak rename.pyile

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)

O zaman koş

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

Bu, dosya haritanızı oluşturur. Artık kullanabilirsiniz

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

veri havuzunu yeni bir veri havuzuna dönüştürmek. Yeni depoda, dosyalar her zaman UTF-8 dosya adları kullanılarak kaydedilmiş gibi görünecektir.

Not: Dosya adları artık depoda UTF-8 olarak depolanmaktadır. Bu, modern Linux makinelerinde kasaların iyi görüneceği anlamına gelir. Ancak Windows, UTF-8 dosya adlarını kullanmaz. FixUtf-8 uzatma UTF-16 anında içine Mercurial Dönüştür UTF-8 dosya adlarını yapmak için kullanılmalıdır. Bu, Windows'ta da okunabilir dosya adları oluşturur.

Not: Herkes yeni veri havuzunu yeniden kopyalamak zorunda kalacak! Tarihin herhangi bir parçasını değiştirmek, kaçınılmaz olarak tüm değişiklik setleri karmalarını da değiştirir. Bu yüzden, bunu kaldırmak için

  1. herkesi sunucuya zorla,
  2. depodaki sunucuları dönüştürmek,
  3. insanları yeniden klonla

veya

  1. Herkesin yerel depolarında yukarıdaki komutları çalıştırmasını sağlayın
  2. depodaki sunucuları dönüştürmek

Her iki şekilde de dönüşüm belirleyici olduğu için çalışır ve böylece Python'ları varsa kullanıcılarınız bunu kendileri çalıştırabilir. Yalnızca bir TortoiseHg yüklemesi varsa, sunucunuzda onlar için dönüştürmeniz muhtemelen en kolaydır.

Dönüştürme uzantısını daha doğrudan desteklemeye baktım ve bunun için daha doğrudan destek için Mercurial posta listesine bir yama gönderdim .


Posta listesine tam bir yama gönderdim .
Martin Geisler

Pota evangelisti şirketimizden ayrıldı, bu yüzden sorun ortadan kalktı. Sorunumu düzeltmek ve mercurial'ı iyileştirmek için kod yazdığınız için çok teşekkür ederim :) Boş zamanım olduğunda bunu deneyeceğim.
Selivanov Pavel

Ah, sorun çözüldü :-) Denediğinizde cevabımı kabul etmekten çekinmeyin.
Martin Geisler

Hg yok - hepsi cıva 1.8 içinde. Ben userd hg --manifest -r ipucu var. Her şey Linux makinesinde çalışıyor: hgweb.config dosyasında encoding = UTF-8 ile repoda uygun dosya adları görüyorum ve klonlanmış depoda dosya adları doğru. Windows makinede klondan sonra "Пояснител С · Р ° Р · РёРёСЃРєР ° .docx "dosya adı var.
Selivanov Pavel

Evet, bu beklenmelidir - Windows'u klonladığınızda dosya adları kaydedilmez ve kasanız çöp haline gelir. Şimdilik FixUtf8 uzantısını kullanın.
Martin Geisler

2

Ben de aynı problemi yaşadım. Bir sürü depo dönüştürmek gerekiyordu, bu yüzden liste olarak verilen tüm depoları dönüştüren bir komut dosyası yazdım.

kullanımı:

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

Sen alabilirsiniz benim depo BitBucket de.


0

Mercurial Wiki FYI'den sadece çıkarma

Aşağıdakiler, bilinmeyen bir kodlamada açıkça ikili veri olarak ele alınır:

  • dosya içeriği
  • dosya adları

Bu öğeler ikili veri olarak ele alınmalı ve mümkün olduğunca kayıpsız şekilde korunmalıdır.

Bu yüzden, sadece sunum karakter setini değiştirmek encoding =,

Bu varsayım yanlışsa (her zaman mümkündür), FixUtf8 Uzantısını deneyin , bölümü okuyun Mevcut dosya adlarını benioku dosyasından dikkatlice düzeltme


Değişen encoding = windows-1251için encoding = UTF-8okunmaz sadece yapılan dosya adları. FixUtf8 de yardımcı olmadı.
Selivanov Pavel

TAMAM. Encoding = windows-1251 öğesini geri döndürmeyi ve AddDefaultCharset utf-8Apache'de deneyin . Başka bir fikir - WAMP yerini yerel olarak UTF8 ile LAMP olarak değiştirin ve dosya adları ile hiçbir şey yapmayın ama encoding = UTF-8tekrar var
Lazy Badger

Bu ise LAMBA. Eski günlerde depo Subversion ile WAMP'a yerleştirildi, daha sonra Mercurial'a dönüştürdüm ve UTF-8 yerel ayarıyla Linux makinesine taşındım. encoding = windows-1251veriler zaten bu kodlamada olduğu için ayarlandı.
Selivanov Pavel

Wiki'yi tekrar okuyun! 1251 sadece sunum katmanı, depolama değil
Lazy Badger

bilinmeyen bir kodlamada açıkça ikili veri olarak ele alınır ve bu kodlama windows-1251'dir, dosya adları saklanır. Onları UTF-8'e dönüştürmek için bazı
yollara
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.