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 

 




Posted by linuxism
,