월별 글 목록: 2016년 2월월

SVN과 git을 함께 쓰기

원격 저장소가 SVN인데 로컬에서 git을 사용하고 싶다면 어떻게 해야 할까.

타 연구실과 공동 작업을 하는데, 원격 저장소가 SVN이다. 근데 연구실에서는 git 기초사용법만 교육한 상태.
git-svn을 알려주면 망할 것 같고, SVN을 쓰자니 영 불편하다. 어짜피 이쪽에는 마일스톤 달성한 것만 올리면 된다.

둘 다 같이 쓸 수 있는 방법은 없을까.

이렇게 할 수 있다. 폴더를 두 개 만들고, 편의상 S, G라고 하자.
S폴더는 SVN 체크아웃 후, 일정 주기로 업데이트. 리비전이 올라간다면 패치를 따서 G폴더에 병합한다.
G폴더는 GIT 저장소로 로컬 운영. 여기에서 주요 개발을 진행한다. S폴더의 패치는 master에 병합 후 dev에 병합.
G폴더에서 마일스톤 달성하면, master로 병합을 완료한 후 패치를 따서 S폴더에 병합, SVN 저장소에 최종 커밋한다.

결국 G폴더의 master가 SVN 저장소와 동기화된다. 사실상 git-svn이 하는 백그라운드 작업을 손으로 대신하는거다.
멍청해 보이지만, SVN도 git도 모두 사용해본 경험이 없는 사람에게는 최선인 방법이다.

근데 번거롭다. 매 번 패치를 따서 넘겨주고 넘겨받고 해야 한다. conflict 발생하기도 쉽고 빼먹은게 생길수도 있다.

구글을 돌려보자. 대체로 내가 하는 고민은 누군가 했던 고민이다.
2012년 9월말에 이미 솔루션이 나왔다. http://danielbachhuber.com/2012/09/30/git-in-my-subversion/

1. 우선 SVN 저장소를 체크아웃한다. 거듭 상기하자면, 여기는 마일스톤 달성한 커밋만이 올라갈 것이다.
2. 콘솔을 열고, git init 또는 git clone
3. SVN 프로퍼티를 추가한다. svn:ignore 프로퍼티에 .git, .gitignore 를 추가한다.
4. .gitignore 파일을 만들고, .svn 을 추가한다.
5. 이제 SVN과 git은 서로의 메타데이터를 서로 무시하게 되었다. 메데타시 메데타시

몇 가지 주의사항을 지켜야 한다.
1. SVN 브랜치 기능은 쓰지 않는다. git이 있으니까 필요가 없다.
2. SVN 다른 브랜치에 접근해야 한다면, 별도 폴더를 만들고 새롭게 git 저장소를 만들어야 한다.
3. SVN update 하기 전에 반드시 git master이며 clean인지 확인한다.
4. SVN update 이후 리비전이 바뀌었다면(즉, 서버쪽에 변경사항이 있다면) 이를 git master에도 커밋한다.
5. git에서 하나의 개발 흐름이 완료되었다면, 이를 git master로 병합한다. 이후 git master를 체크아웃한 뒤 SVN 커밋한다.
6. git에서 개발도중에는 SVN에서 modification이 많이 검출될 것이다. 무시하라. git만 신뢰한다.