이클립스에서 CVS를 이용한 버전관리

프로젝트 공유

프로젝트를 CVS에 올리는 것을 이클립스에서는 프로젝트 공유라 한다. 프로젝트를 공유하는 방법은 간단하다. 패키지 탐색기에서 공유하고자 하는 프로젝트를 선택해 컨텍스트 메뉴를 띄운 다음 Team>Share Project 메뉴를 이용하면 된다. Share Project 메뉴를 선택하면 아래와 같이 CVS 리포지터리 위칠르 묻는 대화상자가 뜬다.

사용자 삽입 이미지
대화상자의 입력하는 부분은 크게 Location, Authentication, Connection으로 나뉘어 있다. Location에는 CVS 서버가 위치한 호스트 이름과 리포지터리 패스(CVSROOT)를 입력한다. Authentication에는 사용자 ID와 패스워드를 입력한다. Connection에서는 연결 타입과 포트를 설정한다. 내용을 입력한 후 Next 버튼을 누르면, 모듈 이름을 묻는 페이지가 나오는데, 디폴트로 프로젝트 일므을 모듈 이름으로 사용하겠다는 라디오 버튼이 선택되어 있다. 다시 Next 버튼을 누르면 아래와 같은 페이지가 나온다.

사용자 삽입 이미지
여기서 CVS에 올릴 리소스를 확인할 수 있다. 프로젝트 바로 밑에 있는 bin 디렉터리도 CVS로 올라가는 것으로 되어 있는데, bin 디렉터리는 소스 코드를 컴파일한 결과가 저장되는 곳이므로 CVS에 올릴 필요가 없다. bin 디렉터리를 마우스로 선택한 다음 컨텍스트 메뉴를 띄워 Add to .cvsignore를 선택하면 bin 디렉터리를 CVS가 무시하도록 할 수 있다.

대화상자의 내용을 살펴보면 CVS에 올릴 리소스에 .cvsignore 파일이 추가되어 있는 것을 확인할 수 있는데, 이는 CVS에서 무시할 리소스를 설정했을 때 .cvsignore란 이름의 파일이 생성됐기 때문이다. 이 파일은 CVS에 함께 올려 놓는 것이 편리하다.

 

Finish 버튼을 누르면 주석을 입력할 수 있는 대화상자가 나온다. 처음 올리는 것이라 특별히 붙일 것이 없으므로 그냥 확인 버튼을 누르면 리소스가 CVS로 올라가고, 패키지 탐색기에서 프로젝트의 모양이 아래 그림과 같이 바뀐다.사용자 삽입 이미지

이제 다른 사람도 자신의 PC에서 이 프로젝트를 체크아웃하여 동시에 작업할 수 있게 되었다.

  • 레이블 데코레이션

CVS로 공유하지 않은 다른 프로젝트와 달리 CVS로 공유한 프로젝트는 아이콘 모양도 약간 다르고 자바 파일 옆에도 리비전 번호가 붙어 있는 것을 볼 수 있다. Preference 대화상자의 왼쪽 트리에서 Team>CVS>Label Decorations를 선택하면 CVS와 관련된 데코레이션을 더욱 세세하게 지정할 수 있는 페이지가 나온다. 여기서 아이콘, 레이블 텍스트 등을 마음에 들게 조정할 수 있다. 그리고 Preferences 대화상자의 왼쪽 트리에서 General>Appearance>Colors and Fonts를 선택하면 색상과 글꼴에 대해 다양한 설정을 할 수 있는 페이지가 나오는데, 이 페이지의 오른쪽 트리에서 CVS 항목을 선택하면 CVS 레이블에서 사용할 글꼴과 색상을 지정할 수 있다.


체크아웃

CVS에서 프로젝트를 체크아웃하는 방법도 그리 복잡하지 않다. 패키지 탐색기에서 컴텍스트 메뉴를 띄운 다음 Import 메뉴를 선택하면 Import 다이얼로그가 뜬다. 여기서 Checkout Projects from CVS 항목을 선택하고 Next 버튼을 누르면 다이얼로그 모양이 아래 그림과 같이 바뀐다. 다이얼로그 윗부분에 두 개의 라디오버튼이 보이는데, 첫 번째 버튼을 선택하면 새로운 리포지터리 위치를 등록할 수 있고, 두 번째 버튼을 선택하면 라디오 버튼 아래 나오는 항목 중 하나를 선택해 사용할 수 있다.

사용자 삽입 이미지

사용자 삽입 이미지사용자 삽입 이미지
위의 대화상자에서 Finish 버튼을 누르지 않고 Next 버튼을 누르면 워크스페이스 위치와 체크아웃할 태그를 지정할 수 있다.

체크아웃이 끝난 후 워크벤치의 오른쪽 아래 구석을 보면 느낌표가 붙어있는 조그만 아이콘이 생긴 것을 볼 수 있는데, 마우스를 대 보면 Show CVS Console이란 툴팁이 뜨고 아이콘이 버튼 모양으로 바뀐다. 이 버튼을 누르면 CVS 작업 결과가 Console 뷰에 표시된다.

사용자 삽입 이미지

커밋과 업데이트

커밋

소스 코드나 기타 리소스를 수정한 후 작업 결과를 CVS에 반영하려면 커밋을 해야 한다. CVS에서 체크아웃한 리소스를 수정하면 패키지 탐색기에 해당 리소스가 수정됐다는 표시가 나온다. 표시 형식은 앞에서 설명한 레이블 데코레이션 설정에 따라 다르게 보일 수 있다.

사용자 삽입 이미지

이 작업 결과를 CVS에 롤리려면 패키지 탐색기에서 해당 파일을 선택하고 컨텍스트 메뉴를 띄운 다음 Team>Commit 항목을 선택하면 된다. 수정한 리소스가 많을 때는 상위 폴더를 선택해 해당 폴더 내에 수정된 리소스를 한꺼번에 커밋할 수도 있다. 프로젝트를 선택한 다음 커밋을 실행하면 해당 프로젝트 내의 모든 수정된 리소스를 한꺼번에 커밋할 수 있다.

사용자 삽입 이미지
업데이트

CVS는 같은 모듈에 대해 동시에 여러 사람이 작업하는 것을 가능하게 하므로, 한 사람이 체크아웃을 한 이후에도 다른 사람이 작업한 결과를 CVS 리포지터리에 올릴 수 있다. 만약 체크아웃을 한 지 오래되어 CVS 리포지터리로부터 최신의 리소스를 다시 받아오고 싶은 경우에는 업데이트 기능을 사용하면 된다. 업데이트도 다른 CVS 기능과 마찬가지로 전체 프로젝트나 특정 디렉터리, 또는 특정 파일에 대해 실행할 수 있다.

충돌과 병합

CVS에 프로젝트를 공유하면 자신이 작업하는 중에 다른 사람도 같은 프로젝트를 수정할 수 있으므로 작업의 효율성이 증가하지만, 서로 다른 두 사람이 같은 리소스를 수정할 수 있으므로 이런 경우에 대한 해결책이 필요하다. 두 사람이 특정 리소스의 다른 부분을 수정한 경우에는 CVS가 알아서 병합을 할 수 있다. 그러나 같은 부분을 서로 다르게 수정한 경우에는 단순히 병합할 수 없으므로 충돌이 발생한다. 이 경우 어느 쪽의 리소스로 반영해야 할지를 CVS가 판단할 수 없으므로, 사람이 직접 문제가 되는 부분을 확인하고 어느 쪽 리소스를 사용할 지 판단해 수정해야 한다.

히스토리 보기

패키지 탐색기에서 컨텍스트 메뉴를 띄운 다음 Team>Show Resource History를 선택하면 CVS Resource History 뷰에서 해당 리소스의 히스토리를 볼 수 있다. 뷰의 테이블에서 각 버전을 더블 클릭하면 해당 버전의 내용을 바로 볼 수도 있고 두 버전을 선택한 다음 컨텍스트 메뉴를 띄워 Compare를 선택하면 간단하게 두 버전의 차이를 비교할 수 있다.

사용자 삽입 이미지

태그와 브랜치

태그(Tag)

패키지 탐색기에서 ?DummyChatter1 프로젝트를 선택하고 컨텍스트 메뉴에서 Team>Tag as Version을 선택하면 프로젝트에 속한 모든 리소스에 태깅할 수 있다. 메뉴를 선택하면 아래 그림과 같이 태그 이름을 입력할 수 있는 다이얼로그가 뜨는데 여기에 태그 이름을 입력한 후 확인 버튼을 누른다.

사용자 삽입 이미지

사용자 삽입 이미지
이렇게 태깅을 해 놓으면 태깅된 것을 따로 체크아웃할 수 있다. ?DummyChatter release-1-0을 선택한 후 체크아웃하면 된다. 체크아웃하는 방법은 메인 트렁크(HEAD)에서 하던 방법과 동일하다. CVS Repositories 뷰에서 ?DummyChatter release-1-0 노드를 선택한 다음 컨텍스트 메뉴를 띄워 Check Out As를 선택한다.

브랜치(branches)

릴리즈 1.0을 체크아웃하여 버그를 찾아내긴 했는데, 버그의 증상은 심각하지만 코드 몇줄을 수정하면 간단히 해결할 수 있다고 하자. 그러나 CVS에 있는 소스는 릴리즈 1.0 이후에도 계속 작업했기 때문에 여기에 직접 반영하는 것은 어렵다. 최근의 소스를 기반으로 해서 위의 버그만 수정한 릴리즈를 내는 것은 불가능하다. 바로 이런 경우에 브랜치를 사용하면 편리하다.

?DummyChatter release-1-0은 별도의 프로젝트로 체크아웃했으므로 수정하더라도 원래의 ?DummyChatter 프로젝트에는 영향을 미치지 않는다. 그러나 ?DummyChatter release-1-0 프로젝트에서 소스 코드를 수정한 다음 CVS에 커밋을 시도하면 어떻게 될까? ?ChatClient.java를 약간 수정한 다음 커밋해 보면, 해당 파일이 브랜치가 아니기 때문에 커밋할 수 없다는 에러가 발생하여 커밋에 실패한다. 따라서 수정사항을 반영하기 위해서는 먼저 브랜치를 만들어야 한다.

패키지 탐색기에서 ?DummyChat release-1-0 프로젝트를 선택한 다음 컨텍스트 메뉴에서 Team>Branch를 선택하면 아래 그림과 같은 대화상자가 뜬다.

사용자 삽입 이미지

여기서 브랜치 이름을 입력하고 확인 버튼을 누르면 CVS 리포지터리에 브랜치가 생긴다. CVS Repositories 뷰에서 아래 그림과 같이 브랜치가 보인다면 제대로 된 것이다. 브랜치 생성 다이얼로그에서 브랜치 이름 입력 텍스트필드 바로 밑에 Start working in the branch 체크박스가 있었는데, 이 체크박스에 체크해야 브랜치를 만든 다음 현재 프로젝트에서 새로 만든 브랜치로 작업할 수 있다. 이 체크박스에 체크해두지 않으면 브랜치를 다시 새로운 프로젝트로 체크아웃해서 사용해야 한다.

브랜치를 만들긴 했지만, 아직 작업이 끝난 것은 아니다. 수정한 내용을 브랜치에 커밋하는 작업이 남아 있다.

사용자 삽입 이미지
패치

패치를 이용하면 CVS에 커밋하지 않고도 자신이 변경한 내용을 다른 사람과 공유할 수 있다. 패치는 리포지터리에 있는 리소스와 워크스페이스에 있는 리소스의 차이를 담고 있다. 패치는 하나의 파일에 대한 차이를 담을 수도 있고, 프로젝트 전체에서 각각의 파일에 대한 차이를 담을 수도 있다. 패치는 Package Explorer의 컨텍스트 메뉴에서 Team>Create Patch를 선택해 생성할 수 있으며 결과를 파일이나 클립보드에 저장할 수 있다. 패치를 적용할 때는 컨텍스트 메뉴의 Team>Apply Patch를 사용한다. 패치를 생성할 때나 적용할 때 모두 위저드의 도움을 받을 수 있으므로 별로 어렵지 않게 작업할 수 있따.

오픈 소스 프로젝트의 경우 프로젝트의 소스 코드를 CVS로 누구나 체크아웃할 수 있지만, 수정 사항을 반영할 수 있는 권한은 제한된 사람들만 갖고 있다. 커밋 권한이 없는 경우에는 수정 사항에 대한 패치 파일을 만들어 이를 커밋 권한이 있는 사람에게 보낼 수 있다. 패치를 받은 사람은 프로젝트의 어떤 부분이 수정됐는지 확인한 다음 이를 CVS에 반영할지 결정할 수 있다.

삭제한 파일 복구

불필요할 것 같아 삭제한 다음 CVS로 커밋했는데, 나중에 삭제한 파일을 되살려야 하는 경우가 종종 있다. 파일을 삭제해 커밋하더라도 CVS가 파일을 리포지터리에서 삭제하는 것은 아니므로, 필요할 경우 되살릴 수 있다.

이런 경우에는 삭제한 파일을 포함하고 있던 상위 디렉터리를 선택한 다음 컨텍스트 메뉴를 띄워 Team>Restore from Repository를 선택하면 아래와 같은 대화상자가 뜬다.사용자 삽입 이미지

대화상자의 상단 왼쪽에는 되살릴 수 있는 리소스가 표시되고 여기서 되살리고자 하는 리소스를 선택하면 그 오른쪽 테이블에 해당 리소스의 히스토리가 표시되는데, 여기서 되살리고 싶은 리비전을 선택하면 아래쪽에 해당 리소스의 내용이 표시된다. 리소스의 히스토리가 표시되는 테이블의 각 행 앞에는 체크박스가 있는데, 되살리려는 리비전에 해당하는 체크박스를 선택하면 Finish 버튼이 활성화되며 Finish 버튼을 누르면 선택한 리소스의 선택한 리비전이 복구된다.

CVS Annotation 뷰

소스 코드의 특정 부분을 누가 수정했는지 보고 싶었던 경험이 있을 것이다. 패키지 탐색기에서 보고 싶은 파일을 선택한 다음 컨텍스트 메뉴에서 Team>Show Annotation을 선택하면 CVS Repository Exploring 퍼스펙티브로 전환되고 워크벤치 왼쪽에 CVS Annotation 뷰가 보인다.

CVS Annotation 뷰에는 누가 소스 코드를 수정했는지가 표시되고 목록에서 항목을 하나 선택하면 그 수정에 해당하는 소스 코드가 에디터에서 하이라이트되며, CVS Resource History 뷰에서 그에 대한 CVS 히스토리가 하이라이트된다.사용자 삽입 이미지

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다