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에서도 읽을 수있는 파일 이름을 만듭니다.
참고 : 모두 새로운 저장소를 다시 복제해야합니다! 히스토리의 일부를 변경하면 필연적으로 모든 변경 세트 해시도 변경됩니다. 이것을 뽑으려면 다음 중 하나를 수행해야합니다.
- 모두가 서버에 밀어 붙이고
- 서버의 리포지토리를 변환하고
- 사람들이 다시 복제하도록
또는
- 모두가 로컬 저장소에서 위의 명령을 실행하게하십시오.
- 서버에서 리포지토리를 변환
변환은 결정론 적이므로 어떤 방식 으로든 작동하므로 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에서 기존 파일 이름 수정 부분을주의 깊게 읽으십시오.