git gc 실행 시 fatal: Out of memory, malloc failed 에러

git gc를 하다보니 난데없는 Out of memory 에러가 났다.

git 에서 메모리를 과하게 쓰는건지….

어쨌든 이 문제는 repack 명령을 사용하여 임시적으로 해결이 가능하다.

git repack -adf –window=2

window 갯수가 디폴트가 10 라고 하는거 같은데, –window 옵션을 숫자를 에러가 안 날때까지

적당히 줄여 주면 된다.

그리고 다시 git gc를 하면 문제없이 수행이 된다.

그런데 gc –aggressive 를 할 경우에는 또 해당 에러를 만날 수도 있다.

좀 난감했는데, config 를 통해 window 메모리 크기를 설정할 수 있다.

git config pack.windowMemory 128m

이 값 역시 에러가 안날 때 까지 적당히 줄여 주면 된다.

써보지는 않았지만 다음 config 도 같이 사용하면 문제 해결에 도움이 되는거 같다.

git config pack.packSizeLimit 20m

git svn 에서 저장소 relocate 하기

git-svn 은 git 로 svn 저장소르 쓸 수 있도록 해주는 아주 유용한 도구다.
그러나, 몇 가지 불편한 점이 있는데, 그 중 한 가지가 저장소 주소가 변경되었을때,
svn의 relocation 명령을 쓸 수 없다는 것. 그러나 약간 번거롭긴 하지만 방법이 아주 없진않다.
다음 절차에 따라 파일 수정 및 명령을 실행하면 svn 저장소 주소를 변경할 수 있다.

1. 변경하고자 하는 git 저장소의 config 파일을 연다.(.git/config)
svn 저장소 주소가 적혀 있는 부분이 있는데 이 줄 앞에 #를 붙여 주석 처리하고
새로운 저장소의 주소를 적는다.

2. 해당 git 디렉토리에서 다음 명령을 실행한다.

git svn fetch

3. 다시 1의 파일을 열고, 이번에는 새로운 저장소 주소를 주석처리하고, 원래 저장소 주소의
주석을 제거 한다.

4. git 디렉토리에서 다음 명령을 실행한다.

git svn rebase -l

5. 다시 설정파일을 열고, 원래 저장소 주소를 삭제하고, 새로운 저장소 주소의 주석을 풀어서 저장한다.

6. 이제 새로운 주소로 git-svn을 쓸 수 있다.

SeeAlso :

http://joehalliwell.wordpress.com/2009/03/18/relocating-git-svn-checkouts/

git-svn 사용 시 한글 파일명을 가진 파일 오류 해결하기

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 에 해당 패치를 적용한 파일이다.

git-svn.perl