svn merge

2010. 2. 18. 17:2599. 정리전 - IT/13. Unix 얇팍지식

출처 + http://binggrec.tistory.com/tag/svn%20merge

svn merge 방법

branch merge를 할 시점이 오면 항상 헷갈리던건데... 
이번에 한번 개념 제대로 잡고 정리를 해보자.

branch에서 작업한 내용을 trunk에 머지 시킬때

1. 일단 trunk에서 branch를 가지고 왔을때의 리비전을 확인해야 한다.
$ cd dev/branch/1.0

$ svn log --stop-on-copy
branch를 checkout 받은 디렉토리에서 --stop-on-copy를 해주면 과거에 copy 명령이 일어난 지점까지만 로그를 보여준다.
해서 가장 아래에 있는 리비전을 확인하도록 한다. (copy가 일어난 시점의 리비전)

2. 그리고는 trunk를 checkout 받은 디렉토리에 가서 --dry-run 옵션으로 머지를 시도해본다. (머지하는데 확신이 든다면 이 과정은 생략해도 된다)
머지는 아까 확인한 copy가 일어난 시점의 리비전과 HEAD를 비교하여 이루어진다. (여기서는 2671 리비전이라고 가정) 
$ cd dev/trunk

$ svn merge --dry-run -r 2671:HEAD svn://svn.example.co.kr/project/branches/1.0 ./
(--dry-run 옵션에 대해서는 여기에 정리를 해두었으니 참고)
해서 머지가 실행됬을때의 결과를 확인할 수 있다. 

3. 대충 훑어보고 원하는 결과가 맞다면 실제로 머지를 실행. (위 명령에서 --dry-run 옵션만 빼면 된다)
$ svn merge -r 2671:HEAD svn://svn.test.co.kr/project/branches/1.0 ./ 
머지가 실행된 후 충돌이 난 파일들은 작업자가 확인 후에 충돌을 해소한 후에 trunk로 최종 커밋을 해주면 된다.
충돌난 파일들의 임시파일들은 svn resolved 명령어로 해결. (이곳 참고)

간혹 한번 생성해서 trunk로의 머지까지 완료된 branch를 머지된 이후에도 계속 사용하는 경우가 있는데
이 경우 해당 branch에서 새로운 프로젝트 작업 후 trunk로의 머지를 할 경우에는 리비전 명시에 주의를 해야 한다.
처음 merge시에는 copy된 리비전을 알기위해 --stop-on-copy 옵션을 썼지만, 같은 브랜치를 두번째로 merge 할 경우에는 첫번째 머지한 이후의 리비전과 HEAD를 비교해야 하므로, 첫번째 머지했을때의 리비전을 작업자가 관리해야 하는 불편함이 생긴다.
그래서 되도록이면 두번째 프로젝트를 시작할 경우에는 머지가 완료된 해당 브랜치를 그대로 사용하기보다, trunk에서 새로운 브랜치를 copy해와서 작업하는게 더 좋을 듯 하다.



Posted by wowzzangga
svn merge 시에 --dry-run 이라는 옵션이 있다.
--dry-run                : 실제 명령은 수행하지 않고 시도만 합니다.

저장소끼리 merge 시에는 상당히 많은 양의 파일들이 머지되기 때문에, 
행여나 잘못될까봐 가슴이 두근두근거리는데 이를 --dry-run 옵션으로다가 미리 어떤 결과가 수행되는지를 확인이 가능하다.

# svn merge --dry-run http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample2/trunk \

http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample2/branches/sample-branch
결과 : (실제 merge가 수행된것은 아님)
A    docroot/img/common/set_tab_friend2.gif


D docroot/img/common/bg_star_tooltip.gif


A docroot/img/common/bg_star_tooltip.gif


U docroot/img/common/set_side_title.gif


U docroot/img/common/set_tab_home.gif


D docroot/img/common/set_tab_setting3.gif


A docroot/img/common/set_tab_setting3.gif


U docroot/img/toolbar/set_toolbar.gif


D docroot/img/toolbar/btn_reply_cancel.gif


A docroot/img/toolbar/btn_reply_cancel.gif


D docroot/img/toolbar/btn_reply_ok.gif


A docroot/img/toolbar/btn_reply_ok.gif


U docroot/img/toolbar/bg_toolbar.gif


D docroot/img/layer/set_tab_widget.gif


A docroot/img/layer/set_tab_widget.gif


SVN 용어정리
[ Subversion 정리 ]

1. Subversion 을 사용하는 3가지 방식

   1) 탐색기 방식
      Subversion을 윈도우즈 탐색기처럼 사용하도록 해주는 TortoiseSVN이 있다. 아래 링크를 통해 TortoiseSVN을 설치하여 사용한다.
http://tortoisesvn.tigris.org
   2) 웹 방식
      Apache 서버를 구축하고 Subversion과 ViewVC를 설치하면 익스플로러를 통해 웹처럼 접근할수 있다.
http://httpd.apache.org : Apache (apache_2.0.59-win32-x86.msi)
http://subversion.tigris.org : Subversion (svn-1.4.3-setup.exe)
http://www.viewvc.org : ViewVC (viewvc-1.0.3.zip)
      ViewVC를 사용하지 않을 경우에는 "지정 도메인"/"해당 저장소" 로 접근
    예) sample.com/repository

      ViewVC를 사용할 경우에는 "지정 도메인"/viewvc 로 접근
    예) sample.com/viewvc
   3) svn+ssh 방식
       ssh클라이언트 툴인 putty를 이용하여 ssh로 암호화 된 상태로 Subversion을 사용한다.

       개인마다 키를 생성하여 이용하는데........

2. Subversion 주요 명령어
   1) svnadmin create : 지정한 위치에 새로운 저장소(repository)를 생성한다.
       형식 - svnadmin create "dest"
       # svnadmin create /home/heyduk/repos
   2) svn import : 생성된 저장소에 프로젝트 파일을 넣는다.
       형식 - svn import "option" "source" "dest"

       # svn import -m "import first project" . file:///home/heyduk/repos/project1/trunk
         -m 옵션을 통해 import 할때의 메세지를 남기고 현재 디렉토리의 내용을 project1라는 별도의 디렉토리에 넣는다.
   3) svn checkout(co) : 저장소에 보관된 프로젝트 소스를 로컬 시스템의 작업 디렉토리로 복사하여 가져온다.
       형식 - svn co "source" "dest"
       # svn co file:///home/heyduk/repos/project1/trunk my_work
   4) svn commit : 지역 작업본의 변경한 내용들을 저장소에 저장하며 프로젝트를 새로 리비젼시킨다.
       형식 - svn commit(ci) "option"
       # svn commit -m "main() modified"

   5) svn status : 작업 복사본에서 변경된 이후 아직 저장소로 commit 되지 않은 내용을 확인한다.
       형식 - svn st "path"

       # svn status(st) main.c
         출력 내용 중 첫번째 문자를 통해 상태를 확인할 수 있는데 그중 몇가지 주요 내용은 다음과 같다.
         A : 추가됨
         C : 충돌됨
         D : 삭제됨
         M : 수정됨
         G : 병합됨

   6) svn diff : 저장소의 내용과 현재 작업 내용을 비교하여 변경한 부분(차이점)을 자세히 확인한다.
   저장소와의 네트워킹은 일어나지 않으므로 실시간 변경 내용은 반영되지 않는다.
      형식 - svn diff "path" , svn diff "option"

      # svn diff main.c
        저장소의 내용과 현재 작업내용 중 main.c 파일의 차이를 확인

      # svn diff -r 1:2
        리비전 1과 2의 차이를 확인

      # svn diff -r 1 main.c
        리비전 1과 현재 작업중인 main.c의 차이를 확인

      # svn diff -r 2
        리비전 2와 현재 작업중인 디렉토리의 파일내용 차이를 확인

   7) svn log : 특정 파일의 commit된 로그 메세지를 확인한다.
      형식 - svn log "path" , svn log "option"

      # svn log main.c
        main.c 파일이 commit 된 로그메세지를 출력

      # svn log -r 1:2
        리비젼1부터 2까지의 로그메세지를 출력
   8) svn update : 현재 작업디렉토리의 내용을 저장소의 최신 리비전으로, 또는 지정한 리비전으로 갱신한다.
      형식 - svn update(up) "option"

      # svn up
        현재 작업 내용을 최신내용으로 갱신

      # svn up -r 1
        현재 작업 내용을 리비전 1로 갱신(최신 리비전보다 이전으로 되돌리는 것도 가능하다.)

   9) svn add : 프로젝트에 파일이나 디렉토리를 추가한다.
      형식 - svn add "path"

      # svn add Makefile
        add로 추가한 경우 저장소에는 바로 반영되지 않기 때문에 commit 을 수행하여 새로운 리비전으로 갱신할 필요가 있다.
   10) svn revert : 지역 작업 복사본에서 수행한 변경들을 이전 상태로 복원(실행 취소)한다.
        형식 - svn revert "path"

        # svn revert main.c
           지역 복사본의 main.c 파일에 가했던 변경들을 모두 복원(취소)함

   11) svn merge : 저장소끼리, 또는 저장소와 지역 작업본간의 변경 내역을 작업본에 병합한다.
        형식 - svn merge "source1" "source2" "dest" : 다른 저장소끼리의 변경 사항을 지정한 작업 복사본으로 병합함
                  svn merge -r rev_num1:rev_num2 "dest" : 기본 저장소에 있는 두 리비전의 변경사항을 지정한 작업 복사본으로 병합함

       # svn merge file:///home/heyduk/repos/project1/trunk file:///home/heyduk/repos/project2/trunk my_work
           저장소의 project1과 project2간의 차이를 지역 작업본인 my_work에 병합함

        # svn merge -r 6:7 file;///home/heyduk/repos/trunk my_work
           저장소의 리비전 6~7의 변경내용을 지역 작업본인 my_work 에 병합함