본문 바로가기

기타

[서버운영] Subversion 간략한 사용방법

http://www.pyrasis.com/main/Subversion-HOWTO
http://nonots.bada.cc
#######################################################################
1. 개요

 소박하게(?) 웹프로그램질만 가끔 하다보니 이런건 사용안할 줄 알았는데
사람 인생 앞으로 뭔짓을 하게 될 지 알수 없는 묘함이라..
보통 팀단위 프로젝트에서 사용하는 소스 버전관리 프로그램 중에서
Subversion 이라는 걸 ..  아주..
아주 간단한 수준에서.. 사용하는 방법을 ..  내 식(!) 대로 정리해 봤다..
..
사실 실무에서 사용하고 있지는 않고.. 앞으로도 본격적으로 쓸거 같지도 않고..
단지 내가 그동안 모아둔 소스들을 이용해서 어떤 작업 요청 받을 때 ..
온라인상에서 .. 그 소스를 어디서든 간단하게 다운받아 써먹으려는  게으름이 .. 
가장 큰..  이번 삽질의 동기일 따름이다..
겸사겸사.. 이런 것도 할 줄 아는 것처럼 보이면 뭔가 좀 뽀대 나잖아..
..
고로.. 대단한 건 없다..

참고 : http://www.pyrasis.com/main/Subversion-HOWTO



#######################################################################
2. 전제 조건
    http://subversion.tigris.org/ 에서 Subversion 을 다운받을 수 있는데..
    내 경우 그냥 리눅스 서버 CentOS 5.3 버전에서
    yum install subversion 이라는 명령어로 1.4.x 버전을 rpm 으로  설치했다.
    최신 버전은 아마 1.6.x 일꺼다.. 상관없다.

    - 서버 소스  저장소 : home5.naver.com  ( 리눅스 centos 5.3 )  : 실제 소스가 저장되는곳
    - 클라이언트 : home7.naver.com  ( 리눅스 centos 5.3 )  : 아무데나

    실제 네이버에 이런 서버가 있을까.. 없을까..



#######################################################################
3. 서버 (저장소) home5.naver.com  에서 할일

저장소를 만드는 방법은 위 참고 사이트에 보면 3 가지 정도 있다..
오리지날 svn 데몬 이용하는방법
아파치 웹서버 이용하는방법..
ssh 연동 방법..
이중에서 그냥 오리지날 방법대로 svn://  사용하는 방법을 택했다.
다른거 하고 싶은 사람은 다른 방법 찾아서 하면 된다.
..

일단 서버 방화벽이 있다면 svn 데몬에서 사용하는 3690 포트를
열어줘야 한다.

일단 /home/svn 을 홈으로 삼아서 .. svnadmin 명령어로  badalib 라는
프로젝트를 하나 생성한다. 그럼 /home/svn/badalib 라고 된다.
--fs-type bdb 라고 하면 버클리DB 를 사용하고, fsfs 하면
그냥 파일시스템 사용한단다. 상관 없을듯.


[root@home5 svn]# pwd
/home/svn
[root@home5 svn]# svnadmin create --fs-type fsfs badalib

[root@home5 svn]# ls
badalib

[root@home5 svn]# cd badalib/
[root@home5 badalib]# ls
README.txt  conf  dav  db  format  hooks  locks
[root@home5 badalib]#



설정파일에서  접근 권한을 준다.
익명으로(anon-access) 로 접근못하게 하려면 none 을, 읽기만 하려면 read

[root@home5 badalib]# vi conf/svnserve.conf

[general]
#anon-access = read
anon-access = none
auth-access = write
password-db = passwd


비밀번호 파일에서 접속할 사용자( nonots )를 등록하는데..
그냥 비밀번호(kwk2309 )가 암호화가 안되고 그냥 저장된다.
암호화 하는 방법이 어디 있을텐데 거기 까지 못찾아봤다.

[root@home5 badalib]# vi conf/passwd

[users]

nonots = kwk2309



서버에서 3690 포트 열어주고 아래 명령어로 svn 데몬을 띄운다.

[root@home5 badalib]# svnserve -d -r /home/svn/




#######################################################################
4. home7.naver.com 외부에서 사용방법


 일단 사용할 에디터를  환경변수에 저장한다. 만만한 vi 에디터를 지정했다.

[nonots@home7 ~]$ vi ~/.bashrc

SVN_EDITOR=/usr/bin/vim
export SVN_EDITOR

[nonots@home7 ~]$ . .bashrc


최초 접속시 인증을 한다.  서버(home5)에서 svn 사용자 nonots 와  home7 서버 계정
아이디가 동일하므로 바로 암호를 물어온다. 만약 아이디가 틀려도
상관없다. 그냥 엔터치면 아이디를 직접 다시 물어오니까..
한번 인증을 하고 나면 계속 세션이 살아 있게 된다.


[nonots@home7 ~]$ svn list svn://home5.naver.com/badalib
인증 영역(realm): <svn://home5.naver.com:3690> e6eb33e2-3619-4d04-9e1f-8e77fab58089
'nonots'의 암호:


하위 디렉토리 phplib 를 생성해 보자..
위에서 지정한 VI 에디터가 뜨는데.. 그냥 :q 로 종료하고 c 를 눌러주면 된다.

[nonots@home7 ~]$ svn mkdir svn://home5.naver.com/badalib/phplib

로그 메시지가 변경되지 않았거나 지정되지 않았습니다
취소(A), 계속(C), 수정(E)
c

커밋된 리비전 1.
[nonots@home7 ~]$



이제 소스를 만들어서 저장소에 집어 넣어보자.. 디렉토리 구조와 위치에
조심해야한다.
위에서 생성한 하위디렉토리와 동일하게 phplib 를 생성해서 소스를 만든후
그 디렉토리 이름 자체를 이용해서 import 시키면 그 하위의 파일이
서버에 등록된다.

## IMPORT : mylib.php 라는 새 소스를 저장소에 집어 넣는다. 

[nonots@home7 ~]$ mkdir phplib
[nonots@home7 ~]$ vi phplib/mylib.php (새 파일 생성)
[nonots@home7 ~]$ svn import phplib svn://home5.naver.com/badalib/phplib

로그 메시지가 변경되지 않았거나 지정되지 않았습니다
취소(A), 계속(C), 수정(E)
c
추가          phplib/mylib.php

커밋된 리비전 2.

[nonots@home7 ~]$ svn list svn://home5.naver.com/badalib/phplib
mylib.php



## CHECKOUT : 이제 아무곳에서나 소스를 가져올수 있다.
checkout 줄여서 co 라는 명령어를 가장 많이 사용할것이다.
자동으로 phplib 디렉토리가 생성되면서 파일들을 불러와서 저장한다.

[nonots@home7 ~]$ rm -rf phplib/
[nonots@home7 ~]$ svn checkout svn://home5.naver.com/badalib/phplib
A    phplib/mylib.php
체크아웃된 리비전 2.

이렇게 checkout 하면 phplib 라는 디렉토리가 자동으로 생성된다.
이때 .svn 이라는 히든 디렉토리가 같이 생성되는데 안건드리는게 좋다.

[nonots@home7 ~]$ cd phplib
[nonots@home7 phplib]$ ls
mylib.php
[nonots@home7 phplib]$ ls -a
.  ..  .svn  mylib.php
[nonots@home7 phplib]$


## 저장소의 최신버전으로 업데이트 한다
만약 저장소 버전보다 낮다면 자장소에서 다운받아 덮어쓴다.

[nonots@home7 phplib]$ svn update
리비전 2.


## COMMIT : 에디터로 소스를  수정후 수정된 내용을 저장소로 보낸다

[nonots@home7 phplib]$ vi mylib.php
[nonots@home7 phplib]$ svn commit;

로그 메시지가 변경되지 않았거나 지정되지 않았습니다
취소(A), 계속(C), 수정(E)
c
전송중        mylib.php
파일 데이터 전송중.
커밋된 리비전 3.
[nonots@home7 phplib]$



## LOG : 그 파일이 수정된 로그 기록을 본다 ( -v ,  -a 옵션 )

[nonots@home7 phplib]$ svn log mylib.php
------------------------------------------------------------------------
r3 | nonots | 2009-08-28 15:32:37 +0900 (금, 28  8월 2009) | 1 line

------------------------------------------------------------------------
r2 | nonots | 2009-08-28 15:25:02 +0900 (금, 28  8월 2009) | 1 line

------------------------------------------------------------------------

[nonots@home7 phplib]$ svn log -r 2 -v
------------------------------------------------------------------------
r2 | nonots | 2009-08-28 15:25:02 +0900 (금, 28  8월 2009) | 1 line
변경된 경로:
  A /phplib/mylib.php

------------------------------------------------------------------------


## DIFF : 그파일 수정된 버전별로 차이점  을 본다

[nonots@home7 phplib]$ svn diff -r 1:2
[nonots@home7 phplib]$ svn diff -r 2 mylib.php
Index: mylib.php
===================================================================
--- mylib.php    (revision 2)
+++ mylib.php    (working copy)
@@ -2,6 +2,9 @@
 
 class badaClass{
     var $name;
+    function myAll(){
+        return true;
+    }
 }
 
 ?>


## 어느 라인을 어느 사용자가 수정했는지 본다. 지금은 nonots 한사람밖에 없다.
[nonots@home7 phplib]$ svn blame mylib.php
    2    nonots <?php
    2    nonots
    2    nonots class badaClass{
    2    nonots     var $name;
    3    nonots     function myAll(){
    3    nonots         return true;
    3    nonots     }
    2    nonots }
    2    nonots
    2    nonots ?>
[nonots@home7 phplib]$


## LOCK : 수정중인 파일을 다른 사람이 서버로 import 해서 덮어쓰기 방지하기
위해서  파일을 잠금다.

[nonots@home7 phplib]$ svn lock mylib.php
'mylib.php' 는 'nonots' 이/가 잠궜습니다.
[nonots@home7 phplib]$ svn unlock mylib.php
'mylib.php' 는 잠금이 해제 되었습니다.
[nonots@home7 phplib]$



## 복사, 이름 바꾸기 , 반드시 업데이트 커밋을 해야 적용되더라..

[nonots@home7 phplib]$ svn copy mylib.php mylib2.php
A        mylib2.php
[nonots@home7 phplib]$ svn commit;

로그 메시지가 변경되지 않았거나 지정되지 않았습니다
취소(A), 계속(C), 수정(E)
c
추가          mylib2.php

커밋된 리비전 4.
[nonots@home7 phplib]$ svn list
mylib.php
[nonots@home7 phplib]$ svn update
리비전 4.
[nonots@home7 phplib]$ svn list
mylib.php
mylib2.php
[nonots@home7 phplib]$ svn rename mylib2.php mylib_old.php
A        mylib_old.php
D        mylib2.php
[nonots@home7 phplib]$ svn update
리비전 4.
[nonots@home7 phplib]$ svn list
mylib.php
mylib2.php
[nonots@home7 phplib]$ svn commit

로그 메시지가 변경되지 않았거나 지정되지 않았습니다
취소(A), 계속(C), 수정(E)
c
삭제          mylib2.php
추가          mylib_old.php

커밋된 리비전 5.
[nonots@home7 phplib]$ svn update
리비전 5.
s[nonots@home7 phplib]$ svn list
mylib.php
mylib_old.php
[nonots@home7 phplib]$



## mylib3.php 라는 파일을 새 파일 추가

[nonots@home7 phplib]$ vi mylib3.php
[nonots@home7 phplib]$ svn add mylib3.php
A        mylib3.php
[nonots@home7 phplib]$ svn commit;

로그 메시지가 변경되지 않았거나 지정되지 않았습니다
취소(A), 계속(C), 수정(E)
c
추가          mylib3.php
파일 데이터 전송중.
커밋된 리비전 6.
[nonots@home7 phplib]$ svn update
리비전 6.
[nonots@home7 phplib]$ svn list
mylib.php
mylib3.php
mylib_old.php
[nonots@home7 phplib]$



## 중요 : EXPORT : 개발 끝나고 자주 쓸듯
디렉토리와 소스 전체를 다운받아서 저장한다.
저장소의 phplib 를  /tmp/phplib_download 라는 곳에 다운받으려면..

[nonots@home7 ~]$ cd /tmp
[nonots@home7 tmp]$ pwd
/tmp
[nonots@home7 tmp]$ svn export svn://home5.naver.com/badalib/phplib phplib_download
A    phplib_download
A    phplib_download/mylib_old.php
A    phplib_download/mylib.php
A    phplib_download/mylib3.php
익스포트된 리비전 6.
[nonots@home7 tmp]$ cd phplib_download/
[nonots@home7 phplib_download]$ ls
mylib.php  mylib3.php  mylib_old.php
[nonots@home7 phplib_download]$



## DUMP : 백업 복원 : 이건 다시 5 호 home5.naver.com 저장소 서버에서 작업해야한다.

[root@home5 svn]# pwd
/home/svn
[root@home5 svn]# svnadmin dump badalib > badalib.dump
* 덤프된 리비전 0.
* 덤프된 리비전 1.
* 덤프된 리비전 2.
* 덤프된 리비전 3.
* 덤프된 리비전 4.
* 덤프된 리비전 5.
* 덤프된 리비전 6.
[root@home5 svn]# ls -al
합계 24
drwxr-xr-x  4 root root 4096  8월 28 15:49 .
drwxr-xr-x 82 root root 4096  8월 28 14:14 ..
drwxr-xr-x  7 root root 4096  8월 28 15:10 badalib
-rw-r--r--  1 root root 2271  8월 28 15:49 badalib.dump
[root@home5 svn]#


## LOAD : 복원 :  위에서 dump 받은 파일을 이용해서 복원할때
svnadmin create badalib
svnadmin load badalib < badalib.dump



## SYNC : 저장소 복제
지금까지 저장소 home5 에 있는 소스를 외부에서 접속해서 작업했는데..
home5 에 있는 프로젝트 전체를 동일하게 복제해서  다른 서버(home7) 에
새로 저장소를 만들때 사용한다.
새 서장소는 /home/nonots/svn 이라는 곳에 sync_badalib 라는 프로젝트로
만들다고 할때

[nonots@home7 ~]$ mkdir svn
[nonots@home7 ~]$ cd svn
[nonots@home7 svn]$ pwd
/home/nonots/svn
[nonots@home7 svn]$ svnadmin create sync_badalib

hooks/pre-revprop-change 이 파일에 "#!/bin/sh" 라는 달랑 한줄 적어주고 실행권한을
부여한다.

[nonots@home7 svn]$ vi sync_badalib/hooks/pre-revprop-change
#!/bin/sh
[nonots@home7 svn]$ chmod 777 sync_badalib/hooks/pre-revprop-change

[nonots@home7 svn]$ ls
sync_badalib


여기서 조심할건 file:// 가 아니라 슬래시가 하나더 있는 file:/// 이다.


[nonots@home7 svn]$ svnsync init file:///home/nonots/svn/sync_badalib svn://home5.naver.com/badalib
리비전 0의 복사된 속성
[nonots@home7 svn]$ svnsync sync file:///home/nonots/svn/sync_badalib
커밋된 리비전 1.
리비전 1의 복사된 속성
커밋된 리비전 2.
리비전 2의 복사된 속성
커밋된 리비전 3.
리비전 3의 복사된 속성
커밋된 리비전 4.
리비전 4의 복사된 속성
커밋된 리비전 5.
리비전 5의 복사된 속성
커밋된 리비전 6.
리비전 6의 복사된 속성

[nonots@home7 svn]$ ls sync_badalib/db
current  format  fs-type  revprops  revs  transactions  uuid  write-lock
[nonots@home7 svn]$

새 저장소가 복제 되었다.