CVS 후속 버전으로 나온 것이 SVN이다. 이것은 바이너리등의 파일 적용이 추가되어 기능이 다양해 졌다. 아직도 CVS을 많이 사용하지만 점점 SVN도 늘어나고 있다.
그러나 버전 간의 데이터가 SVN의 통합 파일로 이루어저 있고, 버전 계층(버전과 다음버전간) 간에 연관성이 확고하다.
즉, 이전버전 파일이 없으면 다음버전의 파일에 영향을 미쳐 나누어 파일을 저장한다든지 하는 문제가 발생 한다. 이전 파일이 있어야 다음버전이 복구된다는 이야기 이다. 개인적으로 이것은 불편한 요소이다. 중간에 파일이 문제가 생길 수도 있을 것 같고. backup과 연관되어 이전버전의 파일도 고려하여 다루어야 한다. 그리고 텍스트 파일 형태가 아니므로 이것도 약간은 불편하다. 어째든 이것이 버전관리에서 대세이므로 이것을 사용하는 것이 좋을 것 같다.
기본개념
○ svn이란? : 소스 코드 버전 관리 도구: 동시 개발, 소스 충돌 회피
○ repository : 저장소. 소스 코드가 버전별로 모두 저장.
○ working copy: 저장소에서 내려받은 소스 코드 작업 복사본. 로컬 작업 공간(working space)
○ revision: 갱신 번호. 매번 수정이 발생할 때마다 증가.
○ branch: 가지 뻗어나가기, 여러 버전의 동시 진행 및 통합(merge)
○ trunk: 개발 가지들 가운데 가장 중심이 되는 줄기.
○ tags: 개발 버전의 스냅샷.
○ Import: 최초로 레파지토리에 자료를 올림. (레파지토리 중심 관점)
○ Export: 레파지토리에서 자료를 내려 받음. 버전 관리 정보 제외. (레파지토리 중심 관점)
○ Checkout: 레파지토리에서 자료를 내려 받음. 버전 관리 정보 포함.
○ Commit: 작업 영역에서의 변경내역을 레파지토리에 실제 반영하는 명령어.
주요 명령어
○ help : 상세 사용법 출력. svn help subcommand
○ add : 새로 생성한 파일이나 디렉토리를 저장소에
○ mkdir : 디렉토리 새로 생성
○ delete (del, remove, rm) : 파일이나 디렉토리를
○ move (mv, rename, ren) : 파일이나 디렉토리를
○ copy (cp) : 파일이나 디렉토리 복사
○ update (up) : 작업 영역을 저장소 정보에 맞춰서
○ commit (ci) : 작업 영역의 변경 내역을 저장소에
○ status (st) : 상태 보기
○ log : 로그 기록 확인
○ diff : 차이점 확인
○ dump : 저장소 내용을 덤프해서 파일에 저장
○ load : 덤프 파일 내용을 저장소에 쏟아넣음
저장소 설정: [관리자 설정사항]
○ 통상적으로 /var/svn 또는 /var/repos 위치에 저장소 디렉토리를 설정, 그 아래에서 저장소 생성
○ 아파치 DAV를 사용하여 svn에 접속할 경우에는 chown -R apache repo_name 또는 chmod -R a+w repo_name 실행.
# fsfs 파일시스템 타입
$ svnadmin create --fs-type fsfs repo_name
# bdb 버클리 디비 타입
$ svnadmin create --fs-type bdb repo_name
기본 디렉토리 구조 설정: trunk, branches, tags
별도로 압축해서 배포하지 않는 웹 프로젝트인 경우에는 trunk, branches, tags 구조 생략
통상 repo_name 까지는 관리자가 생성해서 알려줌. 그 아래 프로젝트 단위 이하 구조는 repository 단위로 리비전(revision) 번호가 매겨지므로, 너무 큰 단위로 저장소를 설정하지 완전히 별개의 프로젝트인 경우에는 가급적 별도의 레파지토리를 설정하는 것이 좋음.
$ svn mkdir http://svn_server.com/svn/repo_name/project_name/trunk
$ svn mkdir http://svn_server.com/svn/repo_name/project_name/branches
$ svn mkdir http://svn_server.com/svn/repo_name/project_name/tags
import
Import : 내컴퓨터 -> Repository
맨 처음 프로젝트를 시작할 때 저장소에 소스들을 넣어야 한다. 이럴 때 하는 것이 import 작업이다.
예를 들어 sampledir 디렉토리에서 작업한다면 이 디렉토리명을 사용한다. 파일을 적으면 import되지 않습니다. 꼭 디렉토리를 만들고 그 디렉토리를 적어 준다. import 하면 저장소의 trunk 디렉토리에는 sampledir 디렉토리안의 sample.c 파일만 올라가게 되고 sampledir은 올라가지 않는다.
sampledir# cd ..
# svn import sampledir http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/trunk
# svn list http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/trunk
sample.c
checkout
checkout : Repository -> 내 컴퓨터
이제 부터 Subversion을 이용해서 프로그램 소스를 관리 할 수 있다. checkout을 해서 어디서든 소스를 받아 볼 수 있다. 방금 import를 하기위해 만들었던 sampledir은 지워도 된다.
# svn checkout http://(Subversion 서버의 IP주소 또는 도메인)/svn/sample/trunk sample
A sample/sample.c
Checked out revision 4.
update
Update : Repository -> 내 컴퓨터
sample# svn update
- 만약 main.cpp 파일을 변경 하면, Update 를 해도 아무런 변화가 일어나지 않는다.
- 내가 아닌 다른 사람이 Repository 를 변경시켰을 때, Update 를 적용할 수 있다.
Update to revision # :
원하는 번호의 Revision 으로 되돌릴 수 있는 기능이다.
(최신 Revision 은 HEAD 이다. 실수로 잘못 수정을 한 후 Commit 을 했더라도, 그 HEAD 이전의 Revision 으로 되돌릴 수 있다.
commit
Commit : 내컴퓨터 -> Repository
내 컴퓨터에서 Repository 로 저장하는 것을 의미한다.
import가 버전의 시작이라면 commit는 버전을 저장소로 보내는 역활을 한다. 수정이 되면 수정된 내용을 저장소로 보낸다.
Revert
Revert : Repository -> 내 컴퓨터
Commit 전에 방금 내가 한 수정을 취소할때 사용된다. 즉, 아직 Commit 을 하지 않았다면,
현재 Repository 에는 내가 수정한 내용이 적용되지 않았을 것이다. 이때 Revert 하면, Repository 에 있는
수정전의 내용이 내 컴퓨터로 적용된다.
기타
Lock/Unlock :
이름만으로도 유추할 수 있듯이, Lock 을 걸면 다른 사람이 이것을 변경할 수 없다.
(정확히 말하면 읽기는 가능하니까, 수정을 해도 Commit 이 안되는 것이다.)
이것은 Unlock 이 될 때까지 지속되는데, 이것이 일종의 문제이다.
(사람의 실수로) Unlock 이 장시간 안되면 효율적인 작업에 문제가 생길 수 있다.
(그렇기 때문에, Repository 는 revision 등의 기능과 함께 Tree 구조를 구성한다.)
주의 사항
○ svn이 걸려있는 디렉토리에서 작업을 할 경우에는 반드시 svn 명령만을 사용해서 파일 변경/삭제 작업을 수행해야 함. 파일 생성후에도 svn add 명령으로 저장소 추가를 예약해놓아야 함.
○ 디렉토리 역시 svn mkdir 명령으로 생성하거나 svn add 로 추가를 예약해야 함. 디렉토리 변경/삭제 역시 svn 명령 사용해야 함.
○ svn 걸려있는지 아닌지 구별하는 방법: svn이 걸려있는 디렉토리에는 .svn 이라는 숨겨진 디렉토리가 있음.
○ 파일 관련 시스템 명령어(cp, mv, rm)를 그대로 사용할 경우에는 svn 체계에 혼선이 생겨서 이후 변경 내용이 반영되지 못하는 문제가 발생함
○ 모든 svn 관련 작업 이후에는 svn commit 명령을 실행해줘야 svn 저장소에 반영이 됨
이 글을 공유하기