SVN(SubVersion)은 Git과 같은 버전 관리 툴이다.
버전 관리 종류는 아래와 같으며, SVN은 중앙 집중식 버전 관리인 CVCS에 속한다.
- 버전 관리 종류
- 로컬 버전 관리
- VCS 도구 중에 RCS(Revision Control System)을 가장 많이 사용
- RCS는 기본적으로 Patch Set(파일에서 변경되는 부분)을 관리
- Patch Set은 특별한 형식의 파일로 저장되며 이를 이용해 특정 시점으로 되돌릴 수 있다.
- 중앙 집중식 버전 관리 (CVCS)
- CVS, Subversion, Perforce 같은 시스템은 파일을 관리하는 서버가 별도로 존재
- 클라이언트가 중앙 서버에서 파일을 받아서 사용(Checkout)
- 서버가 다운되면 서비스 이용이 불가능
- 분산 버전 관리 시스템 (DVCS)
- Git, Mecurial, Bazaar, Darcs 같은 DVCS에서의 클라이언트는 저장소를 히스토리와 더불어 전부 복제
- 대부분의 DVCS 환경에서는 리모트 저장소가 존재
- 로컬 버전 관리
사용 방법을 알아보기전에 SVN에서 사용하는 기본 용어를 알아보자.
- repository: 한 프로젝트의 소스들은 한 저장소 안에 저장된다. 소스 및 소스 변경사항들이 모두 저장되며, 네트워크로 저장소에 접근 할 수 있다. Subversion은 Berkeley DB 를 사용한다.
- revision: Subversion에서 소스 파일등을 수정하여 커밋을하면 revision이 올라간다. 일종의 기록 수단이며, 원하는 revision으로 돌아갈수도 있다.
- trunck: 프로젝트에서 가장 가장 중심이되는 디렉토리이다. 모든 개발 작업들은 trunck에서 이루어진다.
- branches: trunck에서 branches로 나누어서 개발할 수 있다.
- tags: 개발하면서 릴리즈를 할 때마다 이 디렉토리에 저장된다. tags 디렉토리에는 버전명으로 디렉토리가 생성된다.
맥에서는 아래 명령어로 설치 가능하다.
brew install subversion
설치가 잘 되었는지 버전 확인 명령어로 확인해보자.
- 서버
svnserve --version
- 클라이언트
svn --version
잘 설치 되었다.
서버 설정
svnadmin으로 레파지토리를 생성해주자.
svnadmin create ./svn/repos/myApp
svnadmin: E000002: 오류가 발생한다면 아래 글을 참고하자.
정상적으로 실행되면 아래와 같이 폴더와 파일들이 생성된다.
SVN 로그인 계정을 등록하자
/conf/passwd 파일을 수정해야한다.
아이디: holee, 비밀번호: 1234
SVN 환경 설정
/conf/svnserve.conf 파일을 수정해서 권한들을 설절 할 수 있다. 우선, 기본적인 세 가지만 설정해보자.
익명 사용자 접근 막기: anon_access = none
인증 사용자 쓰기 권한: auth_access = write
인증 데이터베이스의 passwd 사용: password-db = passwd
SVN 서버 실행 명령어
아래 명령어를 통해서 svn 서버를 실행할 수 있다.
svnserve -d --listen-port=3690 -r <Repository Path>
SVN 서버에 기존 소스 import 하기
먼저 trunk, branches, tags 폴더를 생성해주자.
svn mkdir svn://localhost/trunk
svn mkdir svn://localhost/branches
svn mkdir svn://localhost/tags
svn: E205007 에러가 발생한다면 아래를 참고하자.
디렉토리는 아래 명령어로 삭제할 수 있다.
svn rm svn://localhost/trunk
아래 명령어로 존재하는 파일들을 svn에 반영해보자.
svn import --no-auto-props --no-ignore -m "커밋 메세지" <folder path> svn://localhost/trunk/svnholee
옵션
- --no-auto-props --no-ignore: 바이너리 파일을 추가 가능
- -m "메시지": svn 기록 메세지
프로젝트 export
svn export svn://localhost/trunk/svnholee
Exported revision 4. 를 보면 revision이 4로 올라간것을 볼 수 있다.
SVN은 revision 별로 파일 백업이 가능하다. 또한, commit을 하면 바로 서버에 반영된다.
svn 기본 명령어
svn 명령어에 어떤것들이 있는지는 svn help, svn help <명령어> 로 확인 할 수 있다. svn에는 총 37 가지 명령어들이 존재한다.
checkout
checkout을 통해 svn 서버에 저장된 레파지토리를 가져올 수 있다.
svn checkout svn://localhost/trunk/svnholee
짜란~ 받아왔따.
Commit
아까 서버에 올린 파일을 변경한뒤 커밋을 해보자.
svn commit -m "커밋 메세지"
Update
svnholee 폴더에 hi 파일이 있다. hi 파일은 HELLO HOLEE 문자열이 들어있다. 이때 revision은 4이다.
한편 다른쪽에서 똑같이 레파지토리를 checkout 한 폴더에서 hi 파일을 HELLO WORLD로 변경하고 commit을한다. 이때 revision은 6이다. (중간에 한번 더 commit 해서 6이 되었다.)
다시 돌아와서 svn update를 하면 svn 서버에 가장 최신 revision 버전으로 현재 폴더에 반영해준다.
최신 버전이 반영이 되었다.
Info
해당 폴더에 대한 svn 정보를 보여준다.
svn info
Conflict
revision이 동일한 두 디렉토리가 있다. 이제 각각의 디렉토리의 hi파일에 대해 변경을 하고 commit을 할 것이다.
첫번째, 커밋 완료.
두번째, 충돌이 났다..
폴더를 보면 hi.mine, hi.r6, hi.r7 파일이 새로 생성됐다.
hi.mine: 내가 작성한 hi 파일이다.
hi.r6: revision 6의 hi 이다.
hi.r7: revision 7의 hi 이다.
df로 diff를 보자.
m으로 merge를 해보자. 나의 hi 파일로 반영해보자.
r 로 문제를 해결하자. 아래 메세지를 보면 더 이상 충돌이 없음을 알 수 있다.
commit을 하자.
한편 반대쪽에서 update 를 해보면 revision이 8로 바뀌고 holee로 바뀌는것을 볼 수 있다.
Blame
Blame 명령어는 누가 commit을 했는지 알 수 있다.
svn blame <파일명>
마지막으로 svn으로 관리되는 디렉토리에는 .svn 폴더가 생성돼서 해당 디렉토리를 관리한다.
결론
svn의 간단한 사용법을 알아보았다. 서버 하나로 관리되며, commit을 하면 바로 서버에 반영이 된다.
git에서는 branch 개념이 명령어에 반영돼있다. 하지만, svn 같은 경우는 명령어로 생성하는 것이 아니고, 단순히 flow를 나눠놓은것이었다.
단순히 폴더를 나눠서 flow 관리하는 개념이다. 이후, svn 개념이 발전해서 git이 나온 만큼 git과 많은 부분이 닮아 있다.
'Search > Version Control' 카테고리의 다른 글
git 소개 (0) | 2021.07.15 |
---|---|
Mercurial 소개 (SourceForge) (0) | 2021.07.15 |
댓글