본문 바로가기

VCS

자주 쓰이는 SVN Commands 10 예제

자주 쓰이는 SVN Commands 10 예제

SVN은 Subversion의 약자입니다. 


Subversion은 프리/오픈소스 VCS(Version Control System)입니다. Subversion은 시간에 따라 파일과 디렉토리를 관리합니다. 

파일 트리는 중앙 리포지터리(repository, 이하 저장소)에 배치됩니다. 저장소는 파일과 디렉토리들의 변경내역을 모두 기억한다는 것을 제외하고는 일반적인 파일 서버와 굉장히 유사하며, 코드의 이전 버전들을 복구하거나 변경 내역을 검토하는 데 사용됩니다.


예제와 함께 기본 SVN 커맨드들을 봅시다. 

SVN 작업 복사본 (SVN Working Copy)

SVN은 SVN server라고도 불리는, 모든 버전 데이터를 저장하는 저장소입니다. SVN 클라이언트 프로그램은 working copy라고 불리는 버전 데이터의 부분에 대한 로컬 반영을 관리합니다. SVN 클라이언트는 네트워크를 통해 저장소에 액세스할 수 있으며, 다수의 유저들이 동시에 저장소에 액세스할 수 있습니다. 

1. Checkout - 작업 복사본 만들기

Checkout 커맨드는 SVN 저장소에서 작업 복사본으로 소스를 다운로드하는 데 사용됩니다. 

SVN 서버의 파일에 액세스하고 싶다면, Checkout이 첫째 단계입니다.


SVN checkout은 편집, 삭제, 또는 내용을 추가할 수 있는 복사본을 생성합니다. 

파일, 디렉토리, 혹은 프로젝트 통째로 checkout 할 수 있고, checkout을 위해선 checkout하고자 하는 컴포넌트의 URL을 알아야 됩니다.


$ svn checkout/co URL PATH

PATH를 생략하면, URL의 베이스네임이 대상으로 사용됩니다. 

만약 여러 개의 URL이 주어지면 각 URL은 PATH의 하위 디렉토리로 checkout되며 하위 디렉토리의 이름은 URL의 베이스네임이 됩니다. 


아래 예는 지정된 타겟 디렉토리에 대해 checkout 합니다. 


$ svn co https://www.thegeekstuff.com/project/branches/release/migration/data/cfg /home/sasikala/cfg/
A    /home/sasikala/cfg/ftp_user.cfg
A    /home/sasikala/cfg/inventory.cfg
A    /home/sasikala/cfg/email_user.cfg
A    /home/sasikala/cfg/svn-commands
Checked out revision 811.

$ ls /home/sasikala/cfg
.  ..  .svn  email_user.cfg  ftp_user.cfg  inventory.cfg  svn-commands

checkout을 수행하면, 저장소 정보가 들어있는 .svn이라는 숨겨진 디렉토리가 생성됩니다.

2. Commit - 변경사항 저장하기

작업 복사본을 변경할 때마다, SVN 서버에 반영되진 않습니다. 변경사항을 유지하려면 SVN commit을 사용합니다.


$ svn commit -m "log messages"

-m 옵션으로 파일을 변경한 이유를 설명하세요.


예를 들어, svn-commands 파일이 아래 내용을 갖고 있다고 합시다. 


$ cat /home/sasikala/cfg/svn-commands
checkout
commit
add
delete
update
status

$ ls -l /home/sasikala/cfg/svn-commands
-rw-r--r--  1 root root 41 Apr 16 11:15 svn-commands

이 파일을 변경했습니다. (아래 예에서는, 파일 내용을 없앴습니다)


$ ls -l svn-commands
-rw-r--r--  1 root root 0 Apr 16 11:20 svn-commands

이제 commit하여 변경사항을 서버에 유지합시다.


$ svn commit -m "Making the file empty" svn-commands
Sending        svn-commands
Transmitting file data .
Committed revision 813.

작업 복사본을 업데이트하거나 checkout 할 때마다, 변경사항이 서버에 표시될 겁니다.

3. List - 항목 나열하기

svn list는 SVN 저장소에 있는 내용을 작업 복사본을 다운로드하지 않고 볼 때 유용합니다.


$ svn list

아래 예는 작업 복사본을 다운로드하지 않고도 저장소의 주어진 URL에서 사용 가능한 모든 파일을 보여줍니다.

-verbose 옵션과 함께 svn list 명령을 실행하면 다음 정보가 표시됩니다. 


  • 마지막 commit의 리비전넘버
  • 마지막 commit의 작성자
  • 마지막 commit 날짜와 시간
  • 크기(bytes)

$ svn list --verbose https://www.thegeekstuff.com/project/branches/release/migration/data/bin 16 sasikala 28361 Apr 16 21:11 README.txt 21 sasikala 0 Apr 18 12:22 INSTALL 22 sasikala Apr 18 10:17 src/

4. Add - 저장소에 새 파일 추가하기

새로운 파일(혹은 디렉토리)을 저장소에 추가하고 싶을 때 SVN add 커맨드를 사용합니다. 
저장소는 당신이 SVN commit을 수행하면 새롭게 추가된 파일을 갖게 될 것입니다. 
그럼 "thegeekstuff" 라고 명명한 새 파일을 저장소에 추가해 봅시다.

로컬 작업 복사본에 새로운 파일 생성
$ ls -l /home/sasikala/cfg/thegeekstuff
-rw-r--r--  1 sasikala root 8 Apr 16 11:33 thegeekstuff

SVN 저장소에 새로운 파일 add.

svn add filename 커맨드는 SVN 저장소에 파일을 추가할 겁니다. 

$ svn add thegeekstuff
A         thegeekstuff

추가된 파일 Commit.

커밋 전까지는 저장소에서 add된 파일이 사용불가합니다. 

$ svn commit -m "Adding a file thegeekstuff" thegeekstuff Adding thegeekstuff Transmitting file data . Committed revision 814.

5. Delete - 저장소에서 파일 삭제하기

SVN delete 커맨드는 작업 복사본 혹은 저장소의 아이템을 삭제합니다. 

SVN commit을 수행하면 저장소에서 파일이 삭제될 겁니다.


$ svn delete URL

그럼 최근에 만든 thegeekstuff 파일을 삭제해 봅시다.


$ svn delete thegeekstuff
D         thegeekstuff

$ svn commit -m "Removing thegeekstuff file" thegeekstuff
Deleting       thegeekstuff
Committed revision 814.

svn list를 실행해 파일이 저장소에서 삭제되었는지 확인할 수 있습니다. 

6. Diff - 차이점 표시

SVN Diff 커맨드는 당신의 작업 복사본과 SVN 저장소의 복사본 간의 차이점을 표시합니다. 

2개의 리비전 혹은 경로, 기타 등을 통해 차이점을 찾을 수 있습니다. 


$ svn diff filename

$ svn -r R1:R2 diff filename

위 예는 R1과 R2 파일을 비교합니다. 


아까의 thegeekstuff 파일 내용은 현재 이렇습니다.


$ cat /home/sasikala/cfg/thegeekstuff
testing

thegeekstuff 파일 내용을 testing -> tester 로 수정해서, svn diff 커맨드로 확인해봅시다. 


$ svn diff thegeekstuff
Index: thegeekstuff
===================================================================
--- thegeekstuff   (revision 815)
+++ thegeekstuff   (working copy)
@@ -1 +1 @@
-testing
+tester

7. SVN Status - 작업 복사본의 상태

svn status 커맨드를 사용해서 작업 복사본에서 파일 상태를 가져옵니다. 
작업 복사본이 수정(modified) 되었는지, 추가/삭제되었는지, 혹은 리비전 제어 하에 있는지 등을 표시합니다. 

$ svn status PATH

아래 예는 로컬 작업 복사본의 상태를 보여줍니다.


$ svn status /home/sasikala/cfg
M    	/home/sasikala/cfg/ftp_user.cfg
M      	/home/sasikala/cfg/geekstuff

M 은 항목이 수정되었음을 나타냅니다. svn help status 커맨드로 svn status 커맨드의 여러 상세 설명을 볼 수 있습니다.

8. SVN Log - 로그 메시지 표시

처음에 설명한 것처럼 SVN은 파일 및 디렉토리에 대한 모든 변경 사항을 기억합니다. 

파일이나 디렉토리에서 이루어진 모든 커밋을 확인하려면 SVN log 커맨드를 사용하세요.


$ svn log PATH

다음은 thegeekstuff 파일에 대한 모든 커밋을 표시합니다.


$ svn log thegeekstuff
------------------------------------------------------------------------
r815 | sasikala | 2011-04-16 05:14:18 -0700 (Sat, 16 Apr 2011) | 1 line

Adding a file thegeekstuff
------------------------------------------------------------------------

thegeekstuff 파일의 수정은 여러번 했지만 커밋은 한 번만 수행했으므로 세부 정보가 포함된 로그 메시지가 하나만 표시되는 것을 확인할 수 있습니다.

9. SVN Move - 파일이나 디렉토리 이름변경

이 커맨드는 한 디렉토리에서 다른 디렉토리로 파일을 이동하거나 파일의 이름을 변경합니다. 
파일은 로컬 샌드박스에서 즉시 이동됩니다. (커밋 후에는 저장소에서도 이동합니다)

$ svn move src dest
아래 커맨드는 thegeekstuff 파일 이름을 tgs 로 한 방에 바꿉니다.

$ svn move thegeekstuff tgs
A         tgs
D         thegeekstuff

$ ls
.#  ..  .svn  email_user.cfg  ftp_user.cfg  inventory.cfg  tgs
이제 파일은 작업 복사본에서 이름이 바뀌었습니다. 하지만 아직 저장소에선 아니죠. 변경사항을 유지하려면 commit이 필요합니다.


$ svn commit -m "Renaming thegeekstuff to tgs" tgs
Adding         tgs
Transmitting file data .
Committed revision 816.

10. SVN Update - 작업 복사본 업데이트

svn update 커맨드는 변경 사항을 저장소에서 작업 복사본으로 가져옵니다. 
리비전을 지정하지 않으면 HEAD 리비전을 통해 작업 복사본을 최신 상태로 업데이트하며, 
지정한다면 해당 리비전과 작업 복사본을 동기화합니다. 

작업 복사본에서 작업하기 전에 항상 작업 복사본을 업데이트하세요. 

저장소에서 사용 가능한 모든 변경 사항을 작업 복사본에서 사용할 수 있습니다. (즉 최신 버전을 사용할 수 있음.)


$ svn update PATH

다른 유저가 URL에 파일을 추가/삭제한 경우, 작업 복사본을 업데이트하기 전까지는 작업 복사본에 기본적으로 해당 파일이 없습니다.


$ svn update
A  new/usercfg
A  new/webcfg
Updated to revision 819.

위의 svn update 커맨드 결과에서, A는 해당 파일이 작업 복사본에 add 되었음을 나타냅니다.



(위 포스트는 https://www.thegeekstuff.com/2011/04/svn-command-examples/ 글을 번역했습니다.)