젊은이들은 타산적일 만큼 많이 알지 못한다. 바로 그러니까 젊은 세대는 노상 불가능한 일에 도전하며 그것을 이룩한다. ―펄 벅
Contents
- 1 개요
- 2 용어해설
- 3 신규 모듈을 시작하기
- 4 CVS로 부터 신규 모듈을 얻기
- 5 CVS로부터 다른 개발자의 수정사항을 얻어내기
- 6 충돌(Conflict)를 해결하기
- 7 CVS로 수정된 사항을 전송하기
- 8 변경사항 확인하기
- 9 태그 추가하기
- 10 화일/디렉토리를 추가하기
- 11 화일/디렉토리를 제거하기
- 12 화일/디렉토리를 이동 혹은 이름변경하기
- 13 브랜치 생성
- 14 작동중인 브랜치 선택하기
- 15 브랜치로 부터 병합하기
- 16 메인 개발 라인으로 복귀하기
- 17 누가 화일을 수정하고 있지?
- 18 부록 A: FAQ
- 19 부록 B : CVS와 Microsoft Visual Source Safe와 다른 점은 무엇인가?
1 개요 #
이 문서는 wincvs 클라이언트를 매일 사용하는 데 있어 참고사항들을 정리한 것이다. 버젼 관리시스템과 CVS에 대한 소개글이 아니며, 상당히 개략적인 설명만을 담고 있다.
이미 wincvs를 설치해 놓았다고 간주할 것이며, cvs 저장소에 대한 설정을 끝마친 상태라고 생각하도록 하겠다.
2 용어해설 #
cvs나 wincvs상에서 사용되는 용어들은 다른 소스저장시스템과는 다소 다를 수 있다. 혼란을 피하기 위해서 이 섹션에서는 가장 핵심적으로 사용되는 용어들에 대해 논하도록 한다. cvs를 사용하는 데 있어서는 다음과 같은 용어들에 익숙해질 필요가 있다.
| Checkout | 보통 저장소로부터 전체 모듈을 받는 작업을 말함. |
| Commit | 저장소로 수정사항을 전송하는 것. |
| Export | Refers to extraction of an entire module from the repository, without any CVS administrative files: export된 모듈은 cvs 제어를 받지 않는다. |
| Import | 전체 디렉토리 구조를 전송함으로써 저장소에 새로운 모듈을 생성하는 것. |
| Module | 디렉토리 계층. 프로젝트는 일반적으로 저장소내에 단 하나의 모듈로서 존재하는 것이 보통이다. |
| Release | 전체 프로젝트의 버젼. |
| Revision | 한개의 화일에 대한 버젼. |
| Tag | 개발상의 특정 시점을 나타내는 화일들의 집합에 주어지는 문자열(명칭). |
| Update | 저장소로부터 다른 개발자들의 수정사항을 얻는 것. 단지 개발자 개인 PC로의 지역복사만을 갱신한다. |
"revision", "release", "version", "tag"에 대한 더욱 자세한 설명은
CVS문서의 4장을 참조해라.
3 신규 모듈을 시작하기 #
버전관리하의 프로젝트를 얻는 것은 CVS용어로 import한다고 말한다. As the name implies, you should have something for the CVS server to import before thinking version control.
cvs는 프로젝트 화일들을 재구성하는데 필요한 기능지원이 부족하므로, 신규 모듈을 import 하기 전에 관리계획을 잘 세운다면 import하는데 있어서 발생할 수 있는 골치아픈 일들을 줄일 수 있을 것이다.
import 명령을 하기전에 기본적인 것은 import할 모듈을 "깨끗한" 디렉토리 구조로 만드는 것이다. "깨끗하다"는 의미는 모듈내에 버젼관리를 하지 않아도 되는 화일들(예를 들면 컴파일러가 생성하는 화일들)이 모두 제거된 상태를 의미한다. 이것은 import전에 프로젝트가 어느정도 진행되었을 경우라면 특히 중요한 일이다. 여러분의 모듈에서 버젼관리를 받지 않아도 되는 화일들을 가지고 있을 수 있고, 이 화일들이 어쨌든 계속 사용될 수도 있다. 이런 경우에는 이 화일들을 import 전에 다른 곳에 옮겨놓았다가, import한 후 다시 되돌려 놓아야만 한다.
cvs는 빈 디렉토리를 존재하지 않는 것으로 간주한다는 것에 주의해라. 만일 화일이나 서브디렉토리가 없는 텅빈 디렉토리를 추가하려고 한다면, 더미 화일을 하나 만들어 놓을 필요가 있다. 일반적으로 이 디렉토리에 대한 설명등을 기술한 README.txt 같은 화일을 넣는 것이 관례이다.
한번에 저장소안에 원하는 화일들을 담고있는 디렉토리를 가지려면, wincvs를 사용해서 모듈을 import하기 위해 다음 단계대로 실행해라 :
- Admin -> Import module 메뉴를 선택한다.
- 화일대화상자가 나타나면, import하기를 원하는 프로젝트의 최상위 디렉토리를 선택해라.
- wincvs는 이제 지정한 디렉토리내의 모든 화일들을 훑게될 것이다. 필터 윈도우가 나타나면, 확장자별로 text/binary 설정을 지정하라.
- import 설정 대화상자에서는 모듈의 이름을 입력한다. 이것은 이 프로젝트에 있어서 개발자들이 채크아웃하는 최상위 디렉토리가 된다.
- vendor란에는 등록자의 이름이나 id, 회사명중 하나를 넣는다. (공백문자 금지)
- release란에 start라고 적는다.
- OK 버튼을 선택한다.
- 소스의 원본을 따로 보관해둔다. 예를 들면, 디렉토리의 이름을 .old같은 것을 붙여서 rename하는 것도 좋은 방법이다.
- 별도의 지역 디렉토리를 만들고 채크아웃을 하여 cvs로 부터 초기버젼이 설정된 프로젝트를 받아놓는다.
- "중요하지않은" 화일은 디렉토리 바깥에 이동해놓는다.
4 CVS로 부터 신규 모듈을 얻기 #
처음 CVS 서버로 부터 모듈을 얻는 작업을 CVS에서는 채크아웃이라고 한다. 저장소로부터 모듈을 채크아웃한다는 것은 모듈을 구성하는 디렉토리 트리 전체의 지역 복사본을 생성하는 것을 의미한다. 채크아웃을 실행하려면, 다음과 같이 실행한다:
- CVS Admin 메뉴를 선택하여 Checkout module 메뉴를 선택한다.
- In the file dialog that pops up, choose the directory in which you want the module to be located. A directory named after the module will be created in the directory you supply, so you will normally want to provide the directory in which you keep all your projects.
- 채크아웃 설정 대화상자가 나타난다. "Enter the module name..." 필드에 모듈명을 입력한다. 모듈명은 대소문자구분이 있다는 것에 주의해라.
- Globals 탭을 선택하라.
- Set the Checkout read-only according to what the project leader tells you (see below).
- Press the OK button.
5 CVS로부터 다른 개발자의 수정사항을 얻어내기 #
때로는 다른 사람이 작업해놓은 변경사항만을 여러분의 지역복사본에 병합시키기위해 가져오고 싶을 때가 있을 수도 있다. 지역복사본으로 현재 서버로부터 변경사항을 가져오는 것을 CVS에서는 갱신(Update)라고 한다. 갱신작업은 단일 화일이나 선택된 여러개의 화일 묶음, 하위디렉토리까지 포함한 특정 디렉토리가 될 수도 있다. 갱신작업을 수행하려면 다음단계를 밟아라.
- update하기위한 디렉토리나 화일(들)을 선택해라.
- 선택된 부분에서 오른쪽 버튼을 눌러서 "Update selection"을 선택한다.
- "Create missing directories that exist in the repository" 옵션이 채크되어 있도록 설정한다.
- OK 버튼을 선택한다.
업데이트 동안에 만약 충돌에 대한 메세지를 받았다면, 다음 장을 읽어보도록 해라.
6 충돌(Conflict)를 해결하기 #
간혹가다가 CVS서버는 화일을 update 하는 도중에 충돌메세지를 나타낼 때가 있다. 충돌은 한명이상의 개발자가 저장소의 동일한 화일의 동일한 부분을 변경했을때 발생한다. CVS서버는 버젼관리만 할 뿐, 프로젝트에 대해 관여하지는 않으므로, 이 충돌은 개발자들이 풀 수 있도록 그냥 내버려두게된다. 충돌이 일어나면, 해당화일을 열어서 <<<<<<< 문자열을 우선 찾아라. 충돌 부분은 다음과 같이 표시된다.
<<<<<<< filename
현재 개발자가 고친 부분
=======
저장소로부터 합쳐진 부분
>>>>>>> revision
저장소에서 넘어온 코드와 자신이 수정한 코드를 비교해서 알맞은 수정을 가해라. CVS 서버가 표시해놓은 문자열을 지우고, 저장소에 수정한 내용을 commit하면 된다.
7 CVS로 수정된 사항을 전송하기 #
개발자가 개인적으로 수정한 내용을 저장소에 반영하려면, commit이라는 명령을 사용한다.
- commit하기전에, update를 실행해서 수정한 화일들에 대한 충돌이 없는지 찾아봐라. "CVS로부터 다른 개발자의 수정사항을 얻어내기"를 참조해라.
- commit처리할 디렉토리나 화일(들)을 선택해라.
- 마우스 오른버튼을 클린한후, 나타나는 메뉴에서 "Commit selection"을 선택해라.
- commit settings 대화상자가 나타나면, 로그메세지를 입력한다. 이것은 옵션사항이며, 변경사항을 차후에 log를 통해 빨리 확인하려면 적어놓는 것을 추천한다.
- ok 버튼을 누른다.
8 변경사항 확인하기 #
wincvs는 화일(들)이나 디렉토리의 상태, 로그기록, 변경점 검사등등을 열람하는데 사용될 수 있다.
- 세부사항을 검사하고싶은 디렉토리나 화일(들)을 선택한다.
- 오른쪽 마우스 버튼을 클릭해서 "Diff selection", "Log selection", "Status selection", "Graph selection"중 하나를 선택한다.
- 만일 대화상자가 나타나면, 필요한 옵션을 지정하고 OK를 선택한다.
| Diff | 현재 지역 하드디스크에 저장되어있는 화일과 이전 버젼 혹은 현재 저장소에 있는 화일과의 변경점을 보여준다. (이 CVS의 가장 핵심기능일 것이다.) |
| Log | 로그 메세지나 수정날짜, 태그, 수정작업자명등등을 보여준다. |
| Status | 지정한 화일들의 수정사항의 요약상태를 보여준다. 이상태에서 diff나 log명령을 바로 실행할 수도 있다. |
| Graph | 하나의 화일에 대한 수정단계를 그래프형태로 보여준다. |
9 태그 추가하기 #
At a given stage of development, giving one or more files a common label to refers to their revisions, is known as tagging those files. Tagging is typically used on entire modules, so that the current state of the module can be reconstructed in the future. This kind of tagging should always be done on project deliverables, and before starting major changes.
To tag one or more files or directories with a label, do the following:
- Select the directory, file or files that you want to tag.
- Click the right mouse button on the selction, and choose the Tag selection -> Create a tag menu item.
- Enter the label in the New tag name input field. (See below for restrictions on tag names.)
- Press OK button.
10 화일/디렉토리를 추가하기 #
저장소에 추가하기를 원하는 신규 화일들을 CVS 서버상에 추가하고자 할 때는, CVS 서버에 반드시 등록을 해주어야한다. 만약 CVS 제어하에 있지 않은 화일들을 디렉토리가 담고 있다면, 그 화일에 대한 작업 이전에 그 화일을 등록시켜야 버젼관리에 대한 효과를 볼 수 있다. 화일이나 디렉토리를 추가하려면 다음과 같은 단계를 밟아준다.
- 추가하고자 하는 디렉토리나 화일(들)을 선택한다.
- 선택한 곳에서 오른쪽 버튼을 눌러 나타나는 메뉴상에서, "Add selection" 또는 "Add selection binary" 메뉴를 선택한다. text화일이 아닌 경우에는 binary를 선택하는 것이 좋다. 아니면 CVS에 의해 화일이 깨질 가능성이 있다!
- 추가된 화일들은 수정되었다는 표시가 되어있을 뿐이다. 이것을 저장소에 완전히 추가하려면, commit 명령을 실행해라.
- "Cvs Admin" -> "Import module" 메뉴를 선택한다.
- 화일 대화상자가 나타나면, import할 디렉토리를 선택한다. (선택하면 열려져있는 폴더 상태로 아이콘이 변한다.)
- wincvs는 이제 디렉토리 트리내에 있는 화일들중 이진(binary)화일들을 식별하려할 것이다. filter 윈도우가 나타나면, 정확한 text/이진 설정을 화일 확장자별로 선택해준다.
- "Import settings" 대화상자가 나타나면, 디렉토리명을 포함한 모듈명을 적어넣어라. 만약 모듈명이 "myproject"라고 하고 "source/utils" 에 해당하는 내용을 import하려한다면, "Select the module name..." 입력란에는 "myproject/source/utils"라고 적어넣으면된다. 대소문자구분을 한다는 것과 \이 아닌 /를 사용한다는 것in the Select the module name... input field.
- Type your name, or your company name (no spaces) in the Vendor tag field.
- Type start in the Release tag field.
- OK button을 누른다.
- Move your original hierarchy away, eg. by renaming the directory you just imported to *.old using Windows' file explorer.
- In wincvs, select the directory above the one you just added. Right click on it, and choose Update selection.
- Make sure Create missing directories that exist in the repository is checked.
- Press the OK button.
11 화일/디렉토리를 제거하기 #
To remove files, you first schedule the files for removal, and then commit the change:
- Select the file or files that you want to remove.
- Click the right mouse button on the selction, and choose the Remove selection menu item.
- As the files are only marked for removal, you have to commit them to remove them from the repository. See Sending Your Changes to CVS if you don't know how to commit.
Removing directories is another story. CVS will optionally remove empty directories when you update one of its parent directories. If you want to get rid of an empty directory, do the following:
- Select the parent directory of the empty directory you want to remove.
- Click the right mouse button on the selction, and choose the Update selection menu item.
- Select the Globals tab.
- Make sure Prune (remove) empty directories is checked (it is by default).
- Press the OK button.
12 화일/디렉토리를 이동 혹은 이름변경하기 #
Operation of moving or renaming files or directories is not available in CVS. This is one of CVS's shortcomings. To simulate moving or renaming, you have to combine remove and add operations. See Adding Files and Directories and Removing Files and Directories.
13 브랜치 생성 #
버전 콘트롤 시스템의 기능중 하나는 개발선상에서 변경사항을 고립시키는 기능이다. 이 별도로 생성된 개발선을 브랜치라고 한다.
브랜치를 생성하려면 다음과 같이 실행한다:
- 브랜치를 생성하기를 원하는 디렉토리나 화일들을 선택한다.
- Modify 메뉴에서 Create a Brench를 선택한다.
- New branch name 항목에 테그명을 적는다. 적법한 테그명을 적어야한다는 것에 주의해라..
- Check that the files are unmodified before branching 옵션을 켠다.
- OK 버튼을 선택한다.
14 작동중인 브랜치 선택하기 #
기본 개발선대신에 브랜치상에서 작업을 시작하려면, 여러분의 프로젝트 지역 복사본을 해당 브랜치와 바인딩 해야만 한다. 이것은 update나 commit과 같은 명령때문에 확실하게 지정이 되어야한다. 가급적이면 주 개발선보다는 브랜치에서 개발하는 것을 추천한다.
다른 브랜치로 지역 복사본을 옮기려면 다음과 같이 실행한다 :
- 프로젝트의 최상위 디렉토리를 선택한다. (만약 디렉토리들과 화일들이 브랜치의 일부라는 것을 여러분이 알고 있다면, 대신에 이것들을 선택해도 무방하다.)
- 오른 버튼 메뉴를 불러서 Update selection 메뉴를 선택한다.
- Create missing directories that exist in the repository 옵션을 채크한다.
- Sticky options 탭을 선택한다.
- Retrieve rev./tag/branch 채크박스를 켠다.
- Retrieve rev./tag/branch 입력항목에서 변경하고자 하는 브랜치명을 넣는다.
- OK를 선택한다.
CVS는 브랜치에 의해 영향받은 화일들에 sticky 테그로 알려진 것을 적용한다. status 명령들을 사용하여 이 sticky 테그들을 열람하는 것이 가능하다. sticky 테그를 제거하고 원래의 개발선 상으로 복귀하는 것은 "메인 개발라인으로 복귀하기"를 참조하라.
15 브랜치로 부터 병합하기 #
브랜치상에서 변경한 내용들에 만족했을 경우, 여러분은 이 변경사항들을 주 개발라인에 적용하려고 할 수 도 있다. 하나의 브랜치에서 다른 브랜치로 변경사항을 합치는 작업을 병합(merging)이라고 한다. 브랜치를 병합하기 위해서 다음을 따라해라.
- 병합하려는 브렌치의 지역 복사본을 현재 작업 지역복사본으로 지정해라. "작동중인 브랜치 선택하기"를 참조하라.
- 프로젝트의 최상위 디렉토리를 선택해라.
- 오른 버튼 메뉴를 불러서 Update selection 메뉴를 선택한다.
- Create missing directories that exist in the repository 옵션을 채크한다.
- Merge options 탭을 선택하라.
- Only this rev./tag 라디오 버튼을 선택하라.
- Only this rev./tag 입력항목에 병합하길 원하는 브랜치명을 넣는다.
- OK 버튼을 선택한다.
중요 주의사항 : 위에서 설명한 병합기능은 브랜치의 시작으로부터 변경점을 병합하려고 시도하게 된다. 만약 두번째로 이 병합기능을 수행하는 것이라면(가장 최근 병합이후의 브랜치상의 변경점을 병합하려는 것이라면) 시작점부터 병합하는 처리는 여러분이 원하는 것이 아닐 것이고 프로젝트는 곤란한 상태에 빠질 것이다. 이 문제를 피하기 위해서는, 여러분은 매번 병합때마다 새로운 테그명으로 브랜치를 하는 것이 필요하다.
16 메인 개발 라인으로 복귀하기 #
브랜치상에서 개발하는 것을 멈추고 주 개발라인으로 여러분의 지역 복사본의 내용을 변경하려면, wincvs로 하여금 모든 sticky 테그를 삭제해야만 한다. sticky 테그를 제거하고, 현재 지역복사본을 주 개발라인의 내용으로 바꿀려면 다음과 같이 실행해라.
- 프로젝트의 최상위 디렉토리를 선택해라.
- 오른 버튼 메뉴를 불러서 Update selection 메뉴를 선택한다.
- Create missing directories that exist in the repository 옵션을 채크한다.
- Reset any sticky date/tag/'-k' 옵션을 채크한다.
- OK 버튼을 선택한다.
17 누가 화일을 수정하고 있지? #
It is possible to ask CVS who is currently editing a file, but it only works if the developers announce to CVS when they intend to edit a file. This model is known as the IR CVS model (well, that's actually an internal joke at Computas), and it should be decided at project startup if this model is to be used.
To use the IR CVS model, developers should check out the module read only. It can be done by checking Checkout read-only in the Globals tab of every wincvs dialog.
To edit a file, do the following:
- Select the file you want to edit.
- Click the right mouse button on the selction, and choose the Monitors selection -> Edit selection menu item. (Alternatively, use the shortcut in the toolbar.) The read-only flag will be removed, and the CVS server registers you as an editor of the given file.
- Edit the file.
- Commit the file as described in Sending Your Changes to CVS.
- Select the file you marked for editing.
- Click the right mouse button on the selction, and choose the Monitors selection -> Unedit selection menu item. (Alternatively, use the shortcut in the toolbar.)
- Select the file you are curious about.
- Click the right mouse button on the selction, and choose the Monitors selection -> Editors of selection menu item.
19 부록 B : CVS와 Microsoft Visual Source Safe와 다른 점은 무엇인가? #
CVS와 wincvs는 Visual Source Safe (VSS)와 여러가지 면에서 다르다. 가장 명백한 차이점은 작업중인 화일들을 잠글 필요가 없다는 것이고, VSS는 기본적으로 이 기능을 수행한다는 것이다. 사실, CVS 문서조차도 화일 잠금을 사용하지 말 것을 권장하고 있다. 몇몇 작업자들이 동시에 같은 화일을 변경하는 일은 매우 드문 경우이기 때문에, CVS는 일반적인 방법으로 이들의 변경점들을 병합한다. 만약 둘 이상의 작업자들이 같은 몇 라인의 같은 소스부분을 수정했다면, CVS는 충돌(conflict)을 보고할 것이고, 화일내에 그 위치를 추가할 것이며, 그 부분에 대한 결정을 작업자들의 몫으로 돌리게 된다. 이런 충돌은 매우 드문일이며, 주로 개발자들의 대화부족으로 일어나는 것이 보통이다. (예를 들면, 두 개발자가 같은 버그를 고치고 있는 경우를 들 수 있다).
또다른 중요한 차이점은 VSS는 프로젝트를 서버의 관점에서 보며, cvs는 클라이언트 관점에서 본다는 점이다. 실전에서 이것은 VSS와는 달리, wincvs는 update를 하거나 지정한 화일들에 대한 확실한 질의를 하지 않으면 저장소의 변경사항을 알려주지 않는다는 것이다. wincvs내에 보고된 변경사항은 가장 최근에 checkout, update, commit을 했을 경우에만 여러분이 수행한 변경점들을 반영한다.
CVS는 VSS처럼 "비쥬얼"하지 않다. wincvs를 사용하면, CVS가 지난 몇년동안 커맨드 라인 기반의 프로그램이었고 wincvs는 그것을 사용하기 쉽게 포장한 것에 지나지 않다는 것이 아주 명백히 드러난다. 우리들 중의 몇몇은 경험적으로 숙련된 사용자들이 선호하는 방식인 wincvs의 이런 단순한 접근을 선호하며, 몇몇은 아주 싫어한다. 여러분이 싫어하는 쪽에 속한다면, 이 프로그램을 개선해보고 여러분의 변경점을 모두에게 배포하기 바란다.








