http://wiki.kldp.org/wiki.php/SubversionBook/GuidedTour#svn-ch-3-sect-7.1
http://www.pyrasis.com/main/Subversion-HOWTO
파일시스템을 이용한 저장소 만들기
# mkdir /home/svn# cd /home/svn//home/svn# svnadmin create --fs-type fsfs sample
svnadmin으로 sample이라는 저장소를 만들면 /home/svn 아래 sample이라는 디렉토리가 생깁니다. 이 디렉토리 안에는 Subversion이 제어하는 파일들이 들어있습니다. 이 디렉토리 안의 파일들은 Berkeley DB 형식으로 되어 있습니다. DB 파일들은 수정하는 일이 없도록 합니다. sample 저장소의 전체 경로는 /home/svn/sample이 됩니다.
이제부터 sample 저장소를 계속 사용하여 설명을 하겠습니다.
4.1.1 공동 작업을 위한 저장소 그룹 설정 #
svn+ssh://로 작업을 하려면 시스템 계정을 만들어야 합니다. 대부분 계정을 만들고 그룹을 하나로 묶는데. 이럴 경우 그룹에 소속된 사용자들에게도 저장소 쓰기 권한을 주어야 합니다. 그래서 저장소의 그룹 권한을 조정해주어야 합니다. 그룹 쓰기 권한을 주지 않으면 저장소를 만든 계정만 저장소에 접근이 가능하고. 그룹에 속해 있더라도 다른 사용자는 저장소에 접근 할 수 없게 됩니다
# chmod -R g+w sample
Subversion의 고유 프로토콜인 svn://을 이용할 수 있는 svnserve를 사용해서 서버 설정을 해보겠습니다. 이것을 사용하면 Apache를 사용한 것보다 체크아웃, 커밋 속도가 더 빠릅니다.
svnserve로 서버를 실행 시키면 3690번의 포트가 열립니다. sample 저장소가 /home/svn 아래에 있을 경우
# svnserve -d -r /home/svn/
이렇게 실행 시켰으면 "# svn checkout svn://(Subversion서버 IP또는 도메인)/sample sample"을 입력합니다. "Checked out revision 0."이 나오면 제대로 설정이 된 것입니다. 이것 또한 아무나(Anonymous) 저장소에 접근해서 체크아웃, 커밋 등을 할 수 있습니다.
4.3.1 svnserve에서 ID로 사용자 인증 #
Subversion 0.33.0버전 이후부터 svnserve로 ID로 사용자 인증이 가능하게 되었습니다. 그 이전 버전에서 svnadmin으로 저장소를 만들면 저장소 디렉토리 아래에 conf 디렉토리가 생기지 않지만 0.33.0 버전이후에 svnadmin으로 저장소를 만들었다면 저장소 디렉토리 아래에 conf 디렉토리가 자동으로 생성됩니다. 이전 버전에서 먼저 저장소를 만들어 두었다면 저장소 디렉토리 /home/svn/sample 아래 conf 디렉토리를 만들어 줍니다. (/home/svn/sample/conf)
이제 각 저장소 디렉토리 아래 conf 디렉토리가 있습니다. /home/svn/sample/conf/svnserve.conf 파일이 svnserve의 설정 파일입니다. 0.33.0 버전 이전 만든 저장소에는 conf 디렉토리 및 svnserve.conf 파일이 없습니다. 그럴 경우에는 conf 디렉토리와 svnserve.conf 파일을 만들어 주면 됩니다.
svnserve.conf 파일을 아래와 같이 설정 합니다.
5.2 기본 디렉토리 만들기 #
*import
5.7 Log #
min create --fs-type fsfs samsung_project
chmod -R g+w samsung_project/
conf/svnserve.conf 수정
passwd 파일 생성
svn mkdir svn://raffallo.snu.ac.kr/samsung_project/trunk
svn mkdir svn://raffallo.snu.ac.kr/samsung_project/branches
svn mkdir svn://raffallo.snu.ac.kr/samsung_project/tags
(처음 svn을 시작할때는 sudo svnserve -d -r /home/svn/ 을 해주어야 3690번의 포트가 열림)
### This file controls the configuration of the svnserve daemon, if you### use it to allow access to this repository. (If you only allow### access through http: and/or file: URLs, then this file is### irrelevant.)### Visit http://subversion.tigris.org/ for more information.[general]### These options control access to the repository for unauthenticated### and authenticated users. Valid values are "write", "read",### and "none". The sample settings below are the defaults.anon-access = noneauth-access = write### The password-db option controls the location of the password### database file. Unless you specify a path starting with a /,### the file's location is relative to the conf directory.### The format of the password database is similar to this file.### It contains one section labelled [users]. The name and### password for each user follow, one account per line. The### format is### USERNAME = PASSWORD### Please note that both the user name and password are case### sensitive. There is no default for the password file.password-db = passwd### This option specifies the authentication realm of the repository.### If two repositories have the same authentication realm, they should### have the same password database, and vice versa. The default realm### is repository's uuid.realm = pyrasis's Repository
anon-access = none으로 아무에게나(Anonymous) 저장소에 접근하는 것을 막았습니다. read로 하면 읽기만 가능하며 write로 해주면 읽고 쓰기가 가능해집니다.
auth-access = write는 ID로 인증된 사용자에게 쓰기 권한을 주는 것입니다.
password-db = passwd 이 설정은 svnserve의 패스워드 파일입니다 이전의 Apache 패스워드 파일과는 별개입니다. 아래 내용으로 /home/svn/sample/conf 아래 passwd 라는 이름으로 만듭니다. ID = 패스워드 형식 입니다. 아직 암호화된 패스워드는 지원하지 않는 것 같습니다. 버전 업을 통해 개선 될 것 같습니다.
passwd
[users]sampleuser = 02030104
이제 "# svn checkout svn://(Subversion 서버의 IP또는 도메인)/sample sample" 을 해보면 ID와 패스워드를 입력하라고 나옵니다. 위에서 설정했던 ID와 패스워드를 입력하면 체크아웃이 되며 "Checked out revision 0." 이 나오면 설정이 제대로 된 것입니다.
5.2 기본 디렉토리 만들기 #
앞서 설명 했던 trunk, branches, tags 디렉토리를 만들어 보겠습니다.
trunk 디렉토리의 생성, 앞에서 Apache를 통해 설정 했다면 http://를 svnserve로 설정했다면 svn://로 SSH를 사용한다면 svn+ssh://로 하여 서버 설정에 맞게 주소를 적어 주십시오.
apache를 연동한 경우
svnserve만 실행한 경우
위처럼 입력을 하면 vim이 실행되면서 아래와 같이 나올 것입니다. :q!로 빠져 나갑니다.
apache를 연동한 경우
# svn mkdir http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/trunk
# svn mkdir svn://(Subversion서버 IP또는 도메인)/sample/trunk
--This line, and those below, will be ignored--A http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/trunk
vim을 빠져 나왔다면 아래와 같이 나오는데(커밋 로그를 입력하지 않으면 아래와 이 나오게됩니다.) c를 누르고 엔터를 치면 디렉토리가 만들어 지게 됩니다.
Log message unchanged or not specifieda)bort, c)ontinue, e)dit
c를 입력한뒤 아래와 같이 나오면 디렉토리 생성은 성공한 것입니다. 이 방법대로 branches, tags 디렉토리도 만듭니다.
제대로 만들어 졌는지 확인을 하려면 다음과 같이 입력 합니다. list는 저장소 안의 디렉토리와 파일들을 표시해 줍니다.Committed revision 1.
만약 read-only에러가 나올 경우 conf/svnserve.conf에서 계정을 만들지 않아서 그렇습니다. anonymous로 사용할 경우 #general, #anon-access = read 가 주석 처리 되어 있는데 주석을 없애고 anon-access = write로 바꾸시면 됩니다.
제대로 만들어 졌는지 확인을 하려면 다음과 같이 입력 합니다. list는 저장소 안의 디렉토리와 파일들을 표시해 줍니다.
# svn list http://(Subversion 서버의 IP주소 또는 도메인)/svn/samplebranches/tags/trunk/
앞으로 디렉토리 생성, 삭제, 이름변경, 파일, 추가, 삭제, 복사, 이동과 커밋, 등을 할 때 vim이 실행되면서 어떤 것들이 바뀌는지 표시가 됩니다. 커밋 로그를 입력한뒤 vim을 종료하면 커밋이 완료 됩니다. 커밋 로그를 입력하지 않았을 경우 a)bort, c)ontinue, e)dit가 나오게 되는데 c)ontinue)로 계속 하면 됩니다.
하지만! 커밋 로그 입력은 필수입니다. 소프트웨어 버전 관리에서 가장 중요한 것은 커밋 로그입니다. 어떤 코드를 어떻게 수정했고 디렉토리, 파일을 만들고 삭제 했는지를 꼼꼼히 기록해야합니다. 나중에 소스코드가 바뀌는 흐름을 따라가고자 할때나 문제점(버그)을 추적할때 커밋 로그가 아주 유용하게 이용될 것입니다.
하지만! 커밋 로그 입력은 필수입니다. 소프트웨어 버전 관리에서 가장 중요한 것은 커밋 로그입니다. 어떤 코드를 어떻게 수정했고 디렉토리, 파일을 만들고 삭제 했는지를 꼼꼼히 기록해야합니다. 나중에 소스코드가 바뀌는 흐름을 따라가고자 할때나 문제점(버그)을 추적할때 커밋 로그가 아주 유용하게 이용될 것입니다.*import
맨 처음 프로젝트를 시작할 때 저장소에 소스들을 넣어야 합니다. 이럴 때 하는 것이 import 작업입니다. sampledir 이라는 디렉토리를 만든 뒤에 그 아래 다음과 같은 간단한 소스를 작성해 보십시오.
# mkdir sampledir# cd sampledirsampledir# 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 디렉토리 아래에 올라가게 됩니다.
import도 위에서 디렉토리를 만들었을 때 처럼 vim이 실행되게 됩니다. import되는 파일들이 표시됩니다. :q!로 닫고 c를 입력하면 import 되게 됩니다.
sampledir# cd ..# svn import sampledir http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/trunk
import가 제대로 되었는지 확인해 봅시다. list 명령을 이용해 trunk 디렉토리에 무엇이 있나 보겠습니다.
# svn list http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/trunksample.c
5.4 Checkout #
이제 부터 Subversion을 이용해서 프로그램 소스를 관리 할 수 있습니다. checkout을 해서 어디서든 소스를 받아 볼 수 있습니다. 방금 import를 하기위해 만들었던 sampledir은 지워도 됩니다.
svn checkout은 svn co로 줄일 수 있습니다. "svn checkout 저장소주소 로컬디렉토리" 의 형식 입니다.
# svn checkout http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/trunk sampleA sample/sample.cChecked out revision 4.
checkout을 한 디렉토리 안에는 .svn 이라는 디렉토리가 있습니다. 이 디렉토리는 Subversion 저장소 정보가 들어 있기 때문에 지우면 안 됩니다.
5.5 Update #
체크아웃 해서 받은 소스를 저장소의 최근 내용으로 업데이트 하는 명령입니다. 체크아웃 해서 받은 소스의 revision보다 저장소의 revision이 높으면 업데이트 하게 됩니다. 업데이트를 하게 되면 전부 다 받아오는 것이 아니라 변경 된 것들만 받아옵니다. 소스를 수정하기 전에 언제나 update 명령으로 소스를 가장 최신 revision으로 맞추고 작업을 해야 합니다.
svn update는 svn up로 줄여 사용할 수 있습니다.
sample# svn update
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 commitSending sample.cTransmitting file data .Committed revision 5.
이제 저장소에 어떠한 것들이 변경 되었는지 확인 할 수 있는 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은 같습니다.
하나의 파일이나 디렉토리 로그를 볼 수도 있습니다.
-v 옵션은 더 자세한 정보를 얻을 수 있습니다. 아래 M은 Modify(수정)의 표시 입니다. 소스 파일을 수정하고 커밋 했기 때문입니다.
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.csample# svn log http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/trunk/sample.c
sample# svn log -r 5 -v------------------------------------------------------------------------r5 | (no author) | 2003-11-23 14:42:34 +0900 (Sun, 23 Nov 2003) | 1 lineChanged 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 lineChanged paths: A /trunk/sample.c------------------------------------------------------------------------r1 | (no author) | 2003-11-23 14:39:00 +0900 (Sun, 23 Nov 2003) | 1 lineChanged paths: A /trunk------------------------------------------------------------------------
5.8 Diff #
diff 명령을 사용하면 예전 소스 파일과 지금의 소스 파일을 비교해 볼 수 있습니다. 위에서 나온 로그와 같이 우리는 revision 4(r4)에서 sample.c를 import 했습니다. 그리고 revision 5에서 소스를 수정하고 커밋 했습니다.
최초에 import 했던 소스 sample.c의 revision 4와 수정해서 커밋한 revision 5의 차이점을 diff 명령으로 출력해 보겠습니다. --revision 4만 적으면 현재 revision 5와 비교하게 됩니다.
revision 4와 5를 비교 하고 싶으면 --revision 4:5 (-r 4:5)로 하면 됩니다. --revision 8:10 도 가능합니다.
여기서는 커밋한 사용자가 한명 밖에 없으므로 전부 똑같이 나옵니다. sample# svn diff --revision 4 sample.cIndex: 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; }sample# svn diff --revision 4:5 sample.cIndex: 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 번호를 가지게 됩니다.
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
min create --fs-type fsfs samsung_project
chmod -R g+w samsung_project/
conf/svnserve.conf 수정
passwd 파일 생성
svn mkdir svn://raffallo.snu.ac.kr/samsung_project/trunk
svn mkdir svn://raffallo.snu.ac.kr/samsung_project/branches
svn mkdir svn://raffallo.snu.ac.kr/samsung_project/tags
(처음 svn을 시작할때는 sudo svnserve -d -r /home/svn/ 을 해주어야 3690번의 포트가 열림)
svn import work svn://raffaello.snu.ac.kr/samsung_project/trunk
-> work 하위 디렉토리 및 소스들이 trunk 디렉토리 아래에 올라감 (work자체는 올라가지 않음)
# svn list svn://raffaello.snu.ac.kr/samsung_project/tru
최초의 checkout은
"# svn checkout svn://(Subversion서버 IP또는 도메인)/sample sample"
디렉토리인 경우
samsung_project$ svn add expat
samsung_project/expat$ svn ci
파일인 경우
samsung_project$ svn add sample.c
samsung_project$ svn ci
==> commit을 해 주어야 완전히 추가됨
samsung_project/papi$ svn up



덧글