Git를 여기 저기에 적용해 보던 어느 날…
Subversion 레파지토리를 Git로 쓸 기회가 생겼다.
git-svn 을 이용해서 파일을 clone을 해 왔는데, 마지막에 가서 먼가 자꾸 실패한다.
알고 보니 한글로 된 이름을 가진 파일을 가져오는 과정에서 문제가 생기는 것.
한글로 된 이름을 가진 파일을 처리할 때 Invalid argument 가 어쩌고 하는데..
아무래도 인코딩 문제인거 같기는 한데…
답이 안보인다.
에 저장할 때 파일명 인코딩을 항상 UTF-8로 하는데,
git-svn은 이를 무시하고 항상 그대로 읽어오기 때문이었다.
그래서 파일을 처리할때 파일명의 인코딩을 UTF-8에서 로컬에서 쓰는 인코딩으로 바꾸고,
다시 로컬 인코딩에서 UTF-8로 변경하는 과정을 거쳐줘야 한다.
오만상 삽질 끝에 알아낸 것은 git-svn에서만 발생하는 문제라는것.
원인은 Subversion이 레파지토리
git-svn은 perl로 되어 있으며, Git 설치 디렉토리의 libexec/git-core/git-svn 이다.
첨부한 패치를 적용하거나 파일을 열어서 다음과 같이 수정해 준다.
01-git-svn-file-name-encoding-processing.patch
…
sub git_path {
my ($self, $path) = @_;
if (my $enc = Git::config(‘svn.filenameenc’))
{
require Encode;
Encode::from_to($path, ‘UTF-8’, $enc);
}
if ($self->{path_strip}) {
$path =~ s!$self->{path_strip}!! or
die “Failed to strip path ‘$path’ ($self->{path_strip})\n”;
…sub repo_path {
my ($self, $path) = @_;
if (my $enc = Git::config(‘svn.filenameenc’))
{
require Encode;
Encode::from_to($path, $enc, ‘UTF-8’);
}
$self->{path_prefix}.(defined $path ? $path : ”);
}…
그런 다음, .gitconifg 파일에서 다음과 같이 인코딩 설정을 추가해 준다.
.gitconfig 파일은 HOME 디렉토리에 있으며, 윈도우인 경우에는 “내 문서” 폴더에 있다.
[svn]
filenameenc = EUC-KR
이렇게 한 후 git-svn으로 clone을 하면 아무 문제없이 clone이 된다.
첨부한 git-svn은 윈도우용 Git인 Msysgit 1.6.4 에 해당 패치를 적용한 파일이다.