RabbitVCS는 버전 관리 프로그램으로
윈도우용 TortoiseSVN 처럼 
우분투 노틸러스(nautilus)에 통합되어
사용하기 편하고 
사용법 또한 비슷해서 쉽습니다.

그동안 터미널에서 힘들게 
사용하시던 분에게 강추합니다.

설치법: (11.04 부턴 ppa 필요없음)
sudo add-apt-repository ppa:rabbitvcs/ppa
sudo apt-get install rabbitvcs-core
sudo apt-get install rabbitvcs-nautilus

설치 후 재부팅합시다.

우분투용 SVN (Subversion) GUI 유틸리티
[RabbitVCS]
저작자 표시 비영리 동일 조건 변경 허락
Posted by 파이델
http://wiki.kldp.org/wiki.php/Subversion-HOWTO#s-5

5 실제로 사용하기

간단한 예제 프로그램을 통해서 Subversion의 사용법을 알아보도록 하겠습니다. 커맨드 라인 클라이언트을 통해 알아보겠습니다. X 윈도우, MS 윈도우용 GUI 클라이언트 프로그램에 대해서는 뒤에 설명하도록 하겠습니다.

[edit]

5.1 에디터 설정

Subversion에서 사용할 기본적인 에디터를 지정해야 합니다. 이것을 지정하지 않으면 커밋 등을 할 수 없게 됩니다.

각 사용자 계정의 디렉토리에는 .profile이나 .bash_profile 등의 환경 변수 등을 지정하는 파일이 있습니다. 여기에 아래와 같이 추가 합니다. 여기에서는 에디터를 vim으로 설정 하겠습니다. vim의 경로는 사용자마다 다를 수 있으므로 사용하고자 하는 시스템에 맞게 적어주십시오.
SVN_EDITOR=/usr/bin/vim
export SVN_EDITOR
[edit]

5.2 기본 디렉토리 만들기

앞서 설명 했던 trunk, branches, tags 디렉토리를 만들어 보겠습니다.

trunk 디렉토리의 생성, 앞에서 Apache를 통해 설정 했다면 http://를 svnserve로 설정했다면 svn://로 SSH를 사용한다면 svn+ssh://로 하여 서버 설정에 맞게 주소를 적어 주십시오. apache를 연동한 경우
# svn mkdir http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/trunk

svnserve만 실행한 경우
# svn mkdir svn://(Subversion서버 IP또는 도메인)/sample/trunk

위처럼 입력을 하면 vim이 실행되면서 아래와 같이 나올 것입니다. :q!로 빠져 나갑니다.
--This line, and those below, will be ignored--
A http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/trunk

vim을 빠져 나왔다면 아래와 같이 나오는데(커밋 로그를 입력하지 않으면 아래와 이 나오게됩니다.) c를 누르고 엔터를 치면 디렉토리가 만들어 지게 됩니다.
Log message unchanged or not specified
a)bort, c)ontinue, e)dit


c를 입력한뒤 아래와 같이 나오면 디렉토리 생성은 성공한 것입니다. 이 방법대로 branches, tags 디렉토리도 만듭니다.
Committed revision 1.

만약 read-only에러가 나올 경우 conf/svnserve.conf에서 계정을 만들지 않아서 그렇습니다. anonymous로 사용할 경우 #general, #anon-access = read 가 주석 처리 되어 있는데 주석을 없애고 anon-access = write로 바꾸시면 됩니다.

제대로 만들어 졌는지 확인을 하려면 다음과 같이 입력 합니다. list는 저장소 안의 디렉토리와 파일들을 표시해 줍니다.
# svn list http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample
branches/
tags/
trunk/

앞으로 디렉토리 생성, 삭제, 이름변경, 파일, 추가, 삭제, 복사, 이동과 커밋, 등을 할 때 vim이 실행되면서 어떤 것들이 바뀌는지 표시가 됩니다. 커밋 로그를 입력한뒤 vim을 종료하면 커밋이 완료 됩니다. 커밋 로그를 입력하지 않았을 경우 a)bort, c)ontinue, e)dit가 나오게 되는데 c)ontinue)로 계속 하면 됩니다. <!> 하지만! 커밋 로그 입력은 필수입니다. 소프트웨어 버전 관리에서 가장 중요한 것은 커밋 로그입니다. 어떤 코드를 어떻게 수정했고 디렉토리, 파일을 만들고 삭제 했는지를 꼼꼼히 기록해야합니다. 나중에 소스코드가 바뀌는 흐름을 따라가고자 할때나 문제점(버그)을 추적할때 커밋 로그가 아주 유용하게 이용될 것입니다.

[edit]

5.3 Import

맨 처음 프로젝트를 시작할 때 저장소에 소스들을 넣어야 합니다. 이럴 때 하는 것이 import 작업입니다. sampledir 이라는 디렉토리를 만든 뒤에 그 아래 다음과 같은 간단한 소스를 작성해 보십시오.
# mkdir sampledir
# cd sampledir
sampledir# vim sample.c

#include <stdio.h>

int main()
{
printf("Sample Program Version 0.1\n");
return 0;
}
이 소스를 저장소의 trunk 디렉토리에 import 하겠습니다. 아래 sampledir은 디렉토리입니다. 파일을 적으면 import되지 않습니다. 꼭 디렉토리를 만들고 그 디렉토리를 적어 주십시오. 저장소의 trunk 디렉토리에는 sampledir 디렉토리안의 sample.c 파일만 올라가게 되고 sampledir은 올라가지 않습니다. sampledir 아래 디렉토리를 만들었다면 그 디렉토리는 저장소의 trunk 디렉토리 아래에 올라가게 됩니다.
sampledir# cd ..
# svn import sampledir http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/trunk
import도 위에서 디렉토리를 만들었을 때 처럼 vim이 실행되게 됩니다. import되는 파일들이 표시됩니다. :q!로 닫고 c를 입력하면 import 되게 됩니다.

import가 제대로 되었는지 확인해 봅시다. list 명령을 이용해 trunk 디렉토리에 무엇이 있나 보겠습니다.
# svn list http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/trunk
sample.c

[edit]

5.4 Checkout

이제 부터 Subversion을 이용해서 프로그램 소스를 관리 할 수 있습니다. checkout을 해서 어디서든 소스를 받아 볼 수 있습니다. 방금 import를 하기위해 만들었던 sampledir은 지워도 됩니다.

svn checkout은 svn co로 줄일 수 있습니다. "svn checkout 저장소주소 로컬디렉토리" 의 형식 입니다.
# svn checkout http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/trunk sample
A sample/sample.c
Checked out revision 4.


checkout을 한 디렉토리 안에는 .svn 이라는 디렉토리가 있습니다. 이 디렉토리는 Subversion 저장소 정보가 들어 있기 때문에 지우면 안 됩니다.

[edit]

5.5 Update

체크아웃 해서 받은 소스를 저장소의 최근 내용으로 업데이트 하는 명령입니다. 체크아웃 해서 받은 소스의 revision보다 저장소의 revision이 높으면 업데이트 하게 됩니다. 업데이트를 하게 되면 전부 다 받아오는 것이 아니라 변경 된 것들만 받아옵니다. 소스를 수정하기 전에 언제나 update 명령으로 소스를 가장 최신 revision으로 맞추고 작업을 해야 합니다.

svn update는 svn up로 줄여 사용할 수 있습니다.
sample# svn update

[edit]

5.6 Commit

checkout 해서 받은 소스를 수정하고 저장소에 수정된 소스를 적용해 보겠습니다. 이 작업을 커밋(Commit)이라고 합니다.

체크아웃 받은 sample.c 소스를 아래처럼 수정합니다.
#include <stdio.h>
int main()
{
printf("Sample Program Version 0.2\n");
printf("Hello Subversion\n");
return 0;
}

이제 커밋을 해 봅시다 커밋 명령은 체크아웃 해서 소스를 받은 디렉토리에서 해야 됩니다. svn commit은 svn ci로 줄여 쓸 수 있습니다. 커밋 명령을 내리면 커밋 로그를 작성하는 에디터가 실행 됩니다. 커밋 로그를 입력한후 저장을 하면 커밋이 됩니다.
sample# svn commit
Sending sample.c
Transmitting file data .
Committed revision 5.

[edit]

5.7 Log

이제 저장소에 어떠한 것들이 변경 되었는지 확인 할 수 있는 log 명령에 대해 알아보겠습니다.

log 명령은 체크아웃 받은 디렉토리 안에서 해야 합니다. revision과 날짜, 누가 커밋을 했는지 알 수 있습니다. 여기서는 (no author)로 나옵니다. 이것은 서버 설정에서 아무나 커밋 할 수 있게 하여서 이렇게 나오는 것이고 ID를 통해 인증을 하도록 설정을 했으면 ID가 표시 됩니다.
sample# svn log
------------------------------------------------------------------------
r4 | (no author) | 2003-11-23 14:40:05 +0900 (Sun, 23 Nov 2003) | 1 line

------------------------------------------------------------------------

r1 | (no author) | 2003-11-23 14:39:00 +0900 (Sun, 23 Nov 2003) | 1 line

-----------------------------------------------------------------------

--revision과 -r은 같습니다.
sample# svn log --revision 5:19    # revision 5부터 9까지의 로그를 출력합니다.
sample# svn log -r 19:5 # revision 19부터 5까지 역으로 출력합니다.
sample# svn log -r 8 # revision 8의 로그를 출력합니다.
하나의 파일이나 디렉토리 로그를 볼 수도 있습니다.
sample# svn log sample.c
sample# svn log http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/trunk/sample.c
-v 옵션은 더 자세한 정보를 얻을 수 있습니다. 아래 M은 Modify(수정)의 표시 입니다. 소스 파일을 수정하고 커밋 했기 때문입니다.
sample# svn log -r 5 -v
------------------------------------------------------------------------
r5 | (no author) | 2003-11-23 14:42:34 +0900 (Sun, 23 Nov 2003) | 1 line
Changed paths:
M /trunk/sample.c
------------------------------------------------------------------------

A 는 Add(추가) 표시 입니다. trunk라는 디렉토리를 만들었고 sample.c 파일을 import 했기 때문에 A(추가) 표시가 나오게 되는 것입니다.
sample# svn log -v
------------------------------------------------------------------------
r4 | (no author) | 2003-11-23 14:40:05 +0900 (Sun, 23 Nov 2003) | 1 line
Changed paths:
A /trunk/sample.c
------------------------------------------------------------------------
r1 | (no author) | 2003-11-23 14:39:00 +0900 (Sun, 23 Nov 2003) | 1 line
Changed paths:
A /trunk
------------------------------------------------------------------------

[edit]

5.8 Diff

diff 명령을 사용하면 예전 소스 파일과 지금의 소스 파일을 비교해 볼 수 있습니다. 위에서 나온 로그와 같이 우리는 revision 4(r4)에서 sample.c를 import 했습니다. 그리고 revision 5에서 소스를 수정하고 커밋 했습니다.

최초에 import 했던 소스 sample.c의 revision 4와 수정해서 커밋한 revision 5의 차이점을 diff 명령으로 출력해 보겠습니다. --revision 4만 적으면 현재 revision 5와 비교하게 됩니다.
sample# svn diff --revision 4 sample.c
Index: sample.c
===================================================================
--- sample.c (revision 4)
+++ sample.c (working copy)
@@ -2,7 +2,8 @@
int main()
{
- printf("Sample Program Version 0.1\n");
+ printf("Sample Program Version 0.2\n");
+ printf("Hello Subversion\n");
return 0;
}

revision 4와 5를 비교 하고 싶으면 --revision 4:5 (-r 4:5)로 하면 됩니다. --revision 8:10 도 가능합니다.
sample# svn diff --revision 4:5 sample.c
Index: sample.c
===================================================================
--- sample.c (revision 4)
+++ sample.c (revision 5)
@@ -2,7 +2,8 @@
int main()
{
- printf("Sample Program Version 0.1\n");
+ printf("Sample Program Version 0.2\n");
+ printf("Hello Subversion\n");
return 0;
}

여기서 주의할 점은 CVS는 revision을 파일 하나하나에 다 매기지만 Subversion은 파일에 revision을 매기지 않고 소스 수정, 파일 복사, 이동, 삭제 등을 하고 그때 한 커밋으로 revision을 매깁니다. 그래서 다른 파일들이라도 같은 revision 번호를 가지게 됩니다.

[edit]

5.9 Blame

Blame은 한 소스파일을 대상으로 각 리비전 대해서 어떤 행을 누가 수정했는지 알아보기 위한 명령입니다. 리비전, 커밋한 사용자의 ID, 소스 순서입니다.
sample# svn blame sample.c
4 sampleuser #include <stdio.h>
4 sampleuser
4 sampleuser int main()
4 sampleuser {
5 sampleuser printf("Sample Program Version 0.2\n");
5 sampleuser printf("Hello Subversion\n");
4 sampleuser
4 sampleuser return 0;
4 sampleuser }
4 sampleuser
여기서는 커밋한 사용자가 한명 밖에 없으므로 전부 똑같이 나옵니다.

한 예로 여러사람이 커밋했을 경우 아래처럼 나옵니다.
     4 sampleuser #include <stdio.h>
4 sampleuser
4 sampleuser int main()
4 sampleuser {
7 epifanes printf("Sample Program Version 0.3\n");
6 pyrasis printf("Hello Subversion\n");
4 sampleuser
4 sampleuser return 0;
4 sampleuser }
4 sampleuser


특정 리비전만 지정해서 볼 수도 있습니다. 리비전을 지정하지 않으면 현재 리비전을 대상으로 합니다.
sample# svn blame -r 4 sample.c
[edit]

5.10 lock

svn lock 명령으로 파일을 잠글 수 있습니다.
sample# svn lock hello.c

svn lock 명령으로 파일을 잠그었을 경우 왜 잠그었는지 로그를 기록할 수 있습니다. 파일을 잠그었을 경우 파일을 잠근 사용자만 수정을 해서 커밋을 할 수 있고 다른 사용자는 수정을 할 수 없습니다. 파일의 잠금을 해제할 경우에는 svn unlock 명령을 사용하면 됩니다. 파일 잠금기능은 여러명이 개발을 하고 있을 경우 한 파일에서 작업이 너무 많아 모두 끝내지 못하고 중간 중간에 커밋만 해놓았을 경우 다른 사람이 그 파일을 수정해버리면 하던 작업이 엉망이 되어 버립니다. 그래서 파일을 잠그어 작업이 끝날때 까지 한 사람만 커밋을 할 수 있도록 하는 것입니다. 작업이 끝나면 파일 잠금을 해제 하면 됩니다.

[edit]

5.11 Add

svn add 명령으로 새 파일을 추가할 수 있습니다.
sample# svn add hello.c
A hello.c

svn add로 파일을 추가한 뒤에는 svn commit으로 커밋을 해주어야 완전히 파일이 저장소에 추가됩니다.
sample# svn commit

물론 커밋 로그도 입력해야 됩니다.

[edit]

5.12 Export

체크아웃은 Subversion이 버전관리를 할 수 있도록 각종 파일이 소스 폴더 안에 함께 생깁니다. 이것과는 달리 Export는 순수하게 프로그램의 소스만 가져올 수 있습니다. 만들어진 소스를 압축하여 릴리즈 할 때 사용합니다.
sample# svn export http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample2/trunk sample

--revision (-r)으로 revision을 지정하면 지정한 revision의 소스를 받아옵니다. 지정하지 않으면 가장 최근의 revision의 것을 가져옵니다.

[edit]

5.13 Branch와 Tag

CVS에서의 Branch와 Tag는 Branch와 Tag를 위한 명령이 있습니다. CVS에서 Branch와 Tag를 하게 되면 저장소의 파일에는 Branch 또는 Tag 되었다는 표시가 함께 붙게 됩니다. 체크아웃 할 때에도 Branch와 Tag의 소스를 받아오려면 Branch, Tag를 지정하는 옵션을 주어야 했습니다.

CVS와는 달리 Subversion은 Branch와 Tag가 특별한 명령이 있는 것도 아니고 이런 것들을 한다고 해도 저장소에 특별히 Branch, Tag라고 기록이 남는 것도 아닙니다. Subversion에서 Branch와 Tag는 단순한 디렉토리 복사 명령으로 할 수 있고 Branch, Tag를 했더라도 디렉토리 복사와 같습니다.

[edit]

5.13.1 Branch

Branch를 해야 할 경우는 앞서 설명 했듯이 프로젝트중 작은 분류로 나누어 개발 하거나 소스를 따로 분리하여 실험적인 코드 를 작성할 경우 등 입니다.

Subversion에서는 Branch를 copy 명령으로 수행 합니다. trunk의 내용을 Branches안에 새로운 이름으로 복사 하는 것입니다. 체크아웃 받은 소스에서 바로 copy를 할 수도 있고 원격에서 URL로 복사를 할 수도 있습니다. 아래 체크아웃 받은 것은 trunk만 받은 것이 아니고 sample 디렉토리 아래를 전부 받는 것입니다.
svn checkout http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample sample
sample# svn copy trunk branches/sample-branch
sample# svn commit

원격에서 URL로 copy를 하면 commit도 같이 이루어집니다. 체크아웃 받은 소스에서는 update를 해주어야 합니다.
# svn copy http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/trunk \

http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/branches/sample-branch

Branch된 소스를 받기 위해서는 branches/sample-branch를 체크아웃 하면 됩니다. trunk와 branche는 따로 revision을 가지지 않습니다. Subversion의 revision은 저장소 전체의 revision입니다.
# svn checkout \
http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/branches/sample-branch \
sample-branch
[edit]
5.13.1.1 Merge
위와 같이 우리는 trunk를 sample-branch로 Branch 했습니다. sample-branch를 수정하다가 trunk에도 반영하고 싶다면. merge 명령을 사용하면 됩니다. 하나하나 소스 코드를 옮겨서 입력하지 않아도 됩니다. 다만 merge 한 뒤에는 꼭 사람이 확인을 해 봐야겠죠.

sample-branch를 체크아웃 합니다.
# svn checkout \
http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/branches/sample-branch \
sample-branch


sample-branch의 sample.c를 다음과 같이 수정 합니다. printf("Hello World\n");를 추가 했습니다. 그리고 commit을 합니다. 지금 수정된 것은 revision 7입니다.
#include <stdio.h>
int main()
{
printf("Sample Program Version 0.2\n");
printf("Hello Subversion\n");
printf("Hello World\n");
return 0;
}

이제 sample의 trunk를 체크아웃 합니다.
# svn checkout http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/trunk sample

trunk의 sample.c는 아래와 같습니다.
#include <stdio.h>
int main()
{
printf("Sample Program Version 0.2\n");
printf("Hello Subversion\n");
return 0;
}

이제 sample-branch의 수정된 것을 trunk에 merge 해 보겠습니다. "svn merge -r N:N 저장소주소 체크아웃된디렉토리" 형식 입니다. 아래는 저장소 주소 하나만 입력되어 있습니다. 이렇게 되면 지금 체크아웃한 소스와 merge를 하게 됩니다. merge할 revision 번호를 주의해 주십시오. 6:7은 r 6과 r 7의 차이점을 뜻합니다. sample-branch의 r 6과 r 7의 차이점을 지금의 체크아웃된 trunk에 적용하라는 것 입니다.
sample# svn merge -r 6:7 \
http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/branches/sample-branch
U sample.c
sample# svn commit
sample# svn update

이제 sample.c를 열어보면 아래와 같이 sample-branch에서 수정한 것이 merge가 되어 있습니다.
#include <stdio.h>
int main()
{
printf("Sample Program Version 0.2\n");
printf("Hello Subversion\n");
printf("Hello World\n");
return 0;
}

파일 하나만 merge를 할 수도 있습니다.
# svn merge -r 6:7 sample.c

저장소 주소끼리 merge를 할 수도 있습니다.
# svn merge http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample2/trunk \
http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample2/branches/sample-branch

[edit]

5.13.2 Tag

Tag는 만든 프로그램을 웹 사이트 등에 공개할 때 사용합니다. Tag도 Subversion에서는 Branch와 마찬가지로 디렉토리 복사(copy)와 같습니다. tags 디렉토리 안에는 일반적으로 릴리즈(발표)하는 버전별 디렉토리를 만들어 사용합니다.

0.1 버전을 발표할 때 0.1 버전의 순간을 tags 디렉토리에 복사하는 것입니다. 0.2가 되었을 때 tags아래 0.2 디렉토리로 복사합니다. 이렇게 되면 각각의 버전별로 소스를 관리 할 수 있습니다. 저장소에서는 실제로 복사가 되는 것은 아니고 변경된 점만 복사하기 때문에 저장소의 용량이 소스코드의 크기만큼 배로 늘어나지는 않습니다.

trunk의 소스를 0.1 버전으로 Tag, Branch와 마찬가지로 체크아웃 받은 소스에서도 할 수 있고 원격에서 URL로도 할 수 있습니다. 아래 체크아웃 받은 것은 trunk만 받은 것이 아니고 sample 디렉토리 아래를 전부 받는 것입니다.
# svn checkout http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample sample

sample# svn copy trunk tags/0.1

sample# svn commit

원격에서 URL로 복사합니다. 이 경우 commit도 같이 이루어집니다. 체크아웃 받은 소스는 update를 해주어야 합니다.
# svn copy http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/trunk \
http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/tags/0.1


이제 0.1로 Tag한 소스를 Export로 받아서 압축한 뒤에 릴리즈(공개)를 하면 됩니다.
# svn export http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/tags/0.1 sample-0.1


[edit]

5.14 Revert

소스를 수정하면서 merge를 하다 보면 분명히 잘못 했을 경우가 생깁니다. 이럴 때 하는 것이 revert입니다. revert는 단어 뜻 그대로 되돌리는 명령입니다. 커밋을 하기 전에만 되돌릴 수 있습니다. 커밋 하기전의 체크아웃 받은 소스를 되돌리는 명령입니다. 원격 저장소의 것은 되돌릴 수 없습니다.
sample# svn revert sample.c

저작자 표시 비영리 동일 조건 변경 허락
Posted by 파이델