Mercurial 변환 파일 이름 인코딩


12

mod_wsgi로 Apache에서 Mercurial 리포지토리를 실행하고 있습니다. 리포지토리에는 Windows-1251로 인코딩 된 모든 파일 이름이 있습니다. 이 인코딩은 역사적 이유로 사용됩니다. svn에서 수은으로 변환되었으며 windows-1251은 러시아어 로켈의 기본 윈도우 인코딩입니다.

이제 프로그래머 는 코드 검토에 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을 사용하여 페이지를 제공하려면 다음 행의 주석을 해제하면됩니다. # 이렇게하면 .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

당신은 변환 확장 프로그램이 현재 이것을 좋은 방법으로 지원하지 않는 것이 맞습니다. 즉, 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로 저장됩니다. 이것은 현대 리눅스 머신에서 체크 아웃이 잘 보일 것임을 의미합니다. 그러나 Windows는 UTF-8 파일 이름을 사용하지 않습니다. FixUtf-8 확장은 UTF-16 즉시에 의욕 변환에게 UTF-8 파일 이름을 만드는 데 사용되어야합니다. 이것은 Windows에서도 읽을 수있는 파일 이름을 만듭니다.

참고 : 모두 새로운 저장소를 다시 복제해야합니다! 히스토리의 일부를 변경하면 필연적으로 모든 변경 세트 해시도 변경됩니다. 이것을 뽑으려면 다음 중 하나를 수행해야합니다.

  1. 모두가 서버에 밀어 붙이고
  2. 서버의 리포지토리를 변환하고
  3. 사람들이 다시 복제하도록

또는

  1. 모두가 로컬 저장소에서 위의 명령을 실행하게하십시오.
  2. 서버에서 리포지토리를 변환

변환은 결정론 적이므로 어떤 방식 으로든 작동하므로 Python을 사용할 수있는 경우 사용자가 직접 실행할 수 있습니다. TortoiseHg 설치 만있는 경우 서버에서 변환하는 것이 가장 쉽습니다.

변환 확장 기능을보다 직접적으로 지원하는 방법을 살펴보고 이에 대한 직접적인 지원을 위해 Mercurial 메일 링리스트패치를 보냈습니다 .


메일 링리스트에 전체 패치 를 게시했습니다 .
Martin Geisler

도가니 전도자는 회사를 떠났으므로 문제가 사라졌습니다. 내 문제를 해결하고 수은 개선을 위해 코드를 작성해 주셔서 감사합니다. :) 자유 시간이있을 때 시도해 보겠습니다.
Selivanov Pavel

아, 문제가 해결되었습니다 :-) 당신이 그것을 시도했을 때 내 대답을 자유롭게 받아들이십시오.
Martin Geisler

수은 1.8에서 hg --manifest 없음. hg --manifest -r tip을 사용했습니다. 모든 것이 Linux 컴퓨터에서 작동합니다 .hgweb.config에서 인코딩 = UTF-8 인 적절한 파일 이름이 repo에 있고 복제 된 저장소에서 파일 이름이 올바른 것입니다. Windows 컴퓨터에서 복제 후 "ПояснительнР° СЏ Р · Р ° РїРёСЃРєР ° .docx"파일 이름이 있습니다.
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에서 시도하십시오 . 또 다른 아이디어-로케일로 UTF8을 사용하여 WAMP를 LAMP로 변경하고 파일 이름으로 아무것도하지 않지만 encoding = UTF-8다시하십시오.
Lazy Badger

이것은 이다 LAMP. 예전에는 Subversion을 사용하여 WAMP에 리포지토리를 배치 한 후 나중에 Mercurial로 변환하고 UTF-8 로켈을 사용하여 Linux 시스템으로 옮겼습니다. encoding = windows-1251데이터가 이미이 인코딩에 있었기 때문에 설정되었습니다.
Selivanov Pavel

위키를 다시 읽으십시오! 1251은 프리젠 테이션 계층이 아닌 스토리지입니다
게으른 오소리

알 수없는 인코딩에서 이진 데이터로 명시 적으로 처리 되며이 인코딩은 Windows-1251이며 파일 이름이 저장됩니다. UTF-8로 변환하는 방법이 필요합니다
Selivanov Pavel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.