메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

CVS 사용자를 위한 Subversion 팁

한빛미디어

|

2004-09-07

|

by HANBIT

18,399

저자: Brian W. Fitzpatrick, 역 한동훈(traxacun at unitel.co.kr)
원문: http://www.onlamp.com/pub/a/onlamp/2004/08/19/subversiontips.html

Subversion 프로젝트의 목표는 "CVS를 대체할 강력한 소스 관리 도구를 제공하는 것"이며, 부수적으로 CVS 사용자가 쉽게 Subversion으로 변경할 수 있도록 CVS와 유사한 사용자 인터페이스를 제공하는 것이다.

Subversion의 새로운 특징들을 배웠다면, 직접 사용할 차례가 맞지 않을까?

인터페이스가 유사하더라도, 중요한 차이점은 몇가지 있다. Subversion은 CVS가 제공하지 않거나, 다른 형태로 제공하던 몇가지 기능들을 제공할 뿐만 아니라, CVS를 설치하고 익히게 된 나쁜 버릇들도 날려버려야 하는 기능들을 제공하고 있다.

이를 염두에 두고 CVS 사용자를 위한 10가지 subversion 팁을 살펴보도록하자. 먼저 소개하는 6가지 팁은 CVS의 나쁜 버릇에 관한 것이며, 나머지 4가지는 Subversion 이용에 있어 좋은 버릇을 위한 것이다.

1. 자신의 상태를 알기 위해 status를 사용하라

CVS에서는 작업 사본(working copy)에 변경사항이 있는지 살펴보고 싶을 때 cvs update를 실행해야 했으며, 이는 분명 이상한 일이다. 이 명령은 작업 사본에 있는 파일을 보여줄 뿐만 아니라 저장소(repository)에 있는 최신 버전을 작업 사본으로 복사해온다. 이것은 서버와의 라운드 트립을 유발할 뿐만 아니라, 작업 사본도 변경시킨다. 작업 사본에서 변경된 것과 저장소에서 변경된 것을 찾아내는 것은 어려운 일이며, CVS는 이 두가지를 섞어버린다.

Subversion에서는 변경 사항을 알기 위해 svn status를 사용한다. 이 명령은 작업 사본에 있는 것과 Subversion 관리자 영역(.svn 디렉터리)에 있는 것을 비교하기 때문에 네트워크 라운드 트립이 발생하지 않는다.

$ svn status
D fish.c
A shrimp.c
M anemone.c
fish.c는 삭제될 것이며, shrimp.c는 추가될 것이며, anemore.c는 변경되었다는 것을 의미한다.

이제, 기본적으로 svn status는 추가, 수정, 삭제되는 것과 같이 원하는 파일만 보여줄 수 있다. 작업 사본에 있는 모든 파일에 대한 정보를 보고 싶다면 --verbose 스위치를 사용한다.

$ svn status --verbose
44 23 sally README
44 30 sally INSTALL
44 35 harry trout.c
D 44 19 ira fish.c
A 0 ? ? shrimp.c
M 0 ? ? anemone.c
44 36 harry things/rocks.txt
첫번째 열은 동일하지만, 두번째는 작업 사본의 개정번호를 보여준다. 세번째와 네번째 열은 각 항목이 마지막으로 변경된 개정번호와 누가 변경했는지를 보여준다.

svn update를 실행했을 때 어떤 파일이 업데이트되는지 알고 싶다면 --show-updates 스위치를 사용한다.

$ svn status --show-updates --verbose
* 44 23 sally README
44 30 sally INSTALL
* 44 35 harry trout.c
D 44 19 ira fish.c
A 0 ? ? shrimp.c
M * 44 32 sally anemone.c
44 36 harry things/rocks.txt
업데이트될 파일은 *로 표시되는 것을 알 수 있다.

2. 옮길 때 알아야 할 것들

CVS 저장소를 위해 디렉터리를 정리하고, 파일을 옮기느라 시간을 보내는 사람들을 본적 있다. 이런 작업을 하는 이유는 CVS가 알고 있는 파일과 디렉터리에 대해서는 이동을 허용하지 않기 때문이다. Sunversion에서는 파일과 디렉터리를 이동할 수 있다.

cf. 물론, CVS에서도 저장소에 있는 파일을 옮기기 위해 파일을 이동시키고, 저장소에 삭제와 추가 작업을 수작업으로 할 수는 있다. 하지만, 이런 작업은 기존 파일을 삭제하고, 새 파일을 추가하는 것이 되기 때문에 버전 관리의 히스토리가 완전히 무용지물이 되고 만다.

$ svn move foo.c bar.c
A bar.c
D foo.c
이제 bar.c는 저장소에 추가될 것이고, foo.c는 삭제될 것이다.(Subversion은 이동에 대해 추가와 삭제로 보여주며, svn commit을 수행할 때 서버에 변경사항이 반영된다)

URL을 사용해서 파일과 디렉터리를 이동시킬 수도 있다.

$ svn move -m "Move a file" http://svn.red-bean.com/repos/foo.c \
http://svn.red-bean.com/repos/bar.c
위와 같은 명령은 서버에 있는 foo.c를 bar.c로 바로 변경한다.

3. 복사에 의한 태그 부여와 트리확장(branch)

CVS에서는 태그를 부여하거나 트리를 확장하기 위해 cvs tag, cvs tag ?b, cvs rtag, cvs rtag -b를 사용하지만, Subversion에서는 copy를 사용한다.

$ svn copy -m "Tag rc1 rel." http://svn.red-bean.com/repos/trunk \
http://svn.red-bean.com/repos/tags/1.0rc1
위 명령을 사용하여 주요 개발 버전에 대한 태그를 부여한 것이다.(Subversion 용어로는 이를 trunk라 한다.) 트리 확장을 하고 싶다면, trunk를 트리 확장 디렉터리로 복사하면 된다. Subversion에서 태그 부여와 트리 확장은 매우 빠르게 수행된다.

Subversion에서 태그와 확장(branch)는 저장소 트리에서 복제된 경로에 불과하다. 보통 태그는 /tags 디렉터리 밑에, 확장(branches)은 /branches 디렉터리 밑에 있다.

CVS에서는 저장소에 태그가 부여된 각각의 파일을 수정해야 한다. 이 과정은 저장소 크기에 따라 다르며, 매우 긴 시간이 걸린다. 반면에 Subversion에서는 디렉터리 노드 하나만 복사하기 때문에 속도도 빠르며, 저장소의 공간도 거의 사용하지 않는다. 태그나 확장에 관련된 파일 수가 아무리 많아도 문제되지 않는다. Subversion에서는 이를 "저렴한 복제(cheap copies)"라고 부른다.

Subversion에서는 같은 개정 번호에 속한 모든 파일들에 태그를 부여하는 것을 제한하지 않는다. "섞여버린 개정 번호(mixed-revision)"을 갖는 태그나 확장(branch)을 만들 필요가 있다면 작업 복사본을 URL로 복사하면 된다.

$ svn copy -m "Mixed branch." . http://svn.red-bean.com/repos/branch/1.2-mixed

태그와 확장에 대한 보다 자세한 설명은 Branching and Merging을 참고하기 바란다.

4. "삭제 및 업데이트" 대신 "복원(revert)"

CVS 작업 사본에서 작업하던 파일을 원본으로 복원하고 싶은 경우 다음과 같은 작업을 할 것이다.

$ rm I-made-a-boo-boo.txt
$ cvs up I-made-a-boo-boo.txt
U I-made-a-boo-boo.txt
두 번의 절차를 거쳐야 하며, 변경되지 않은 파일을 가져오기 위해 서버와 데이터를 주고 받아야 한다. 그러나 Subversion에서는 각 파일의 원본을 .svn 디렉터리에 보관하고 있으므로 다음과 같이 하면 된다.

$ svn revert I-made-a-boo-boo.txt
Reverted "I-made-a-boo-boo.txt"
이와 같은 방법은 지금 네트워크에 연결되어 있지 않아도 사용할 수 있으며 사용법도 간단하다.

5. 버전 관리 시스템을 두려워말라

CVS는 각 라인의 끝을 변환하고, 파일에 $Id$와 같은 키워드를 붙여나간다.(UNIX는 각 라인의 마지막을 CR로 표기하며, 윈도우는 CRLF로 표기하며, CVS는 이러한 변환을 수행한다) 이런 방법은 매우 편리하지만 CVS 저장소에 이진 파일(binary file)을 저장하게 되면 푸딩처럼 엉망이 되어 버린다.
Subversion은 사용자가 요청하기 전까지는 데이터에 어떤 변경도 가하지 않는다.

Subversion 저장소에 이진 파일을 저장할 수 있으며, 파일이 손상되지 않도록 별도의 작업을 할 필요가 없다. 그러나 .java, .c와 같은 텍스트 파일을 추가할 때 Subversion에서 자동으로 각 라인의 끝을 변환하게 할 수도 있다. 이에 대해서는 Subversion properties을 참고하기 바란다.

이와 같은 경우에는 svn:eol-style 속성을 native로 설정하면 된다.

$ svn propset svn:eol-style native halibut.c

파일에 특정 속성을 추가하기 위해 Subversion 클라이언트를 설정할 수도 있으며, 이에 대해서는 Automatic Propertiesconfiguration을 참고하기 바란다.

6. 로그

Subversion의 log 명령은 CVS log 명령보다 훨씬 더 강력하다.

Subversion의 log 명령이 강력한 이유로는 CVS log 명령이 동일한 커밋인지, 아닌지 알 수 없는 파일 목록을 보여주는 것과 달리 최소 단위 커밋(atomic Subversion commit)에 따라 데이터를 보여주는 데 있다.(CVS에는 커밋 그룹이라는 개념이 없다) Subversion은 저장소의 로그 데이터를 보다 간결하게 보여줄 수 있다.

$ svn log
------------------------------------------------------------------------
r3 | sally | Mon, 15 Jul 2002 18:03:46 -0500 | 1 line

Added include lines and corrected # of cheese slices.
------------------------------------------------------------------------
r2 | harry | Mon, 15 Jul 2002 17:47:57 -0500 | 1 line

Outline sandwich fixins.
------------------------------------------------------------------------
r1 | sally | Mon, 15 Jul 2002 17:40:08 -0500 | 1 line

Initial import
------------------------------------------------------------------------
각 로그 항목은 항목, 저자, 날짜, 로그에 기록된 라인 수, 로그 메시지를 볼 수 있다. 로그에 변경된 경로까지 보고 싶다면 --verbose 플래그를 사용할 수 있다.

$ svn log --verbose
------------------------------------------------------------------------
r3 | sally | Mon, 15 Jul 2002 18:03:46 -0500 | 1 line
Changed paths:
M /trunk/sandwich.txt

Added include lines and corrected # of cheese slices.
------------------------------------------------------------------------
r2 | harry | Mon, 15 Jul 2002 17:47:57 -0500 | 1 line
Changed paths:
M /trunk/sandwich.txt

Outline sandwich fixins.
------------------------------------------------------------------------
r1 | sally | Mon, 15 Jul 2002 17:40:08 -0500 | 1 line
Changed paths:
A /trunk/sandwich.txt

Initial import
------------------------------------------------------------------------
위 예제에서, log 명령에 특정 파일이나 디렉터리에 대한 정보를 제공하지 않는다는 것을 알 수 있다. 어떤 것도 지정하지 않고 svn log 명령을 사용하면 현재 작업 디렉터리를 참조한다. Subversion은 초기 개정 번호로 1을 사용하며, 최종 개정 번호로 현재 작업 디렉터리의 작업 개정번호로 사용한다.(작업 개정 번호를 알기 위해서는 svn status -v를 사용한다)

여기서 잠깐 알아둘 것이 있다. 파일의 변경 사항을 커밋하고 즉시 svn log를 수행하면 작업 디렉터리의 "작업 개정번호"가 업데이트되지 않았기 때문에 커밋에 대한 로그 메시지를 볼 수 없다. 파일을 커밋하는 것이 작업 디렉터리나 다른 파일을 자동으로 업데이트하지 않는다. svn update를 수행하고 svn log를 수행하면 "실종된(missing)" 로그 메시지를 볼 수 있을 것이다.

svn log 사용에 대한 것은 http://svnbook.red-bean.com/svnbook/ch03s06.html#svn-ch-3-sect-5.1http://svnbook.red-bean.com/svnbook/re15.html를 참고하기 바란다.

7. 잘못된 커밋을 복원하기

/trunk에 작업 복사본을 갖고 있으며, 개정 번호가 303으로 변경된 oyster.c 파일이 엉뚱한 파일이라는 것을 알았다고 하자. - 이 경우엔 커밋을 해서는 안되는 경우다. 이런 경우에는 작업 사본의 변경사항을 "복원"하기 위해 svn merge를 사용할 수 있다. 복원한 다음에 저장소에 변경 사항을 적용하기 위해 커밋할 수 있다.

$ svn merge -r 303:302 http://svn.example.com/repos/calc/trunk
U oyster.c

변경사항이 올바른지 검증하기 위해 svn diff를 사용한 다음에 저장소에 commit 할 수 있다.

보다 자세한 사항은 Undoing Changes를 참고하기 바란다.

8. 삭제된 항목 복원하기

Subversion 저장소에서 삭제했던 파일을 최근 저장소에 다시 "복원"하는 가장 쉬운 방법은 작업 복제본에서 삭제될 때의 개정번호에서 svn copy를 사용하여 복사하는 것이다. 파일이 삭제될 때의 개정 번호를 알기 위해 svn log -v를 사용한다.

$ svn copy --revision 807 \
http://svn.red-bean.com/repos/trunk/perch.c ./perch.c
보다 자세한 것은 Resurrecting deleted items를 참고한다.

9. 새 작업 복사본 없이 branch 변경하기

CVS에서는 작업 사본이 있으면서 branch에 대해 작업 하려면 개정 번호로 branch 이름을 사용할 수 있다. 그러나 Subversion에서는 태그와 branch를 저장소의 경로로 인식하기 때문에 svn update시 작업사본에 branch 이름을 사용할 수 없다. 대신에 svn switch 명령을 사용해야 한다.

svn switch는 저장소의 새 트리를 반영하기 위해 작업 사본을 업데이트 한다. ? 여기서 tree는 trunk 트리가 아니라 branch 트리를 의미한다. Subversion은 switch를 사용하여 작업 사본을 새 branch로 변경시킨다.

$ svn switch http://svn.red-bean.com/repos/branches/vendors-with-fix .
U myproj/foo.txt
U myproj/bar.txt
U myproj/baz.c
U myproj/qux.c
Updated to revision 31.
보다 자세한 것은 Switchting a working copy를 참고한다.

10. 저장소 검색하기, 마운트하기!!

Apache HTTP 서버를 사용하여 Subversion 저장소를 이용할 수 있다면 Subversion은 다양한 편의를 제공한다.

첫번째로 Subversion 저장소를 보기 위해 웹 브라우저를 사용할 수 있으며 저장소에 있는 최근 버전을 이용할 수 있다.

그림1

두번째로 DAV 공유를 할수 있는 운영체제를 사용하고 있다면 Subversion 저장소를 데스크탑에 읽기전용으로 마운트 할 수 있다.

그림2

그림3

이러한 방법은 저장소의 내용을 편리하게 살펴볼 수 있으며, Subversion을 이용하지 않는 사용자와 파일도 공유할 수 있다.
TAG :
댓글 입력
자료실