1 소프트웨어 버전 관리의 이해 #
1.1 버전 관리 시스템의 필요성 #
- 개발 버전과 릴리즈 버전을 섞이지 않고 쉽게 관리 할 수 있습니다.
- 소스를 잘 못 수정 했더라도 기록이 남고 되돌리기가 쉽습니다.(많은 파일의 경우 유용)
- 수정, 추가, 삭제 등의 기록이 모두 남고 변경 사항을 추적하기 쉽습니다.
- 개발자들이 따로 따로 백업을 하지 않아도 됩니다.
가장 유용한 장점은 아무래도 잘못 수정한 소스를 쉽게 되돌릴 수 있다는 것입니다. 프로젝트가 커지다보면 소스가 꼬이게 되고 골치 아픈 상황이 한두 번 발생하는 것이 아니죠. 그리고 변경 사항이 모두 기록되고 무엇을 변경 했는지 쉽게 볼 수 있습니다. 옆 사람이 수정한 것을 쉽게 볼 수 있습니다. 그리고 가장 큰 문제를 일으키는 백업을 하지 않아 소스를 분실하는 최악의 상황도 쉽게 해결 됩니다.
1.2 버전 관리 시스템의 종류 #
- CVS (Concurrent Version System) : 가장 널리 사용되며 역사가 깊은 버전 관리 시스템입니다. http://www.cvshome.org
- Subversion : CVS의 단점을 개선하고 CVS를 대체할 목적으로 개발 되었습니다. 이 문서에서 설명할 버전 관리 시스템입니다. http://subversion.tigris.org
- Visual Sourcesafe : Microsoft에서 만든 버전 관리 시스템입니다. CVS와는 버전 관리 관점에서 조금의 차이점이 있습니다. 윈도우 기반 소프트웨어의 버전 관리를 할 때 자주 사용됩니다. http://msdn.microsoft.com/ssafe/
- Clear Case : Rational이라는 회사에서 만든 버전 관리 시스템입니다. 지금은 IBM에 합병되었습니다. 상용 소프트웨어입니다. http://www-306.ibm.com/software/rational
- BitKeeper : 리눅스 커널이 BitKeeper를 이용해서 개발 하고 있습니다. 상용 소프트웨어입니다. http://www.bitkeeper.com
1.3 버전 관리 시스템의 용어들 #
1.4 저장소의 디렉토리 배치 #
-- http://svn.samplerepository.org/svn/sample +--+---+- branches | +--+- dav-mirror | | |--- src | | |--- doc | | +--- Makefile | | | +--- svn-push | +--- svnserve-thread-pools | +---+- tags | +--- 0.10 | +--+- 0.10.1 | | |--- src | | |--- doc | | +--- Makefile | | | +--- 0.20 | +--- 0.30 | +--- 0.50 | +--- 1.01 | +---+- trunk |--- src |--- doc +--- Makefile
2 Subversion #
2.1 CVS와 비교한 Subversion의 장점들 #
- 커밋 단위가 파일이 아니라 체인지셋이라는 점입니다. CVS에서라면 여러 개의 파일을 한꺼번에 커밋하더라도 각각의 파일마다. 리비전이 따로 붙습니다. 반면 Subversion에서는 파일별 리비전이 없고 한번 커밋할 때마다 변경 사항별로 리비전이 하나씩 증가합니다.
- CVS에 비해 엄청나게 빠른 업데이트/브랜칭/태깅 시간.
- CVS와 거의 동일한 사용법. CVS 사용자라면 누구나 어려움 없이 금방 배울 수 있습니다.
- 파일 이름변경, 이동, 디렉토리 버전 관리도 지원.
- 원자적(atomic) 커밋. CVS에서는 여러 파일을 커밋하다가 어느 한 파일에서 커밋이 실패했을 경우 앞의 파일만 커밋이 적용되고 뒤의 파일들은 그대로 남아있게 됩니다. Subversion은 여러개의 파일을 커밋하더라도 커밋이 실패하면 모두 이전 상태로 되돌아 갑니다.
- 양방향 데이터 전송으로 네트워크 소통량(트래픽) 최소화.
- 트리별, 파일별 접근 제어 리스트. 저장소 쓰기 접근을 가진 개발자라도 아무 소스나 수정하지 못하게 조절할 수 있습니다.
- 저장소/프로젝트별 환경 설정 가능
- 확장성을 염두에 둔 구조, 깔끔한 소스
2.2 설치 준비 작업 #
2.3 사용 할 각각의 파일들 구하기 #
- Subversion 소스파일 http://subversion.tigris.org subversion-1.4.X.tar.gz
Subversion은 최신 버전을 받습니다. - Subversion 의존성 소스 http://subversion.tigris.org subversion-deps-1.4.X.tar.gz 이 안에 Subversion 컴파일에 필요한 라이브러리가 들어있으니 꼭 받아야 합니다.
- Apache2 http://httpd.apache.org httpd-2.0.XX.tar.gz
Apache 2 도 최신 버전을 받습니다. 1.3버전은 연동이 불가능 합니다. - Berkeley DB http://www.oracle.com/technology/software/products/berkeley-db/db/index.html db-4.3.29.tar.gz
Berkeley DB는 버전을 꼭 4.3.29을 사용하여야 합니다. - OpenSSL http://www.openssl.org/source openssl-0.9.7c.tar.gz
OpenSSL은 LASTEST라고 된 것을 받습니다.
위의 파일들을 /root에 받습니다.
3.1 OpenSSL 컴파일과 설치 #
# tar vxzf openssl-0.9.7c.tar.gz # cd openssl-0.97c openssl-0.97c# ./config openssl-0.97c# make openssl-0.97c# make install
3.2 Berkeley DB 컴파일과 설치 #
# tar vxzf db-4.3.29.tar.gz # cd db-4.3.29 db-4.3.29# cd build_unix db-4.3.29/build_unix# ../dist/configure db-4.3.29/build_unix# make db-4.3.29/build_unix# make install db-4.3.29/build_unix# echo "/usr/local/BerkeleyDB.4.3/lib" >> /etc/ld.so.conf db-4.3.29/build_unix# ldconfig
3.3 Apache 컴파일과 설치 #
# tar vxzf httpd-2.0.59.tar.gz httpd-2.0.59# ./configure --prefix=/usr/local/apache2 --enable-suexec --enable-so --with-suexec-caller=bin --enable-ssl --with-ssl=/usr/local/ssl --enable-cache --enable-ext-filter --with-z=/usr/include --enable-dav --with-dbm=db4 --with-berkeley-db=/usr/local/BerkeleyDB.4.2 httpd-2.0.59# make httpd-2.0.59# make install
# tar vxzf httpd-2.0.59.tar.gz httpd-2.0.59# ./configure --prefix=/usr/local/apache2 --enable-suexec --enable-so --with-suexec-caller=bin --enable-ssl --with-ssl=/usr/local/ssl --enable-cache --enable-ext-filter --with-z=/usr/include --enable-dav httpd-2.0.59# make httpd-2.0.59# make install
3.4 Subversion 컴파일과 설치 #
# tar vxzf subversion-1.4.2.tar.gz # tar vxzf subversion-deps-1.4.2.tar.gz # cd subversion-1.4.2 subversion-1.4.2# ./configure --with-zlib --with-apxs=/usr/local/apache2/bin/apxs --with-berkeley-db=/usr/local/BerkeleyDB.4.3 subversion-1.4.2# make subversion-1.4.2# make install
# tar vxzf subversion-1.4.2.tar.gz # tar vxzf subversion-deps-1.4.2.tar.gz # cd subversion-1.4.2 subversion-1.4.2# ./configure --with-zlib --with-apxs=/usr/local/apache2/bin/apxs --without-berkeley-db subversion-1.4.2# make subversion-1.4.2# make install
# tar vxzf subversion-1.4.2.tar.gz # tar vxzf subversion-deps-1.4.2.tar.gz # cd subversion-1.4.2 subversion-1.4.2# ./configure --with-zlib --with-berkeley-db=/usr/local/BerkeleyDB.4.3 subversion-1.4.2# make subversion-1.4.2# make install
# tar vxzf subversion-1.4.2.tar.gz # tar vxzf subversion-deps-1.4.2.tar.gz # cd subversion-1.4.2 subversion-1.4.2# ./configure --with-zlib --without-berkeley-db subversion-1.4.2# make subversion-1.4.2# make install
4.1 저장소 만들기 #
# mkdir /home/svn # cd /home/svn/ /home/svn# svnadmin create --fs-type bdb sample
# mkdir /home/svn # cd /home/svn/ /home/svn# svnadmin create --fs-type fsfs sample
4.1.1 공동 작업을 위한 저장소 그룹 설정 #
# chmod -R g+w sample
4.2 Apache 설정 #
# cd /home/svn /home/svn# chown -R nobody.nogroup sample
LoadModule dav_module modules/mod_dav.so LoadModule dav_svn_module modules/mod_dav_svn.so
<Location /svn/sample> DAV svn SVNPath /home/svn/sample </Location>
이렇게 설정을 하고 웹 브라우저에서 http://(Subversion과 Apache를 설치한 IP주소 또는 도메인)/svn/sample 로 접속을 합니다.
Revision 0: / -------------------------------------------------------------------------------- Powered by Subversion version 1.0.0.
위와 같이 설정하면 누구든지(Anonymous) 웹 브라우저로 저장소를 볼 수 있고 Subversion 클라이언트를 이용해서 소스를 체크아웃, 익스포트, 커밋을 할 수 있습니다.
4.2.1 Apache에서 ID로 사용자 인증 #
아파치에 사용할 패스워드 파일을 만듭니다. "# htpasswd -c 패스워드파일명 사용자ID"
# cd /usr/local/apache/conf /usr/local/apache/conf# ../bin/htpasswd -c passwd sampleuser New password: Re-type new password:
"# htpasswd -c"는 패스워드 파일을 처음 만들 때의 옵션이고 사용자를 추가하고 싶을 때에는 "# htpasswd 패스워드파일명 사용자ID" 로 해주면 됩니다.
<Location /svn/sample> DAV svn SVNPath /home/svn/sample AuthType Basic AuthName "pyrasis's Repository" AuthUserFile /usr/local/apache2/conf/passwd Require valid-user </Location>
4줄이 추가 되었습니다. AuthType Basic은 Apache 기본 패스워드 인증입니다. AuthName은 패스워드가 걸린 웹페이지에 뜨는 로그인창에 나올 문장입니다. AuthUserFile은 방금 전 만들었던 아파치 패스워드 파일입니다. 절대경로로 적어주어야 합니다. Require valid-user는 인증된 사용자만 볼 수 있게 한다는 것입니다.
<Location /svn/sample>
DAV svn
SVNPath /home/svn/sample
AuthType Basic
AuthName "pyrasis's Repository"
AuthUserFile /usr/local/apache2/conf/passwd
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>
</Location>
이렇게 하면 저장소를 보거나 체크아웃을 할 때는 ID와 패스워드를 묻지 않고 커밋이나 디렉토리. 파일복사 등의 저장소를 변경하는 작업을 할 때에는 ID와 패스워드를 물어보게 됩니다.
4.3 svnserve를 사용한 서버 #
# svnserve -d -r /home/svn/
4.3.1 svnserve에서 ID로 사용자 인증 #
### 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 = none auth-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
[users] sampleuser = 02030104
4.4 SSH + svnserve 서버 #
[tunnels] ssh = ssh -l sampleuser
# svn checkout svn+ssh://(Subversion 서버의 IP주소 또는 도메인)/home/svn/sample sample
5 실제로 사용하기 #
5.1 에디터 설정 #
SVN_EDITOR=/usr/bin/vim export SVN_EDITOR
5.2 기본 디렉토리 만들기 #
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
Log message unchanged or not specified a)bort, c)ontinue, e)dit
Committed revision 1.
# svn list http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample branches/ tags/ trunk/
하지만! 커밋 로그 입력은 필수입니다. 소프트웨어 버전 관리에서 가장 중요한 것은 커밋 로그입니다. 어떤 코드를 어떻게 수정했고 디렉토리, 파일을 만들고 삭제 했는지를 꼼꼼히 기록해야합니다. 나중에 소스코드가 바뀌는 흐름을 따라가고자 할때나 문제점(버그)을 추적할때 커밋 로그가 아주 유용하게 이용될 것입니다.
5.3 Import #
# mkdir sampledir # cd sampledir sampledir# vim sample.c
#include <stdio.h> int main() { printf("Sample Program Version 0.1n"); return 0; }
sampledir# cd .. # svn import sampledir http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/trunk
import도 위에서 디렉토리를 만들었을 때 처럼 vim이 실행되게 됩니다. import되는 파일들이 표시됩니다. :q!로 닫고 c를 입력하면 import 되게 됩니다.
# svn list http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/trunk sample.c
5.4 Checkout #
# svn checkout http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/trunk sample A sample/sample.c Checked out revision 4.
5.5 Update #
sample# svn update
5.6 Commit #
#include <stdio.h> int main() { printf("Sample Program Version 0.2n"); printf("Hello Subversionn"); return 0; }
sample# svn commit Sending sample.c Transmitting file data . Committed revision 5.
5.7 Log #
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 -----------------------------------------------------------------------
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 ------------------------------------------------------------------------
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 ------------------------------------------------------------------------
5.8 Diff #
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.1n"); + printf("Sample Program Version 0.2n"); + printf("Hello Subversionn"); 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.1n"); + printf("Sample Program Version 0.2n"); + printf("Hello Subversionn"); return 0; }
5.9 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.2n"); 5 sampleuser printf("Hello Subversionn"); 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.3n"); 6 pyrasis printf("Hello Subversionn"); 4 sampleuser 4 sampleuser return 0; 4 sampleuser } 4 sampleuser
sample# svn blame -r 4 sample.c
5.10 lock #
sample# svn lock hello.c
svn lock 명령으로 파일을 잠그었을 경우 왜 잠그었는지 로그를 기록할 수 있습니다.
파일을 잠그었을 경우 파일을 잠근 사용자만 수정을 해서 커밋을 할 수 있고 다른 사용자는 수정을 할 수 없습니다. 파일의 잠금을 해제할 경우에는 svn unlock 명령을 사용하면 됩니다.
파일 잠금기능은 여러명이 개발을 하고 있을 경우 한 파일에서 작업이 너무 많아 모두 끝내지 못하고 중간 중간에 커밋만 해놓았을 경우 다른 사람이 그 파일을 수정해버리면 하던 작업이 엉망이 되어 버립니다. 그래서 파일을 잠그어 작업이 끝날때 까지 한 사람만 커밋을 할 수 있도록 하는 것입니다. 작업이 끝나면 파일 잠금을 해제 하면 됩니다.
5.11 Add #
sample# svn add hello.c A hello.c
svn add로 파일을 추가한 뒤에는 svn commit으로 커밋을 해주어야 완전히 파일이 저장소에 추가됩니다.
sample# svn commit
물론 커밋 로그도 입력해야 됩니다.
5.12 Export #
sample# svn export http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample2/trunk sample
--revision (-r)으로 revision을 지정하면 지정한 revision의 소스를 받아옵니다. 지정하지 않으면 가장 최근의 revision의 것을 가져옵니다.
5.13 Branch와 Tag #
5.13.1 Branch #
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
5.13.1.1 Merge #
# svn checkout http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/branches/sample-branch sample-branch
#include <stdio.h> int main() { printf("Sample Program Version 0.2n"); printf("Hello Subversionn"); printf("Hello Worldn"); 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.2n"); printf("Hello Subversionn"); 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.2n"); printf("Hello Subversionn"); printf("Hello Worldn"); return 0; }
# svn merge -r 6:7 sample.c
# svn merge http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample2/trunk http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample2/branches/sample-branch
5.13.2 Tag #
# svn checkout http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample sample sample# svn copy trunk tags/0.1 sample# svn commit
# svn copy http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/trunk http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/tags/0.1
# svn export http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/tags/0.1 sample-0.1
5.14 Revert #
sample# svn revert sample.c
5.15 백업 및 복구 #
Windows, 리눅스, BSD 등 운영체제에 관계없이 백업 및 복구가 가능합니다. Windows에서 백업한것을 리눅스에서 사용할 수도 있고 BSD에서 백업한 것을 Windows에서 사용할 수도 있습니다.
저장소의 서버를 옮길때에는 저장소 디렉토리를 옮기는 것이 아니라 저장소 백업을 한뒤 그 백업파일을 이용하여 새 서버에서 복구를 하는 방식으로 옮겨야합니다.
5.15.1 Dump #
repos# ls sample repos# svnadmin dump sample > sample.dump
5.15.2 Load #
빈 저장소를 생성한 뒤 백업 파일을 이용해서 복구를 합니다.
repos# svnadmin create sample repos# ls sample sample.dump repos# svnadmin load sample < sample.dump
5.16 svnsync #
# cd /home/svn/ /home/svn# svnadmin create syncsample
#!/bin/sh
/home/svn/syncsample/hooks# chmod 777 pre-revprop-change
/home/svn# svnsync init file:///home/svn/syncsample http://svn.collab.net/repos/svn Copied properties for revision 0.
/home/svn# svnsync sync file:///home/svn/syncsample Committed revision 1. Copied properties for revision 1. Committed revision 2. Copied properties for revision 2. Committed revision 3. Copied properties for revision 3. Committed revision 4. Copied properties for revision 4. Committed revision 5. Copied properties for revision 5. Committed revision 6. Copied properties for revision 6. ....
최신 리비전 까지 복사해오면 svnsync 명령이 끝난 것입니다.
이제 이 저장소에서 소스를 체크아웃 하여 살펴볼 수 있습니다.
C:repos>svnadmin create syncsample
C:repos>svnsync init file:///c:/repos/syncsample http://svn.collab.net/repos/svn
C:repos>svnsync sync file:///c:/repos/syncsample
6 Microsoft Windows에서 사용하기 #
6.1 설치 파일 구하기 #
6.3 사용하기 #
C:Documents and SettingsAdministrator>cd c:repos
버클리 DB를 이용한 저장소
C:repos>svnadmin create --fs-type bdb sample
파일시스템을 이용한 저장소
C:repos>svnadmin create --fs-type fsfs sample
C:temp>svn checkout file:///C:/repos/sample
C:>svnserve -d -r C:repos
7 운영체제별 전용 패키지 #
http://subversion.tigris.org/project_packages.html
8 GUI 클라이언트 프로그램 #
8.1 TortoiseSVN #
http://tortoisesvn.tigris.org
8.2 Ankhsvn #
http://ankhsvn.tigris.org
8.3 RapidSVN #
http://rapidsvn.tigris.org
9.1 ViewVC #
http://www.viewvc.org
9.2 WebSVN #
http://websvn.tigris.org