SubGit 으로 만든 git 저장소에 svn 저장소의 변경 사항이 적용되지 않을 때 해결 방법

SubGit 은 git 를 이용해서 svn 저장소에 접근할 수 있는 기능을 제공하는 아주 강력한 도구이다. 하지만 가끔 svn 저장소에는 분명히 변경 사항이 있는데, git 에서는 보이지 않는 경우가 있다.

처음에는 svn 을 git 로 바꾸는 작업을 처음부터 다시 했었는데, svn 저장소가 매우 크다면 git 저장소로 바꾸는데 시간이 꽤 많이 걸린다. 그래서 좀 더 나은 방법이 없을까 생각해보다 찾아낸 것이 SubGit 의 install 명령을 다시 수행하는 것이다. 이미 있는 git 저장소에 subgit install 을 다시 수행하면 git 저장소에 아직 적용되지 않은 변경 사항만을 svn 저장소로부터 가져온다. 따라서 훨씬 시간이 줄어든다.

예를 들어, git 저장소가 ~/git/repo.git 이라면,

  • subgit install ~/git/repo.git 

을 하면, 다시 올바르게 작동한다.

// ---- 2014/12/20

subgit 과 git 저장소를 원격 서버에 설치해서 쓰고 있는데, subgit 데몬이 시간이 좀 지나면 저절로 죽었다. 이게 꽤 빈번한터라, 매번 서버에 접속해서 subgit install 을 수행야 했는데, 정말 귀찮은 작업이었다. 그래서 더 좋은 방법이 있지 않을까해서 개발사에 물어보았다. 개발사의 설명은 이랬다.

일단 subgit 데몬이 죽는 이유는 로그 분석에 따르면 커널이 죽이는 것이라고 했다. 해결 방법으로는 메모리를 늘리거나 스왑을 설정하라라는 것이었는데, 관리자가 아닌 서버에 더부살이 하는 입장에서 그렇게 하기에는 힘들었다.

그리고 svn 저장소로부터 git 저장소로 변경사항들을 가져오려면 이를 위한 데몬이 실행되어야 하는데, 문제는 이 데몬이 자동으로 실행되지 않는다는 것이다. 데몬이 실행되는 경우는 두 경우라고 한다. 하나는 subgit install 이고, 다른 하나는 git push 이다. git pull 은 해당되지 않는다. 따라서 아무리 git pull 을 하더라도 데몬이 실행되지 않고 있으면 새로운 변경사항을 가져오지 못하는 것이다. git pull 을 지원하지 못하는 이유는 이에 대응하는 git hook 이 없기 때문이라고 한다.

개발사쪽에서 제시한 방법은 앞서 설명한 subgit install 을 수행하는 것과 존재하지 않는 브랜치를 지우려고 시도하는 것이다. 예를 들면

  • git push :non_existent_branch

non_existent_branch 는 실제 존재하지 않는 브랜치 이름 아무것이나 쓰면 된다. 이렇게 하면 설치된 git hook 에 따라 subgit 데몬이 실행이 되고 새로운 변경사항들을 가져온다. 이후에는 git pull 을 통해 새로운 변경사항들을 받을 수 있다.

개인적으로 사용하는 또다른 방법으로는 .bashrc(bash 를 쓸 경우)를 수정하는 것이다. 단 이 방법은 ssh 르 이용할 때만 쓰일 수 있다. ssh 로 접속하면 .bashrc 가 자동으로 읽히므로, .bashrc 에 subgit 데몬을 실행시키는 코드를 포함시키면, ssh 로 접속할 때마다 데몬이 자동으로 실행된다. 이렇게 하면 git push 를 하지 않더라도 접속할 때마다 자동으로 데몬이 실행되지만, git 와 상관없이 매번 접속할 때마다 subgit 데몬을 실행시키므로 접속후 프롬프트가 뜰 때까지 약간의 시간이 더 걸린다. 만약 저장소가 많다면 그에 비례해서 지연되는 시간이 늘어날 것이다. 방법은 다음과 같다.

  • subgit fetch --async 저장소_경로 >/dev/null 2>&1

--async 가 없으면 새로운 변경사항을 모두 받을 때까지 기다리기 때문에 훨씬 더 많은 시간이 걸린다.

마지막에 리디렉션이 필요한 이유는 subgit 의 출력이 git 로 전달되면 git 가 그 내용을 해석하지 못해 오류가 발생하기 때문이다.

// ----- 2015/03/06
위 방법은 subgit 데몬을 실행시키는 방법들이다. 따라서 이 방법으로 데몬이 실행되더라도, 데몬이 svn 서버에서 변경사항들을 가져오는데 어느 정도의 시간이 걸린다. 이를 잊고서, git pull 을 했을 때 완료됐다고 해서, svn 서버와 동기화가 이루어졌다고 생각하면 안된다. svn 저장소의 변경사항들이 git 저장소에 완전히 기록될 때, 수시로 git pull 하자.
// -----


댓글

이 블로그의 인기 게시물

토렌트: < 왕좌의 게임 > 시즌 1 ~ 시즌 8 완결편 마그넷

토렌트: < 스타워즈 > Ep.1 ~ Ep.6 마그넷

토렌트: NGC < 코스모스 > 우리말 더빙 전편(1편~13편) 마그넷