-
SVN branch and merge 쉽게 활용하기 #2소프트웨어 & 잡다 2013. 2. 13. 20:16
이전에 잠깐 SVN에서 branch만들어서 사용하는 법과 merge하는 법을 적은 적이 있다. 뭔가 잘 안되어서 삽질하다가 적은건데, 좋은 방법은 아니었다. 그런데 우연히 블로그 유입경로를 보니 SVN/BRANCH/MERGE가 엄청 많다는걸 알고는, 가만 있을수가 없었다.
사실 적어놓고 잊고 있었는데, 요새 branching을 많이 하다보니, 나름 정형화 된 방법이 있어서 새로 적을까 한다. branch를 생성하고 작업하고, merging 하기까지 일련의 과정을 나열해 보겠다. 잘 모르는 사람을 위해서 당연한것도 적도록 하겠다.
1. branch 만들기
branch를 만든다는것이 최신 trunk를 복사하는것이기 때문에, 기본적인 명령어 사용 순서는 이렇다.
svn copy [TRUNK] [BRANCH PATH]
svn co [BRANCH PATH]
그런데 branch를 자주자주 만들다보면 매우 귀찮다. 그래서 나는 그냥 간단한 스크립트를 하나 만들어서 실행하는 식으로 한다.
[branch.sh]
@!/bin/bash
svn copy svn+ssh://svnpath/trunk svn+ssh://svnpath/branches/$1 -m "Create $1 branch"
svn co svn+ssh://parki@bt-svn.uk.nds.com/abr-encryptor/branches/$1
그리고는 branch 이름과 함께 스크립트를 실행시키면, 쉽게 만들수 있다.
./branch.sh CQ123456_Fix_Blah
2. branch에서 작업
Branch에서 무슨 작업을 하던 그냥 commit 하면 된다.
3. trunk의 변경점을 branch에 적용하기
여러명이 함께 작업하는 경우, branch에서 내 작업을 하는동안 다른 사람에 의해 trunk가 변경되기도 한다. 혹은 내가 연관있는 여러 branch를 동시에 작업하다가 하나를 commit하면, 이를 다른 branch에 적용 시킬 필요가 있다. code review등을 위해서라도 trunk를 merge 하는것은 게을리 하지 않는것이 좋다.
merge 하는것은 매우 쉽다. branch directory root에 들어간후 아래처럼 입력하면 된다.
svn merge --dry-run ^/trunk (dry-run으로 미리 결과 예측)
svn merge ^/trunk
dry-run 옵션을 통해서 conflict 등의 문제가 있는지 미리 확인하고, 만약 문제가 발생할거 같으면 실제 merge를 하기 전에 최대한 고쳐보도록 힘쓰는것이 좋다. 그리고 merge 후에는 꼭 build를 다시 해보고, commit 하는것을 습관을 들이자.
4. branch 작업 완료. trunk에 적용하기
드디어 branch에서 작업을 완료했고, 동료에게 코드리뷰도 합격 받았으면 trunk에 적용 시킬 일만 남았다. 나는 보통 trunk에 적용시키기 전에 3번 과정을 한번 수행한다. 그런데 꼭 그럴 필요는 없고 본인들 판단하에 하면 된다.
Trunk로 merge하려면 trunk directory root로 들어간 후 아래처럼 입력하면 된다.
svn merge --dry-run ^/branches/mybranchname
svn merge ^/branches/mybranchname
부드럽게 잘 merging 되면 좋은데, 작업이 복잡한 경우 conflicts 때문에 merging이 실패하는 경우가 많다. 이는 dry-run을 했을 때 발견 가능하므로 무시하고 merging 을 시도하지 않도록 하자. 귀찮아진다.
conflicts들은 보통 SVN이 코드 변화를 계산해 내기에 너무 복잡한 변화가 발생한 경우나, trunk를 branch로 merge하는 과정에서 중복된 변경 항목들이 발생한 경우에 나타난다. 일반적인 경우 간단한 추가 옵션(--reintegrate)으로 해결이 가능하다.
svn merge --dry-run --reintegrate ^/branches/mybranchname
svn merge --reintegrate ^/branches/mybranchname
reintegrate 옵션으로도 몇몇 conflicts들이 해결 안되는 경우가 있다. tree conflicts 들이 주로 끝까지 귀찮게 한다. 당연히 원인을 분석해서 상황에 맞게 대처하면 모두 해결 할 수 있다. 하지만 일일이 여기에 나열하기는 어렵고, 구글을 통해 확인해 보면 대부분 답이 있다.
하지만 그전에, 받아놓았던 trunk 디렉터리를 싹 지우고, 다시 check out 받아서 reintegrate merging을 시도해 보길 권장한다. 가끔 실수 혹은 unit test, validation 등에 의해 발생한 잔여 파일들에 의해서 원인을 알기 어려운 conflicts가 생기는 경우가 있기 때문이다.
'소프트웨어 & 잡다' 카테고리의 다른 글
CentOS 5 에서 GCC4.4 사용하기. (2) 2014.02.18 std::vector 정렬하기 - quick sort, merge sort (2) 2013.10.01 GCC 4.1 호환 지원 (0) 2013.06.25 SVN trunk 변경사항 되돌리기 (SVN Rollback) (0) 2013.02.27 Redhat/Ubuntu 리눅스에서 램디스크(RAM disk) 만들기 (0) 2012.11.15 Intel VTUNE 추가 기능 사용을 위한 EBS 설치 (0) 2012.08.17 C++ 예찬 (1) 2012.04.12 Linux HTTP 프록시 설정 (0) 2012.03.05