Chuyển đổi mã hóa tên tệp Mercurial


12

Tôi có kho lưu trữ Mercurial chạy trên Apache với mod_wsgi. Các kho lưu trữ có tất cả tên tệp được mã hóa trong windows-1251. Mã hóa này được sử dụng vì lý do lịch sử: chúng được chuyển đổi thành đồng bóng từ svn, windows-1251 là mã hóa cửa sổ mặc định cho miền địa phương Nga.

Bây giờ các lập trình viên muốn sử dụng công cụ Crucible để xem lại mã. Nó không thể nhấn mạnh tên tệp trong bất kỳ mã hóa nào khác ngoài utf-8. Vì vậy, tôi cần chuyển đổi chúng từ windows-1251 sang utf-8. Có ai biết cách để làm điều này không? Phần mở rộng chuyển đổi Mercurial không có tùy chọn để chuyển đổi mã hóa.

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
Tên tập tin Nga?! Đừng nghĩ về việc đổi tên tập tin?
Lazy Badger

1
Tôi là quản trị viên hệ thống, không phải nhà phát triển, nhiệm vụ của tôi là cung cấp dịch vụ làm việc ổn định, không học cách sử dụng nó.
Selivanov Pavel

Matt Mackall đã viết từ lâu, có thể đã lỗi thời # Nếu bạn muốn phục vụ các trang có UTF-8 thay vì bộ ký tự # locale mặc định của mình, bạn có thể làm như vậy bằng cách bỏ qua các dòng sau. # Lưu ý rằng điều này sẽ khiến các tệp .hgrc của bạn được diễn giải trong # UTF-8 và tất cả các tệp repo của bạn sẽ được hiển thị bằng UTF-8. # #import os # os.envir ["HGENCODING"] = "UTF-8"
Lazy Badger

Tôi đã viết trong ý kiến dưới đây để trả lời: Thay đổi encoding = windows-1251để encoding = UTF-8tên tập tin chỉ cần thực hiện không đọc được. Điều này là do chúng được lưu trữ trong windows-1251. "UTF-8" os.envir ["HGENCODING"] = "UTF-8" bằng với cài đặt này.
Selivanov Pavel

Câu trả lời:


6

Bạn đúng là hiện tại tiện ích chuyển đổi không hỗ trợ điều này theo cách tốt đẹp. Có nghĩa là, bạn không thể yêu cầu nó để recode từ mã hóa X để mã hóa Y . Tuy nhiên, bạn có thể yêu cầu nó đổi tên từng tệp một cho bạn! Đầu tiên tạo một tệp được gọi rename.pyvới

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)

Sau đó chạy

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

Điều này tạo ra bản đồ tập tin của bạn. Bây giờ bạn có thể sử dụng

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

để chuyển đổi kho lưu trữ thành một kho lưu trữ mới. Trong kho lưu trữ mới, có vẻ như các tệp luôn được lưu bằng tên tệp UTF-8.

Lưu ý: Tên tệp hiện được lưu trữ dưới dạng UTF-8 trong kho lưu trữ. Điều này có nghĩa là thanh toán sẽ trông ổn trên các máy Linux hiện đại. Tuy nhiên, Windows không sử dụng tên tệp UTF-8. Các phần mở rộng FixUtf-8 phải được sử dụng để làm Mercurial chuyển đổi tên file UTF-8 vào UTF-16 khi đang bay. Điều này cũng sẽ tạo tên tệp có thể đọc được trên Windows.

Lưu ý: Mọi người sẽ phải sao chép lại kho lưu trữ mới! Thay đổi bất kỳ phần nào của lịch sử chắc chắn cũng thay đổi tất cả các thay đổi băm. Vì vậy, để thực hiện điều này, bạn cần phải

  1. làm cho tất cả mọi người đẩy đến máy chủ
  2. chuyển đổi các kho lưu trữ trên máy chủ,
  3. có người tái bản

hoặc là

  1. làm cho mọi người chạy các lệnh trên trên kho lưu trữ cục bộ của họ
  2. chuyển đổi các kho lưu trữ trên máy chủ

Cả hai cách đều hoạt động vì chuyển đổi là xác định và vì vậy người dùng của bạn có thể tự chạy nó nếu họ có sẵn Python. Nếu họ chỉ có cài đặt TortoiseHg, thì có lẽ dễ nhất nếu bạn chuyển đổi cho họ trên máy chủ của mình.

Tôi đã xem xét làm cho phần mở rộng chuyển đổi hỗ trợ này trực tiếp hơn và đã gửi một bản vá đến danh sách gửi thư Mercurial để được hỗ trợ trực tiếp hơn cho việc này.


Tôi đã đăng một bản vá đầy đủ trên danh sách gửi thư.
Martin Geisler

Nhà truyền giáo quan trọng đã rời bỏ công ty của chúng tôi, vì vậy vấn đề biến mất. Cảm ơn bạn rất nhiều vì đã viết mã để khắc phục vấn đề của tôi và cải thiện tính đồng bóng :) Tôi sẽ thử điều này khi tôi có thời gian rảnh.
Selivanov Pavel

À, vấn đề đã được giải quyết :-) Hãy chấp nhận câu trả lời của tôi khi bạn đã thử.
Martin Geisler

Không có hg - rõ ràng nhất trong 1.8. Tôi đã sử dụng hg - mẹo đơn giản -r. Mọi thứ đều hoạt động trên máy Linux: Tôi thấy tên tệp thích hợp trong repo với mã hóa = UTF-8 trong hgweb.config và tên tệp là chính xác trong kho lưu trữ nhân bản. Trên máy Windows, tôi đã có tên tệp "џџѕµµµµµµµµµµµµµµµµ
Selivanov Pavel

Có, điều này được mong đợi - tên tệp không được mã hóa lại khi bạn sao chép vào Windows và do đó thanh toán của bạn trở thành rác. Sử dụng tiện ích mở rộng FixUtf8 ngay bây giờ.
Martin Geisler

2

Tôi đã từng gặp vấn đề tương tự. Tôi cần phải chuyển đổi một loạt các kho lưu trữ, vì vậy tôi đã viết một kịch bản chuyển đổi tất cả các kho lưu trữ được đưa ra dưới dạng danh sách.

sử dụng:

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

Bạn có thể lấy từ kho lưu trữ của tôi tại BitBucket.


0

Chỉ cần trích xuất từ Mercurial Wiki FYI

Sau đây được xử lý rõ ràng dưới dạng dữ liệu nhị phân trong một mã hóa không xác định:

  • nội dung tập tin
  • tên tập tin

Những mục này nên được coi là dữ liệu nhị phân và được bảo quản một cách dễ dàng bất cứ khi nào có thể.

Vì vậy, tôi cho rằng, chỉ cần thay đổi bảng mã trình bày trong encoding =có thể làm dày

Nếu giả định này sai (luôn luôn có thể), hãy thử FixUtf8 Extension , đọc phần Sửa tên tệp hiện có từ readme một cách cẩn thận


Thay đổi encoding = windows-1251để encoding = UTF-8tên tập tin chỉ cần thực hiện không đọc được. FixUtf8 cũng không giúp được gì.
Selivanov Pavel

ĐỒNG Ý. Hãy thử quay lại mã hóa = windows-1251 và thử AddDefaultCharset utf-8trong Apache. Một ý tưởng khác - thay đổi WAMP thành LAMP với UTF8 làm ngôn ngữ và không làm gì với tên tệp nhưng có encoding = UTF-8một lần nữa
Lazy Badger

Đây LAMP. Ngày xưa, kho lưu trữ được đặt trên WAMP với Subversion, sau đó tôi đã chuyển đổi nó thành Mercurial và chuyển sang máy Linux, với ngôn ngữ UTF-8. encoding = windows-1251đã được đặt vì dữ liệu đã có trong mã hóa này.
Selivanov Pavel

đọc lại Wiki! 1251 chỉ là lớp trình bày, không lưu trữ
Lazy Badger

được xử lý rõ ràng dưới dạng dữ liệu nhị phân trong một mã hóa không xác định Và mã hóa này là windows-1251, tên tệp được lưu trữ trong đó. Tôi cần một số cách để chuyển đổi chúng thành UTF-8
Selivanov Pavel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.