DEV SUPPORT:SVN

구차니의 잡동사니 위키
이동: 둘러보기, 찾기

Subversion/SVN은 CVS의 단점을 개선하기 위해 만들어진 소스관리 프로그램이다.

목차

설치

Linux/Ubuntu를 기준으로 설명

필요 패키지

  • subversion
  • apache2 libapache2-svn libapache2-mod-auth-pam libapache2-mod-auth-sys-group
$ sudo apt-get install subversion apache2 libapache2-svn libapache2-mod-auth-pam libapache2-mod-auth-sys-group

포트

$ vi /etc/services
svn             3690/tcp        subversion      # Subversion protocol
svn             3690/udp        subversion
  • svn:// 으로만 사용시에는 3690 번 포트
  • svn+ssh:// 는 ssh의 포트(기본 22번)
  • http:// 는 웹서버 포트(기본 80번)

를 열어 주어야 한다.

리눅스 계정연동

아파치를 통해 SVN을 접근시 리눅스 계정과 연동할 수 있다.

$ sudo a2enmod auth_pam
$ sudo a2enmod auth_sys_group 
$ sudo adduser www-data shadow
$ sudo vi /etc/apache2/httpd.conf
<Location /svn/repos1>
       DAV svn
       SVNPath /home/svn/repos1

       AuthPAM_Enabled on
       AuthType Basic
       AuthName "Subversion Repository"
       AuthUserFile /etc/shadow
       Require group www-data
       Require valid-user
</Location>

SVN 독립 계정 파일 사용

$ sudo vi /etc/apache2/httpd.conf
<Location /svn/repos1>
    DAV svn
    SVNPath /home/svn/repos1

    AuthType Basic
    AuthName "Subversion Repository"
    AuthUserFile /home/svn/svn.passwd
    Require valid-user
</Location>

사용

기본 사용법

최초 사용시에는

폴더 생성 - 소스/프로젝트 추가 - 저장소에 추가(import) - 저장소를 복제(checkout)

checkout 이후에는

서버와 동기화(update) - 병합(merge) - 소스 변경 - 테스트 - 동기화 - 업로드(commit)

으로 진행된다.

저장소 관리

일반적으로 사용되는 구조는 trunk / tags / branch로

  • trunk - 작업중인 코드
  • tags - 릴리즈 코드
  • branch - 테스트 코드

로 구성하여 주로 사용한다.

기능

copy

repository 내에서 소스를 복사함.

branch

copy의 특수한 예로 branch 하위로 복사함.

switch

동일 svn 저장소 내의 다른 경로로 바꾸는데 사용

--relocate 옵션을 통해 다른 서버로 경로 바꾸는데 사용

checkout

버전관리 되는 소스를 로컬 저장소로 내려받음.

commit

로컬 워킹카피에서 변경된 내역을 repository로 업로드 함.

update

(다른 사람이 수정했을지도 모르는) 서버의 내용과 개인의 소스를 동기화 함.

add

버전관리 하도록 추가함. 물론 commit을 통해 서버에 반영을 해야 추가됨.

delete

버전관리를 하지 않도록 삭제함. 물론 commit을 통해 서버에 반영을 해야 사라지며 revert를 통해 되살릴수 있다.

단, revert시 수정된 소스코드가 삭제된것은 복구되지 않으며, commit을 통해 반영되어도 구 리비전을 통해 복원이 가능하다.

blame

소스코드의 라인별 리비전 출력 기능. 어느 버전에서 부터 추가되고 수정되었는지 리비전 추적에 유용하나, 예상만큼 정확하진 않음

merge

특정 리비전과 자동 병합. 단, working copy에서만 자동 병합될 뿐 병합후 commit을 수동으로 수행해야 함

import

버전관리 되지 않는 소스를 버전관리 서버에 넣음. import 는 서버에 적용 되는 것으로 checkout을 통해 받아서 작업해야 함

import시 svn:ignore에 설정이 되어 있지 않더라도 *.a 등의 파일은 자동으로 생략되는 문제가 있으므로 --no-ignore 옵션으로 무시되지 않도록 해야 한다.

export

버전관리 기능을 사용하지 않는 working copy를 만들어 냄

status

변화된 내용 확인 - check for modification(tortoiseSVN)

용어정리

  • working copy - 저장소가 아닌 개인 저장 공간에 복제된 작업내용 물(소스코드 등)
  • conflict - 본인이 가진 내용과 타인이 수정하여 올린 서버의 내용이 달라 자동 병합할수 없어 사용자의 개입이 필요한 상황. 수동으로 병합후 서버에 올리면 해결 됨.

명령어

콘솔상에서 svn client를 통해 사용하는 명령어

사용법: svn <subcommand> [options] [args]
Subversion 명령행 클라이언트 버전 1.6.17.
'svn help <subcommand>'를 사용하여 특정 명령에 대하여 도움말을 얻으십시오.
'svn --version'를 사용하여 버전과 원격접속 모듈에 대한 정보를 얻으십시오.
 또는 'svn --version --quiet'를 사용하여 버전 정보만 얻으십시오.

대부분의 부속 명령어들은 재귀적으로 수행하면서 파일이나 디렉토리를 인자로 취합니다.
명령들에 인자가 주어지지 않으면 현재 디렉토리를 포함하여 재귀적으로 수행하게 됩니다.

가능한 명령:
   add
   blame (praise, annotate, ann)
   cat
   changelist (cl)
   checkout (co)
   cleanup
   commit (ci)
   copy (cp)
   delete (del, remove, rm)
   diff (di)
   export
   help (?, h)
   import
   info
   list (ls)
   lock
   log
   merge
   mergeinfo
   mkdir
   move (mv, rename, ren)
   propdel (pdel, pd)
   propedit (pedit, pe)
   propget (pget, pg)
   proplist (plist, pl)
   propset (pset, ps)
   resolve
   resolved
   revert
   status (stat, st)
   switch (sw)
   unlock
   update (up)

Subversion은 형상관리를 위한 도구입니다.
더 상세한 정보를 위해서는 http://subversion.tigris.org/ 를 방문하세요.

운용

source tree

일반적으로

trunk
tag
branch

세개의 디렉토리로 운영한다.


trunk는 메인 트리

branch는 임시 버전 테스트용 트리

tag는 릴리즈한 버전에 대한 복사본으로 주로 사용한다.


tag는 trunk를 복제함으로서 해당 revision을 저장하는 식으로 구현된다.

trunk -> branch copy -> branch 테스트 -> trunk 병합 -> 릴리즈 -> tag copy 식으로 진행된다.


그리고 변경점 추적에 용이하도록 주석은 되도록이면 달아주는 것이 좋다.

repository merge

svnadmin 유틸리티를 이용하여 svn 저장소를 dump 하여 합친다.

hook script

hool script는 상황별로 존재하며, 아래의 예제 파일의 이름을 *.tmpl에서 *.pl로 변경하면 된다.

post-commit.tmpl
post-lock.tmpl
post-revprop-change.tmpl
post-unlock.tmpl
pre-commit.tmpl
pre-lock.tmpl
pre-revprop-change.tmpl
pre-unlock.tmpl
start-commit.tmpl
commit hook 메일 알림

python만 존재해도 수행 가능하도록 작성한 스크립트

$ cat hooks/post-commit.pl
export LC_ALL=en_US.utf8
export LANG=en_US.utf8

REPOS="$1"
REV="$2"
TXN_NAME="$3"

"$REPOS"/hooks/mailer.py commit "$REPOS" $REV "$REPOS"/mailer.conf
$ cat hooks/mailer.py
#!/usr/bin/python
# -*- coding:utf-8 -*-

import smtplib
import sys
import os
from email.mime.multipart import MIMEMultipart
from email.MIMEText import MIMEText
from subprocess import Popen, PIPE

smtp_hostname="smtp.mailserver.com:port"
smtp_username="mailer@mailserver.com"
smtp_password="password"
toaddrs  = ['user1@mailserver.com','user2@mailserver.com','user2@mailserver.com']
project_name = os.path.basename(sys.argv[1])
subject = "["+project_name+"]"+" svn repository update required"
content = project_name + "\n" + "rev : " + sys.argv[2]+ "\n"

cmd_1 = ['svnlook','changed','-r',sys.argv[2],sys.argv[1]]
proc = Popen(cmd_1, stdout=PIPE)
difflist = proc.stdout.read()

cmd_2 = ['svnlook','info','-r',sys.argv[2],sys.argv[1]]
proc = Popen(cmd_2, stdout=PIPE)
svninfo = proc.stdout.read()

content = "[" + project_name + "]\n" + "rev : " + sys.argv[2]+ "\n" + difflist +"\n" + svninfo

msg = MIMEMultipart()
msg['From'] = smtp_username
msg['To'] = ", ".join(toaddrs)
msg['Subject'] = subject
msg.attach(MIMEText(content,_charset='utf-8'))

print msg.as_string()

server = smtplib.SMTP_SSL(smtp_hostname)
server.login(smtp_username,smtp_password)
server.sendmail(smtp_username, toaddrs, msg.as_string())
server.quit()

리눅스/bash 팁

status에 대한 컬러를 입혀주는 스크립트 ~/.bashrc 에 추가하면 된다.

단, 아래의 경우 커밋시 tty를 잃어 vi나 nano를 통해 편집이 정상적으로 되지 않는 문제가 있으니 추천하지 않음

function svn {
  command svn "$@" | awk '
  BEGIN {
    cpt_c=0;
  }
  {
    if        ($1=="C") {
      cpt_c=cpt_c+1;
      print "\033[31m" $0 "\033[00m";  # Conflicts are displayed in red
    }
    else if   ($1=="A") {
      print "\033[32m" $0 "\033[00m";  # Add in green
    }
    else if   ($1=="?") {
      print "\033[36m" $0 "\033[00m";  # New in cyan
    }
    else if   ($1=="D") {
      print "\033[35m" $0 "\033[00m";  # Delete in magenta
    }
    else                {
      print $0;                        # No color, just print the line
    }
  }
  END {
    print cpt_c, " conflicts are found.";
  }';
}

svn을 통해 commit 시 정상작동하지 않으면 editor를 설정해주어야 한다.

export SVN_EDITOR=/usr/bin/vim

svn diff 팁

ubuntu 사용시 아래의 패키지 설치 및 설정을 통해 svn diff를 syntax highlight 적용하여 볼 수 있다.

$ sudo apt-get install colordiff
$ vi ~/.subversion/config
[helpers]
diff-cmd = colordiff

에러메시지

  • web DAV 미설치시
$ sudo service apache2 restart
Syntax error on line 2 of /etc/apache2/httpd.conf:
Invalid command 'DAV', perhaps misspelled or defined by a module not included in the server configuration
Action 'configtest' failed.
The Apache error log may have more information.
   ...fail! 
  • 해결책
$ sudo apt-get install libapache2-svn

GUI 클라이언트

윈도우 클라이언트

리눅스 클라이언트


TortoiseSVN

윈도우에서 svn+ssh:// 를 통해 접속을 하려고 하면 svn 서버에 사용자의 public key를 등록하고 svn 클라이언트(윈도우) 에는 pagent에 private key를 등록하며 putty에서 암호 없이 로그인 할 수 있도록 설정해야 사용이 가능하다.

개인 도구
이름공간

변수
행위
둘러보기
도구모음