Mercurial 변환 파일 이름 인코딩 인코딩에서는 파일 이름을 언더

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



답변

당신은 변환 확장 프로그램이 현재 이것을 좋은 방법으로 지원하지 않는 것이 맞습니다. 즉, 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 메일 링리스트패치를 보냈습니다 .


답변

나는 같은 문제가 있었다. 여러 저장소를 변환해야했기 때문에 목록으로 제공된 모든 저장소를 변환하는 스크립트를 작성했습니다.

용법:

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

BitBucket의 저장소 에서 얻을 수 있습니다 .


답변

Mercurial Wiki FYI 에서 바로 추출

다음은 알 수없는 인코딩에서 명시 적으로 이진 데이터로 처리됩니다.

  • 파일 내용
  • 파일 이름

이러한 항목은 이진 데이터로 처리하고 가능한 한 손실없이 보존해야합니다.

따라서 프레젠테이션 문자 세트를 변경 encoding =하면 두껍게 할 수 있다고 생각 합니다.

이 가정이 잘못된 경우 (항상 가능) FixUtf8 Extension을 시도 하고 readme에서 기존 파일 이름 수정 부분을주의 깊게 읽으십시오.


답변