Subversion 설치 매뉴얼
modified 2013.06.07
설치 환경
install platform : linux
linux에는 기본적으로 subversion 패키지를 포함하고 있어 따로 다운로드 없이 명령만으로
설치 가능하다. 최신 버전으로 설치하려면 다운받은 뒤 설치해도 된다.
subversion이 설치 되어 있는지 확인한다.
$ rpm -qi subversion
기존 subversion 삭제
$ rpm -e subversion
Subversion
소스코드 설치
홈페이지 : http://subversion.apache.org
소스코드 다운로드 : http://apache.tt.co.kr/subversion/subversion-1.7.3.tar.bz2
$ tar -jxvf subversion-1.7.3.tar.bz2
$ cd subversion-1.7.3
설치 도중에
sqlite 소스코드를 요구한다. 다음에서 다운로드 하여
subversion과 동일한 디렉토리에 둔다.
소스코드 다운로드 : http://www.sqlite.org/sqlite-amalgamation-3071000.zip
$ unzip sqlite-amalgamation-3071000.zip
$ mv sqlite-amalgamation-3071000
sqlite-amalgamation
$ ./configure --prefix=/usr/local/subversion --with-zlib
\
--with-apxs=/usr/local/apache2/bin/apxs \
--without-berkeley-db
$ make
$ make install
Subversion
패키지 설치
$ yum
install subversion
물론 이미 설치 되어 있다면 설치할 필요없다.
svn user 추가
svn를
관리할 사용자를 추가한다.
root로
관리한다면 굳이 추가할 필요는 없다. root로 관리 시 sasl 사용
및 소유가 다른 디렉토리나 파일을 import 할 수 있는 장점이 있다.
$
useradd svn
$ passwd
svn
저장소(Repository) 생성
/home/svn
디렉토리를 SVN 서버의 홈으로 사용한다.
그리고 저장소를 생성한다.
$ su -
svn
$
svnadmin create --fs-type fsfs /home/svn/project
$ chown
-R svn:svn /home/svn/project
* SElinux를 꺼야 user 들이 디렉토리 및 파일을 생성할 수 있다.
# vi /etc/sysconfig/selinux
SELINUX=permissive
재부팅
권한 설정 및 사용자 등록
인증된 사용자들에게만 사용을 허가하기 위해서 /home/svn/project/conf/svnserve.conf
파일을 수정
$ vi
/home/svn/project/conf/svnserve.conf
파일의 중간에 보면 [general] 이 보이는데 이 부분에
추가를 해줍니다.
[general]
anon-access
= none
auth-access = write
password-db = passwd
이제 사용자를 등록하기 위해 /home/svn/project/conf/passwd 파일 수정
$ vi
/home/svn/project/conf/passwd
[users]
svnuser01
= 1234
이런식으로 추가해주면 됩니다. 사용자계정은 svnuser01
암호는 1234가 된다.
sasl 사용
realm 은 repository 도메인 (외부에서 볼 때의 이름)이다.
[general]
anon-access = none
auth-access = write
# password-db = passwd
# authz-db = authz
realm = repositryname
[sasl]
use-sasl = true
#min-encryption = 0
#max-encryption = 256
개인이 사용 할 때는 password-db 를 사용하여 아이디와
비밀번호 설정을 /home/svn/project_name/conf/passwd
파일을 열어서 아이디 = 비밀번호
형식으로 관리하면 쉽다. 하지만 비밀번호가 노출되기 때문에 찝찝하면
sasl을 사용한다.
sasl 인증
추가 (아이디 비밀번호 추가)
saslpasswd2
명령 후에 비밀번호 입력이 뜬다. 그 때 비밀번호를 입력한다.
-u 옵션에 의해 설정되는 도메인명은 svnserve.conf 파일의 realm 설정값과 동일하게 한다.
$
saslpasswd2 -c -u repositryname 아이디
Password:
Again
(for verification):
sasldblistusers2 는 등록된 아이디의 목록을 볼 수 있다. 물론 비밀번호는 볼 수 없다.
$ sasldblistusers2
아이디@repositryname:
userPassword
삭제(참고 - http://www.gsp.com/cgi-bin/man.cgi?topic=saslpasswd2)
$ saslpasswd2 -d -u repositryname 아이디
init 스크립트
만들기
부팅시 마다
subversion 서버를 실행하려면 service 스크립트를 만들어야 한다.
그리고 /etc/init.d/subversion 을 만들고 아래와 같이 입력한다.
#!/bin/bash
#
# . /etc/rc.d/init.d/subversion
#
# Start the Subverion Daemon
#
# chkconfig: 2345 90 10
# description: Subversion Daemon
# processname: svnserve
source /etc/rc.d/init.d/functions
[ -x
/usr/bin/svnserve ] || exit 1
RETVAL=0
prog="svnserve"
desc="Subversion server"
OPTIONS="--threads --root /home/svn"
start()
{
echo -n $"Starting $desc ($prog): "
daemon $prog -d $OPTIONS
RETVAL=$?
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
echo
}
stop() {
echo -n $"Shutting down $desc ($prog): "
killproc $prog
RETVAL=$?
[ $RETVAL -eq 0 ] && success || failure
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
return $RETVAL
}
case
"$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
RETVAL=$?
;;
condrestart)
[ -e /var/lock/subsys/$prog ] && restart
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|condrestart}"
RETVAL=1
esac
exit
$RETVAL
EOF
그 다음 실행 권한을 주고 서비스로 등록한다.
$ chmod
+x /etc/init.d/subversion
$ cd /etc/init.d
$ chkconfig --add subversion && chkconfig subversion on
서버 시작
서비스 모드
$
service subversion start
데몬 모드
$
svnserve -d -r /home/svn
저장소(Repository) 내 디렉토리 생성
* repository 내 디렉토리 생성은 아래와 같이 CLI에서 실행해도 되지만 다른 svn client로도 생성가능하다.
vi 에디터 설정
$ vi /home/svn/.bash_profile
SVN_EDITOR=/usr/bin/vim
export
SVN_EDITOR
$ source
/home/svn/.bash_profile
기본 Repository 생성
$ svn mkdir svn://localhost/project/trunk
editor가 뜨면 :q 로 빠져나옴
continue(C) 로 빠져나옴
인증영역이 나오면 svn(또는root)와 svn사용자 암호 입력
아래와 같이 vim이 실행되면 :q! 로 빠져나간다.
--This line, and those below, will be
ignored--
A
svn://localhost/project/trunk
빠져나오면 아래와 같은 메시지가 나오는데 c 를 입력하면 디렉토리가 생성된다.
$ svn mkdir svn://localhost/project/trunk
로그 메시지가 변경되지 않았거나 지정되지 않았습니다
취소(A), 계속(C), 수정(E):
c
인증 영역(realm): <svn://localhost:3690> repositryname
'svn'의 암호:
인증 영역(realm): <svn://localhost:3690> repositryname
사용자명:svnuser01
'svnuser01'의 암호:
------------------------------------------------------------
주의! 인증정보 영역:
<svn://localhost:3690> repositryname
에 대한 당신의 비밀번호는 디스크에 암호화되어 저장되지 않습니다.
가능하면, 비밀번호를 암호화하여 저장하도록 설정을 바꾸십시오.
자세한 것은 문서를 참조하세요.
이 주의 문구를 다음에 보이지 않게 하려면, 'store-plaintext-passwords'의
설정을 'yes' 혹은 'no'로 지정하면 됩니다. 설정 파일은 다음과 같습니다.
'/home/svn/.subversion/servers'
------------------------------------------------------------
비밀번호를 평문으로 저장하겠습니까 (yes/no)?no
커밋된 리비전 1.
다음은 sasl로 사용자를 등록한 경우이다.
sasl 사용자 인증은 root로 접속 해야만 다음 작업이 가능하다(?)
Log message unchanged or not specified
a)bort, c)ontinue, e)dit
c
인증 영역(realm): <svn://localhost:3690> repositryname
'root'의 암호:
인증 영역(realm): <svn://localhost:3690> repositryname
사용자명: 아이디(sasl에서 등록한 아이디)
'아이디'의 암호:
------------------------------------------------------------
주의! 인증정보 영역:
<svn://localhost:3690> repositryname
에 대한 당신의 비밀번호는 디스크에 암호화되어 저장되지 않습니다.
가능하면, 비밀번호를 암호화하여 저장하도록 설정을 바꾸십시오.
자세한 것은 문서를 참조하세요.
이 주의 문구를 다음에 보이지 않게 하려면, 'store-plaintext-passwords'의
설정을 'yes' 혹은 'no'로 지정하면 됩니다. 설정 파일은 다음과 같습니다.
'/root/.subversion/servers'
------------------------------------------------------------
비밀번호를 평문으로 저장하겠습니까 (yes/no)?no
커밋된 리비전 1.
/root 디렉토리 밑에 .subversion 디렉토리가 생성된다.
이 주의 문구를 다음에 보이지 않게 하려면, /root/.subversion/servers에서
store-plaintext-passwords'의 설정을 'no'로
지정한다.
동일한 방법으로 branches와 tags를 생성한다.
$ svn list svn://localhost/project
trunk/
branches/
tags/
http로
접속하기
Apache가 저장소에 접근할 수 있도록 소유자와 권한을 바꿉니다. Apache는 기본적으로 설치하면 nobody(또는 apache)로 실행됩니다. http 버전 확인 # httpd -v
Apache 설정파일 /usr/local/apach2/conf/httpd.conf
에서 확인
User nobody(또는 apache)
Group nobody(또는 apache)
# cd /home/svn
/home/svn# chown -R nobody.nobody sample
/usr/local/apach2/conf/httpd.conf에서 dav, dav_svn 모듈이
설정되어 있는지 확인 합니다. 주석처리 되어 있으면 주석을 없애고 없다면 아래 모듈들을 추가합니다. 보통 dav_module은 기본으로 설정 되어 있습니다.
LoadModule dav_module modules/mod_dav.so
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
httpd.conf 파일 맨 뒷부분에 아래와 같이 추가 합니다. 설정을 저장한 뒤에 Apache를 재시작 합니다.
<Location /svn/sample>
DAV svn
SVNPath /home/svn/sample
</Location>
이렇게 설정을 하고 웹 브라우저에서 http://(Subversion과 Apache를 설치한 IP주소
또는 도메인)/svn/sample 로 접속을 합니다.
웹 브라우저에 아래와 같은 화면이 보이면 Subversion 저장소와 아파치가 잘 동작하고 있는 것입니다. 아래와
같이 나오지 않는다면 아파치 설정과 저장소의 소유자와 그룹을 다시 한 번 살펴보시기 바랍니다.
Revision 0: /
--------------------------------------------------------------------------------
Powered by Subversion version 1.0.0.
위와 같이 설정하면 누구든지(Anonymous)
웹 브라우저로 저장소를 볼 수 있고 Subversion 클라이언트를 이용해서 소스를 체크아웃, 익스포트, 커밋을 할 수 있습니다.
이렇게 실행 시켰으면
"# svn checkout http://(Subversion서버 IP또는 도메인)/svn/sample
sample"을
입력합니다. "Checked out revision 0."이 나오면 제대로 설정이
된 것입니다. 아무나(Anonymous) 저장소에 접근해서
체크아웃, 커밋 등을 할 수 있습니다.
* format 파일에 대한 permission denied 가
발생할 경우 /home/svn 디렉토리에 대한 퍼미션을 수정한다.
# chmod -R 755 /home/svn
Apache에서 ID로 사용자
인증
이제 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" 로 해주면 됩니다.
방금 수정했던
/usr/local/apache2/conf/httpd.conf 파일의 맨 마지막 부분에 추가한 부분을 다시 설정 합니다.
<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는 인증된 사용자만 볼 수 있게 한다는 것입니다.
이제 웹 브라우저로 다시
sample저장소로 접속해 보면 ID와 패스워드를 묻는 창이 나올 것입니다. 만든 ID와 패스워드를 입력하면 저장소를 볼 수 있습니다. 이렇게 되면 체크아웃, 커밋등을 할 때 ID와 암호를 물어보게 됩니다.
웹 브라우저로 저장소를 보는 것과 체크아웃은 아무에게나(Anonymous) 할 수 있게 하고 커밋은 지정된 사용자만 할 수 있도록 하려면 httpd.conf에서 설정한 부분을 아래와 같이 바꾸어 주면 됩니다.
<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와 패스워드를 물어보게 됩니다.
"# svn checkout http://(Subversion서버 IP또는 도메인)/svn/sample sample" 을 입력하면 ID와
패스워드를 물어옵니다. ID와 패스워드를 입력하고 나서
"Checked out revision 0." 이 출력되면 제대로 설정 된 것입니다.
https로
접속하기
위에 http 설정과 대부분 동일하다.
https 서비스가 가능하도록 openssl로 서버인증서를 생성한다
# cd /usr/local/apache2/conf
# openssl req -new -x509 -days 3650 -sha1 -newkey rsa:1024 -nodes -keyout server.key -out server.crt -subj '/O=company/OU=dev/CN=www.company.com'
openssl에 대한 자세한 사항은 여기 참조 -> http://linuxism.tistory.com/470
/usr/local/apache2/conf/httpd.conf에서 다음 설정 추가
include conf/extra/httpd-subversion.conf
아래 내용처럼 /usr/local/apache2/conf/extra/httpd-subversion.conf
파일생성
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
<Location /svn/sample>
DAV svn
SVNPath /home/svn/sample
AuthType Basic
AuthName "pyrasis's Repository"
AuthUserFile /usr/local/apache2/conf/passwd
AuthzSVNAccessFile /usr/local/apache2/conf/svnauth
Require valid-user
</Location>
AuthzSVNAccessFile /usr/local/apache2/conf/svnauth
으로
특정 Repository나 그 하위경로에 access
control을 할 수 있다.
*
svnauth 설정.
[groups]
Team
= kimbokki
[/]
* = r
[/New_Intranet]
@Team
= r
/ <-- 상위경로에서 접근 제한을 두면 하위는 그대로 적용된다.
그러므로 상단의 설정은 / 이하로 접근 제어를 전부 풀어버리게 된다.
아이디를 통해 특정 아이디만 접근을 제어할 수 있고.
아니면 상단처럼 그룹을 지정해서 그룹단위로 접근을 제어할 수 있다.
[groups]
Team
= kimbokki, ssjeon
[/]
* =
kimbokki
[/New_Intranet]
@Team
= r
이렇게 설정을 하게 되면, kimbokki는 / 이하의
모든 Repository에 대한 read권한을 가지게 된다.
ssjeon은 / 는 접근을 하지 못하고 /New_Intranet 이하의 Repository에 대한 read권한을 가지 된다.
[groups]
Team
= kimbokki, ssjeon
[sample:/]
@Team
= rw
* =
Team 맴버는 sample 디렉토리에 대해 읽고 쓰기가 가능하며,
이외 모든 사용자는 접근 불가한다.
* [/trunk/]와 [/trunk]는 다르다 [/trunk]로 해야 접근 가능하다.
* Trac을 사용할 때는 BrowseSource에서 SVN에
접근을 하게 되는데,
trac.ini파일의 auth-file 에 svnauth의 path를 넣어주면 같이 적용을 할 수 있다.
출처:Apache를 통해 Subversion(SVN) 접근 제어.
Import
맨 처음 프로젝트를 시작할 때 저장소에 소스들을 넣어야 합니다. 이럴 때 하는 것이 import 작업입니다. sampledir 이라는 디렉토리를 만든 뒤에 그 아래 다음과 같은 간단한 소스를 작성해 보십시오.
import 작업은 디렉토리에 대한
퍼미션을 고려해야 한다. 따라서 svn 사용자로 소유자가
root인 디렉토리에 대해서는 import 작업이 허용 되지 않는다.
# 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
클라이언트 프로그램으로 접속 테스트
이클립스용 :
subclipse
윈도우용 :
tortoiseSVN
최초 체크아웃을 한다.
$ svn checkout svn://서버 IP/project MyProject
기타
서버 포트 : svn
- TCP 3690, http - TCP 80, https - TCP 443
방화벽으로 막혀 있는지 확인
$ nmap localhost -p1-9999
출처 - http://skystory.kr/655, http://donghunl.tistory.com/43
http://croute.me/483, http://freecatz.tistory.com/161, http://blog.naver.com/barami12?Redirect=Log&logNo=130028865919,
http://www.pyrasis.com/main/Subversion-HOWTO