Mercurial แปลงการเข้ารหัสชื่อไฟล์


12

ฉันมีที่เก็บ Mercurial ทำงานบน Apache ด้วย mod_wsgi ที่เก็บมีชื่อไฟล์ทั้งหมดเข้ารหัสใน windows-1251 การเข้ารหัสนี้ใช้สำหรับเหตุผลในอดีต: มันถูกแปลงเป็น mercurial จาก svn, 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
ฉันเป็นผู้ดูแลระบบไม่ใช่นักพัฒนาหน้าที่ของฉันคือการให้บริการการทำงานที่มั่นคงไม่เรียนรู้วิธีใช้
Selivanov Pavel

Matt Mackall เขียนเมื่อนานมาแล้วอาจล้าสมัยไปแล้ว # หากคุณต้องการให้บริการหน้าเว็บด้วย UTF-8 แทนที่จะเป็น # chaleet เริ่มต้นของคุณคุณสามารถทำได้โดยยกเลิกการใส่เครื่องหมายบรรทัดต่อไปนี้ # โปรดทราบว่าสิ่งนี้จะทำให้ไฟล์. hgrc ของคุณถูกตีความใน # UTF-8 และไฟล์ repo ทั้งหมดของคุณจะแสดงโดยใช้ UTF-8 # #import os # os.environ ["HGENCODING"] = "UTF-8"
Lazy Badger

ฉันเขียนความคิดเห็นเป็นด้านล่างคำตอบ: การเปลี่ยนencoding = windows-1251เป็นencoding = UTF-8ชื่อไฟล์ที่ทำไม่สามารถอ่านได้ นี่เป็นเพราะพวกเขาจะถูกเก็บไว้ใน windows-1251 "UTF-8" os.environ ["HGENCODING"] = "UTF-8" เท่ากับการตั้งค่านี้
Selivanov Pavel

คำตอบ:


6

คุณถูกที่ส่วนขยายการแปลงไม่รองรับสิ่งนี้ในทางที่ดีในปัจจุบัน นั่นคือคุณไม่สามารถขอให้ Recode จากการเข้ารหัสXการเข้ารหัสY อย่างไรก็ตามคุณสามารถขอให้เปลี่ยนชื่อไฟล์ทีละไฟล์สำหรับคุณ! ขั้นแรกให้สร้างไฟล์ที่เรียก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เพื่อรับการสนับสนุนโดยตรงมากกว่านี้


ฉันโพสต์แพทช์เต็มในรายการส่งเมล
Martin Geisler

ผู้สอนศาสนาที่มีความสามารถออกจาก บริษัท ของเราดังนั้นปัญหาจึงหายไป ขอบคุณมากสำหรับการเขียนโค้ดเพื่อแก้ไขปัญหาและปรับปรุง Mercurial :) ฉันจะลองใช้เมื่อฉันมีเวลาว่าง
Selivanov Pavel

อ่าปัญหาได้รับการแก้ไข :-) คุณสามารถยอมรับคำตอบของฉันเมื่อคุณได้ลองแล้ว
Martin Geisler

ไม่มี hg - แสดงรายการทั้งหมดใน mercurial 1.8 ฉันได้ userd hg - แสดงคำแนะนำ -r ทุกอย่างทำงานบนเครื่อง Linux: ฉันเห็นชื่อไฟล์ที่เหมาะสมใน repo ด้วยการเข้ารหัส = UTF-8 ใน hgweb.config และชื่อไฟล์นั้นถูกต้องในที่เก็บโคลน บนเครื่อง Windows ฉันได้รับ "ПояѾнительнаязЏискннннР.Р.РafterРafterР.Р." หลังจากโคลน
Selivanov Pavel

ใช่ต้องคาดหวัง - ชื่อไฟล์จะไม่ถูกบันทึกใหม่เมื่อคุณโคลนเข้าสู่ Windows และการชำระเงินของคุณจะกลายเป็นขยะ ใช้ส่วนขยาย FixUtf8 ในตอนนี้
Martin Geisler

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 ก็ไม่ได้ช่วยอะไรเช่นกัน
Selivanov Pavel

ตกลง. ลองส่งคืนการเข้ารหัสกลับ = windows-1251 และลองAddDefaultCharset utf-8ใน Apache แนวคิดอื่น - เปลี่ยน WAMP เป็น LAMP ด้วย UTF8 เป็น locale และไม่ทำอะไรกับชื่อไฟล์ แต่มีencoding = UTF-8อีกครั้ง
Lazy Badger

นี่คือหลอดไฟ ในสมัยก่อนพื้นที่เก็บข้อมูลถูกวางไว้บน WAMP ด้วยการโค่นล้มหลังจากนั้นฉันแปลงเป็น Mercurial และย้ายไปยังเครื่อง Linux ด้วยตำแหน่งที่ตั้ง UTF-8 encoding = windows-1251ถูกตั้งค่าเนื่องจากข้อมูลมีอยู่ในการเข้ารหัสนี้แล้ว
Selivanov Pavel

อ่าน Wiki อีกครั้ง! 1251 เป็นเลเยอร์การนำเสนอเท่านั้นไม่ใช่ที่จัดเก็บข้อมูล
Lazy Badger

ได้รับการปฏิบัติอย่างชัดเจนว่าเป็นข้อมูลไบนารีในการเข้ารหัสที่ไม่รู้จักและการเข้ารหัสนี้คือ windows-1251 ชื่อไฟล์จะถูกเก็บไว้ในนั้น ฉันต้องการวิธีการแปลงเป็น UTF-8
Selivanov Pavel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.