SVN(Subversion)
SVN은 여러명이서 작업하는 프로젝트의 버전관리나 각자 만든 소스의 통합과 같은 문제를 해결하기 위해 저장소를 만들어 그곳에 소스를 저장해 소스 중복이나 여러 문제를 해결하기 위한 형상관리/소스 관리 툴이다.
형상관리 : 소스의 변화를 끈임없이 관리하는 것
프로젝트 소스는 SVN 서버의 Trunk라는 곳에 위치하는데, 자신의 Local 저장소에 Trunk의 소스를 다운 받아 수정 및
추가 후 다시 업로드 하는 방식.
자신만의 소스를 다른 개발자들과 떨어져서 작업하려면 Branch를 만들어 작업 후 자기자신만 접근, 개발하여
완성되면 Merge 기능을 사용하여 Trunk와 소스를 합치면 된다.
A가 자신이 수정한 소스나 폴더를 Commit하면 B는 해당 소스를 Update하면 최신 소스를 받아올 수 있다.
SVN 사용 목적
형상관리 툴을 사용하게 되면 소스를 버전 별로 관리할 수 있어서 개발할 때 실수로 소스를 삭제하거나 수정하기 이전으로 돌아가야되는 경우에 유용하게 사용할 수 있다.
팀 프로젝트에서도 누가,무엇을.어떻게 수정했는지도 알 수 있기 때문에 코드를 병합하거나 수정된 소스를 추적하는 데에도 사용 된다.
단순히 사용 목적을 나열하자면 아래와 같다.
- Revision 별로 파일 백업이 가능하다.
파일 복원이 가능해지고, 실수가 발생해도 수정이 빨리 이루어 질 수 있다.
- 개발 버전과 배포 버전을 섞이지 않고 쉽게 관리 가능
소스코드 버전관리
- 파일 이름 변경,이동,디렉토리 버전 관리도 지원이 가능하다.
- 여러 사용자가 동시에 커밋을 하더라도 충돌이 발생하지 않는다.
프로젝트 협업 지원
- 한번 커밋이 발생 할때 마다 revision이 올라간다.
어느 revision이 어떤 파일을 commit했는지 확인 용이
- commit시에 자동 로그 기능이 있다.
작업 이력 관리
- 서버와 클라이언트 양방향 데이터 전송으로 네트워크 소통량이 최소화된다.
- 접근이 가능한 개발자는 누구든 쉽게 수정이 가능하다.
SVN 용어 & 명령어
용어
Repository
프로젝트 파일 및 변경 정보가 저장되는 장소로 모든 프로젝트의 프로그램 소스들은 이 저장소안에 저장 된다.
한 프로젝트 마다 하나의 저장소가 필요하며, 네트워크를 통해서 여러 사람이 접근 할 수 있고
소스뿐만이 아니라 소스의 변경 사항도 모두 저장된다.
Trunk
프로젝트에서 가장 중심이 되는 디렉토리로 개발 소스를 Commit했을 때 개발 소스가 모이는 장소이다.
소스와 파일 포함
모든 개발 작업은 trunk 디렉토리에서 이루어지며 trunk 디렉토리 아래에는 바로 소스들의 파일과 디렉토리가 들어가게 된다.
Branch
trunk에서 뻗어져 나온 나뭇가지를 뜻하며, 프로젝트 내의 작은 프로젝트의 개념이다.
trunk 디렉토리에서 개발하다 보면 큰 프로젝트에서 또 다른 작은 분류로 빼서 따로 개발해야할 경우가 생기는데,
이때 프로젝트안의 작은 프로젝트를 생성하는 개념으로, branches 디렉토리 안에 또 다른 디렉토리를 두어
그 안에서 개발하게 된다.
trunk에서 분리/복사한 소스로 버전별 배포판을 생성하거나 trunk와 별도로 운영환경을 위한 안정화된 소스 관리 목적으로 사용된다.
Tag
tag는 꼬리표라는 뜻으로 버전 별로 소스코드를 따로 관리하는 공간이다.
버전 별로 태그를 붙여 tag 디렉토리 안에 보관하는 개념
특정 시점의 상태 보존 목적으로 사용 장기적으로 버전 별로(1.0, 1.1 등) 소스 코드를 따로 저장하는 공간이다.
특정 시점에서 프로젝트의 스냅샷을 찍어두는 것
Revision
수정된 버전이라는 의미로, 클라이언트가 Repository에 새로운 파일,수정 등을 commit할때 마다 번호가 하나씩 증가한다.
Head
Repository에 저장된 최신 revision을 의미한다.
누군가에 의한 가장 최근에 commit된 revision이다.
Base
클라이언트가 checkout,update 등의 명령을 통해 Repository로 부터 내려받은 revision을 의미한다.
이 revision을 가지고 클라이언트는 수정 및 commit을 하게 된다.
만약 Head와 Base가 다르다면 commit이 거부되고 update를 먼저 수행해야 commit이 가능해진다.
내가 update한 후 소스 코드를 수정하고 있는 상황에서 다른 사람이 commit하여 revision이 증가한 경우
Head는 다른 사람이 commit한 revision이 되어 내 소스코드가 이전 revison이 된 경우이다.
lmport
맨 처음 프로젝트 시작할때 빈 Repository에 맨 처음 파일들을 저장소에 등록하는 명령어이다.
Checkout
저장소에서 소스를 받아 오는 명령어로, 받아온 소스에는 소스 뿐만이 아니라 버전관리를 위한 파일도 같이 받아 온다.
지우거나 변경시 저장소와 연결 불가능
Export
Checkout과 달리 버전관리 파일을 뺀 순수한 소스만 가져오는 명령어로 마지막에 사용한다.
Commit
로컬 저장소의 체크아웃 한 소스의 변경된 내용(수정,파일 추가,삭제 등)을 저장소에 저장하여 갱신 하는 명령어이다.
Update
체크아웃 해서 받은 소스를 서버 저장소의 최신 소스 버전으로 업데이트 하는 명령어이다.
소스 수정이나 Commit하기전에 한 번씩 해주는게 좋다.
Revert
로컬 저장소의 소스 코드 내용을 이전 상태로 돌리는 명령어이다.
Log
저장소에 어떠한 것들이 변경 되었는지 revison을 통해 확인 할 수 있는 명령어이다.
Diff
예전 소스 파일과 지금의 소스 파일의 차이점을 비교해 보는 명령어이다.
Blame
한 소스 파일을 대상으로 각 리비전에 대해서 어떤 행을 누가 수정했는지 작업한 내용을 확인하는 명령어이다.
출력 순서는 리비전,커밋한 사용자의 ID,소스 순이다.
lock
파일에 락을 걸어 락을 건 사용자만이 수정할 수 있게 해주는 명령어이다.
해제는 svn unlock을 통해 할 수 있으며, 왜 파일에 락을 걸었는지도 로그를 기록 할 수 있다.
Add
새 파일을 만들었을 경우에 파일을 추가 해주는 명령어이다.
저장소에 저장은 되지 않아 add 뒤엔 꼭 svn commit을 꼭 해줘야 한다.
Status
자신이 수정하고 있는 파일의 상태를 알려주는 명령어이다.
Mkdir
새로운 디렉토리를 만드는 명령어로 실제 변경사항은 commit시에 적용된다.
Delete
파일/디렉토리를 삭제하는 명령어이다.
Move
파일을 이동하는 명령어로 실제 변경사항은 commit시에 적용된다.
rename
파일 이름을 변경하는 명령어로 실제 변경사항은 commit시에 적용된다.
List
파일 리스트를 확인하는 명령어이다.
Switch
소스 서버를 변경하는 명령어이다.
lnfo
로컬 저장소 또는 원격 저장소의 파일, 폴더 정보를 확인하는 명령어이다.
SVN vs GIT
SVN
- svn은 대부분의 기능을 완성해놓고 소스를 중앙 저장소에 commit한다.
SVN에서 commit은 중앙 저장소에 해당 기능을 공개한다는 의미.
- GIT과 가장 큰 차이점은 개발자가 자신만의 Version History를 가질 수 없다.
local History를 이용하긴 하지만 일시적이고 자신이 몇일전까지에 한해 작업한 내역을
확인 가능하지만 버전 관리가 되지는 않는다.
- Commit한 내용에 실수가 있을 시에 다른 개발자에게 바로 영향을 미치게 된다.
GIT
- GIT은 개발자가 자신만의 Commit History를 가질 수 있고, 개발자 저장소와 서버 저장소를
독립적으로 관리가 가능하다.
매우 유연한 방식으로 소스를 운영할 수 있으며, 이러한 유연성이 git의 가장 큰 장점
- Commit한 내용에 실수가 있더라도 바로 서버에 영향으 미치지 않는다.
- 마음대로 Commit(Push)하다가 자신이 원하는 순간에 서버에 변경 내역을 보낼 수 있으며,
서버의 통합 관리자는 관리자가 원하는 순간에 각 개발자의 Commit History를 가져올 수 있다.
참고 사이트
https://velog.io/@gillog/SVNSubversion-%EA%B8%B0%EB%B3%B8