본문 바로가기

Tools/CVS

CVS를 이용한 프로젝트 수행

초록

CVS를 사용한 개발 환경 설정 및 사용법에 대해 간략하게 설명한다.

CVS를 이용한 프로젝트 수행 절차

CVS를 이용하여 프로젝트를 수행하는 절차는 다음과 같다.

  1. 저장소를 초기화한다. (CVS 관리자)

  2. 프로젝트를 초기화한다. (프로젝트 관리자)

  3. 작업 공간을 마련한다. (개발자)

  4. 실제 작업 (개발자)

  5. 자신의 작업 내용을 저장소에 저장하고 다른 개발자의 작업 내용을 받아온다. (개발자)

1번은 처음 CVS를 설치할 때 한 번만 해 주면 되고, 2번은 새로운 프로젝트를 시작할 때마다 필요한 작업이다. 각 개발자는 3번을 수행한 후 4번과 5번 과정을 되풀이하며 작업을 진행하게 된다.

저장소 설정

초기화

CVS 를 사용하기 위해서 가장 먼저 할 일은 각 프로젝트의 파일들을 저장할 저장소(repository)의 위치를 정하는 것이다. 저장소를 이용할 프로젝트들의 규모를 고려하여 충분한 공간을 가진 디렉토리를 저장소로 쓰도록 한다. 저장소를 /home/CVS에 만들기로 했다면 다음과 같이 초기화할 수 있다.

# cvs -d /home/CVS init			

여 기서 -d는 저장소의 위치를 나타내며, 마지막의 init가 CVS 명령이다. 물론 이 명령을 사용하기 위해서는 /home에 쓰기 권한을 갖고 있어야 한다. 그러므로 대개의 경우 저장소의 초기화는 root 권한을 가진 씨스템 관리자가 하게 된다. 명령이 실행되고 나면 /home에 CVS란 디렉토리가 생기고, 그 안에는 CVSROOT란 디렉토리가 있을 것이다. 이 CVSROOT 디렉토리는 CVS의 각종 설정 내용을 담고 있는 디렉토리이다. 저장소(/home/CVS)의 파일들을 직접 건드리는 것은 절대로 피해야 한다. 이 파일들을 변경하고 싶다면 cvs 명령을 이용해야 한다.

환경 변수에 CVSROOT가 다음과 같이 설정되어 있을 경우, 위와 같은 결과를 볼 수 있다.

# export CVSROOT=/home/CVS# cvs init			

기본적인 사용 방법

CVS를 이용하는 모든 과정은 cvs 명령을 통해 이루어진다. cvs 명령의 기본 형식은 다음과 같다.

$ cvs [cvs 옵션] 명령 [명령 옵션과 인자]		

저장소 이용

모 든 CVS 명령은 저장소의 위치를 알아야 수행될 수 있다. 앞에서 본 저장소 초기화의 예에서도 init 명령을 사용하면서 -d 옵션으로 저장소의 위치를 알려 주고 있다. CVS의 다른 명령들도 같은 옵션으로 저장소의 위치를 지정할 수 있다. 또다른 방법은 CVSROOT라는 환경변수의 값으로 저장소의 위치를 주는 것이다. 예를 들어 저장소의 위치가 /home/CVS인 경우, sh이나 bash를 쓴다면 다음의 내용을 초기화 파일(.bash-profile 등)에 넣어 놓으면 편리할 것이다.

$ CVSROOT=/home/CVS$ export CVSROOT			

csh이나 tcsh을 쓴다면 다음과 같이 한다.

$ setenv CVSROOT /home/CVS			

이렇게 설정을 하고 나면 -d 옵션과 저장소의 위치를 매번 줄 필요 없이 바로 cvs 뒤에 원하는 명령을 주면 된다.

저장소와 개발자가 같은 기계를 쓸 경우

앞에서 저장소를 초기화한 것과 같은 경우이다. 같은 기계를 쓰기 때문에 저장소가 있는 디렉토리 이름을 주는 것으로 충분하다. 앞에서 만든 저장소에 CVS 명령을 내리려면 다음과 같이 한다.

$ cvs -d /home/CVS 명령				

암호 인증 방식 이용

암 호 인증 방식은 앞의 두 방식과는 달리 CVS 명령을 사용하기에 앞서 로그인을 해야 한다. CVS로 파일을 제공하는 공개 프로젝트들의 경우 홈페이지에서 'CVSROOT를 ...로 설정하십시오'라는 문구를 볼 수 있을 것이다. 이것이 바로 암호 인증 방식의 저장소 위치이다. cvs.webdox.co.kr이란 기계의 /home/CVS에 저장소가 위치하고 minskim이란 CVS 계정이 만들어져 있다면 다음과 같이 로그인할 수 있다.

$ cvs -d :pserver:minskim@cvs.webdox.or.kr:/home/CVS login				

일단 로그인을 하고 나면 인증 정보가 .cvspass란 파일에 저장이 되며, 이후로는 암호 없이 CVS 명령을 이용할 수 있다. 방법은 다음과 같다.

$ cvs -d :pserver:minskim@cvs.webdox.or.kr:/home/CVS 명령				

프로젝트 초기화

먼 저 할 일은 프로젝트의 이름을 정하는 것이다. 이 이름은 저장소에서 이 프로젝트 관련 파일들을 저장하는 디렉토리의 이름으로 쓰인다. 여기에서는 myprj란 이름으로 프로젝트를 만들어 보기로 하겠다. 이후에 나올 모든 예는 환경변수 CVSROOT가 제대로 설정되어 있다고 가정한다. CVSROOT를 어떻게 설정해야 하는가에 대해서는 4.1절의 내용을 참고하기 바란다.

myprj란 디렉토리가 다음과 같이 되어 있다고 하자.$ cd myprj$ lsHello.java     README			

저장소에 새 프로젝트를 만들고 이 두 파일을 저장하기 위해서는 import 명령을 사용한다. import 명령의 사용법은 다음과 같다. $ cvs import -m "메시지" 프로젝트이름 vender_tag release_tag

' 메시지'는 프로젝트를 시작하면서 저장소에 기록하고 싶은 내용을 적어주면 된다. CVS는 파일을 저장할 때마다 메시지를 적도록 하고 있다. 이 내용을 원하는 때에 다시 볼 수 있으므로 개발자가 어떤 작업을 했는지를 적어 놓으면 다른 개발자들이 파일의 변경 내용, 작업 진척 상황등을 파악하는데에 도움을 줄 수 있다. 뒤의 두 태그는 지금 단계에서는 별 의미가 없으므로 적당한 말을 써 주면 된다. myprj란 프로젝트를 저장소에 만들기 위해서는 다음 명령을 사용한다.

$ cvs import -m "프로젝트 시작" myprj webdox startN myprj/Hello.javaN myprj/READMENo conflicts created by this import			

앞 에 말했듯이 뒤의 두 단어는 별 의미가 없으므로 크게 신경쓰지 말기 바란다. 이 명령을 실행하면 CVS는 저장소에 myprj란 디렉토리를 만들고, 거기에 README와 Hello.java를 저장한다. 이 외에도 옵션으로 준 메시지와 각 파일의 부가적인 정보를 기록하게 된다. 출력되는 메시지를 보면 각 파일 이름 앞에 N이란 글자가 있는 것을 알 수 있다. CVS는 특정 명령 수행시에 파일별로 수행 결과를 나타낸다. N은 새로운 파일이 추가된 것을 의미한다. 이후의 예에서 다른 경우들도 보게 될 것이다. 마지막 줄에서 conflict란 현재 디렉토리에 있는 파일을 저장소에 저장하게 되면 어떤 이유로 이미 저장소에 있는 파일과 충돌을 일으키는 경우를 뜻한다. 다른 사람이 작업해서 저장소에 저장해 놓은 것을 덮어쓰려 한다거나 하는 경우인데, 자세한 것은 뒤에서 conflict가 발생하는 경우를 예로 들어 설명하겠다. 여기에서는 저장소에 아무 파일도 없으므로 충돌(conflict)이 생기지 않는 것이 당연하다.

프로젝트 진행

작업 공간 생성 (checkout)

작 업을 시작하기 위해서는 파일을 마음대로 변경하고 저장하여 테스트해 볼 수 있는 작업 공간이 필요하다. 저장소에 있는 파일들을 불러와 나만의 작업 공간을 만드는 명령이 checkout이다. 앞에서 만든 myprj를 checkout 명령으로 불러 오자.

  $ cvs checkout myprj  cvs checkout: Updating myprj  U myprj/Hello.java  U myprj/README				

checkout 대신 co만 써 주어도 된다. 앞에 붙은 U는 파일이 갱신(update)되었음을 의미한다. 명령을 수행하고 나면 현재 디렉토리에 myprj란 디렉토리가 생긴다. 이 디렉토리가 바로 작업 공간이다. 이 안에서 필요에 따라 파일들을 수정하고, 이를 다시 저장소로 저장하면 되는 것이다. 그러면 디렉토리 안에는 어떤 파일들이 들어 있을까?

$ cd myprj$ lsCVS    Hello.java    README				

프 로젝트를 초기화할 때 있던 파일들이 그대로 들어 있는 것을 볼 수 있다. 하지만 하나 달라진 것이 있다. CVS란 디렉토리가 바로 그것이다. 바로 이 디렉토리에 CVS가 파일들을 관리하는데에 필요한 정보가 기록된다. 예를 들면 각 파일들의 버젼, 최종 수정 시각, 저장소의 위치 등이 이에 속한다. 앞으로 여러 CVS 명령들을 사용하게 되는데, 그때마다 CVS는 이 디렉토리의 정보를 참고하여 각 명령을 수행한다. 하지만 개발자가 이 디렉토리의 내용에 신경쓸 필요는 전혀 없다. 관심이 있다면 살펴보는 것은 좋지만, 내용을 임의로 변경한다거나 해서는 안 된다.

작업 내용의 저장 (commit)

만들어진 작업 공간에서 작업을 시작해보자. Hello.java의 내용이 다음과 같다고 하자.

public class Hello {    public static void main(String args[]) {    }}				

여 기에 인사말을 출력하는 부분을 추가해보자. 아무 편집기로나 파일을 열어 작업하면 된다. CVS를 사용한다고 해도 특별한 에디터나 통합 개발 환경을 필요로 하지는 않는다. Hello.java에 '안녕하세요?'라고 출력하는 문장을 추가했다고 하자.

public class Hello {    public static void main(String args[]) {        System.out.println("안녕하세요?");    }}				

컴파일을 해서 실행을 해 보고 예상대로 실행된다면 이제 작업 내용을 저장소에 저장해야 한다. 그래야 다른 개발자들도 인사말이 추가되었다는 것을 알게 될 것이다. 파일의 변동 사항을 저장소에 저장하는 명령은 commit이다.

$ cvs commit -m "인사말 추가" Hello.javaChecking in Hello.java;/home/CVS/myprj/Hello.java,v  <--  Hello.javanew revision: 1.2; previous revision: 1.1done				

어 떤 명령인지 쉽게 이해할 수 있을 것이다. -m은 앞의 예와 마찬가지로 메시지를 의미한다. 이 명령으로 Hello.java는 '인사말 추가'란 메시지와 함께 저장소에 저장된다. 그렇다고 이전의 Hello.java가 없어지는 것은 아니다. CVS는 각 버젼의 변경 내용을 파악하여 언제라도 개발자가 원하는 버젼을 꺼내 줄 수 있도록 파일들을 저장한다. 출력 결과를 보면 원래 있던 Hello.java는 1.1이고, 새로 저장된 Hello.java는 1.2임을 알 수 있다. 이 번호는 CVS가 자동으로 붙이는 것이며 변경 사항이 저장될 때마다 올라가므로 각 파일마다 다를 수 있다. 나중에 특정 버젼이 필요하다면 이 번호를 이용해서 불러 오면 된다.

이름은 생략할 수 있다. 파일 이름을 주지 않으면 CVS가 변경된 파일을 모두 찾아 저장소에 저장한다. 이때 저장되는 모든 파일에는 같은 메시지가 붙게 된다. 하지만 파일마다 다른 메시지를 붙이고 싶다거나 특정 파일의 변경 내용만을 저장하고 싶다면 위의 예처럼 파일 이름을 명시해 주어야 한다.

저장소의 파일 받아오기 (update)

$ cvs updatecvs update: Updating .				

현 재 작업 공간에 있는 파일들이 저장소에 있는 파일과 모두 동일하면 위와 같이 별다른 출력 없이 끝날 것이다. 그렇다면 작업 공간에 있는 파일을 수정하고 commit을 하지 않은 상태라면 어떤 결과가 나오는지 보기 위해 Hello.java를 다음과 같이 수정해보자.

public class Hello {    public static void main(String args[]) {        System.out.println("안녕하세요?");        System.out.println("반갑습니다.");    }}				

원래의 파일에 "반갑습니다."를 출력하는 문장을 추가하였다. 이제 update 명령을 실행하면 다음과 같이 나올 것이다.

$ cvs updatecvs update: Updating .M Hello.java				

파일 이름 앞에 있는 영문자(이 경우는 M)가 각 파일별 상태를 알려준다. M은 파일이 변경된(modified) 상태임을 의미한다. 즉, 파일의 내용이 원래 저장소에 있는 것과 달라졌을 때 M을 써서 표시하게 된다.

작업 공간의 파일이 달라질 수 있는 또 다른 경우는 다른 사람이 파일을 변경하여 commit 명령으로 저장소에 저장한 경우이다. 예를 들어 원래의 README 파일이 다음과 같았다고 하자.

  $ cat README  이 파일은 매우 중요한 내용을 담고 있습니다.				

그런데 다른 개발자가 README 파일을 다음과 같이 변경하여 저장소에 저장하였다.

$ cat README이 파일은 매우 중요한 내용을 담고 있습니다.1999년 12월 11일$ cvs commit -m "날짜 추가" READMEChecking in README;/home/CVS/myprj/README,v  <--  READMEnew revision: 1.2; previous revision: 1.1done				

이제 내가 update를 하면 다음과 같은 결과를 볼 수 있다.

$ cat README이 파일은 매우 중요한 내용을 담고 있습니다.$ cvs updatecvs update: Updating .M Hello.javaU README				

README 앞에 붙은 U는 파일이 갱신된(updated) 것을 의미한다. 이제 내 작업 공간의 README가 저장소에 저장된 내용과 같게 갱신된 것을 볼 수 있다.

$ cat README이 파일은 매우 중요한 내용을 담고 있습니다.1999년 12월 11일				

그 렇다면 이 두 경우가 혼합된 경우는 어떤 일이 발생할까? 즉, 다른 개발자가 수정하여 저장소에 저장한 파일을 나 역시 수정한 후 update를 하는 경우이다. 다른 개발자가 Hello.java를 다음과 같이 main 함수 앞에 주석을 한 줄 추가하여 commit을 했다고 생각해보자.

$ cat Hello.javapublic class Hello {    // main 함수    public static void main(String args[]) {        System.out.println("안녕하세요?");    }}$ cvs commit -m "주석 추가" Hello.javaChecking in Hello.java;/home/CVS/myprj/Hello.java,v  <--  Hello.javanew revision: 1.3; previous revision: 1.2done				

그런 다음 내가 update를 하면 다음과 같이 된다.

$ cat Hello.javapublic class Hello {    public static void main(String args[]) {        System.out.println("안녕하세요?");        System.out.println("반갑습니다.");    }}$ cvs updatecvs update: Updating .RCS file: /home/CVS/myprj/Hello.java,vretrieving revision 1.2retrieving revision 1.3Merging differences between 1.2 and 1.3 into Hello.javaM Hello.java				

여 기서 update 명령은 현재 디렉토리의 Hello.java는 1.2에서 수정된 상태이고, 저장소에 있는 Hello.java는 1.3이기 때문에 저장소의 내용을 가지고 1.2와 1.3의 차이를 파악하게 된다. 그 차이가 한 줄이 추가된 것임을 발견하고 나면 그 차이를 현재 디렉토리의 Hello.java에 반영한다. 하지만 Hello.java에는 "반갑습니다."를 출력하는 줄도 들어 있기 때문에 여전히 저장소에 있는 파일과는 다른 상태이다. 따라서 저장소에 있는 내용에서 변경되었다는 의미의 M을 출력하는 것이다. 실제로 Hello.java의 내용을 보면 다음과 같이 바뀐 것을 볼 수 있다.

$ cat Hello.javapublic class Hello {    // main 함수    public static void main(String args[]) {        System.out.println("안녕하세요?");        System.out.println("반갑습니다.");    }}				

다 른 개발자가 추가한 주석이 들어 있으면서 내가 추가한 줄도 그대로 있음을 볼 수 있다. 이것이 CVS의 강력한 장점이다. 즉, 서로 다른 두 개발자가 같은 파일을 수정하였는데도, 서로의 작업을 하나로 합쳐주는 것이다. 한가지 주의할 점은, 만일 update를 수행할 때 Hello.java를 에디터에서 불러 작업중이었다면, 계속 에디터로 작업을 한 후 저장할 때 update에 의해 변경된 내용을 덮어 쓸 수가 있다는 것이다. 대부분의 에디터는 작업하고 있는 파일이 다른 프로그램에 의해 변경되면 이 사실을 사용자에게 알리고, 변경된 파일을 다시 불러올 수 있도록 하지만, 간혹 그렇지 못한 에디터도 있을 수 있으므로 조심하기 바란다.

충돌의 해결

비 록 CVS가 두 개발자의 작업 내용을 합쳐 주기는 하지만 여기에도 한계는 있다. 두 개발자가 같은 부분을 수정한다면 CVS는 누구의 변경 내용을 택해야 하는지 알 도리가 없다. 이런 경우를 충돌(conflict)이라 하며, CVS는 이 사실을 개발자에게 알려 개발자가 적절한 조치를 취할 수 있도록 한다.

위의 예에서 다른 개발자가 작업을 계속하여 "환영합니다."를 출력하도록 만들고, 이를 저장소에 저장했다고 하자. 그러면 저장소에는 다음과 같은 내용이 들어 있을 것이다.

public class Hello {    // main 함수    public static void main(String args[]) {    System.out.println("안녕하세요?");        System.out.println("환영합니다.");    }}				

이 때 내가 update를 하면 충돌이 발생한다.

$ cvs updatecvs update: Updating .RCS file: /home/CVS/myprj/Hello.java,vretrieving revision 1.3retrieving revision 1.4Merging differences between 1.3 and 1.4 into Hello.javarcsmerge: warning: conflicts during mergecvs update: conflicts found in Hello.javaC Hello.java				

현 재 디렉토리의 Hello.java는 1.3에서 변경된 상태("반갑습니다." 출력 추가)이다. 저장소에 저장되어 있는 것은 1.4이므로 CVS는 저장소에 있는 1.3과 1.4의 차이를 살핀다. 둘의 차이는 다른 개발자에 의해 "환영합니다."를 출력하는 줄이 추가된 것이다. 이를 현재디렉토리의 Hello.java에 추가하려고 시도하지만, 그 위치에 이미 다른 내용("반갑습니다." 출력)이 들어가 있음을 알게 된다. 결국 CVS는 충돌(C로 표시)이 생겼음을 알리고 수행을 마친다. Hello.java의 내용을 보면 어디에서 어떤 충돌이 발생했는지 CVS가 표시해 놓은 것을 발견할 수 있다.

$ cat Hello.javapublic class Hello {    // main 함수    public static void main(String args[]) {        System.out.println("안녕하세요?");<<<<<<< Hello.java        System.out.println("반갑습니다.");=======        System.out.println("환영합니다.");>>>>>>> 1.4    }}				

<<<<<<< 와 >>>>>>> 사이가 충돌이 일어난 부분이다. 그 부분은 다시 두 부분으로 나뉘는데, ======= 이전까지가 현재 디렉토리에 있는 파일의 내용이고, 그 이후가 저장소에 있는 파일의 내용이다. 개발자는 이걸 보고 어느 한 쪽을 없애거나 두 내용을 적절히 합친 후 다시 commit을 해 주면 된다. 이 경우 "반갑습니다."가 더 마음에 들어 "환영합니다."를 삭제하기로 했다면 다음과 같이 고치고 commit을 한다.

$ cat Hello.javapublic class Hello {    // main 함수    public static void main(String args[]) {        System.out.println("안녕하세요?");        System.out.println("반갑습니다.");    }}$ cvs commit -m "인사말 변경" Hello.javaChecking in Hello.java;/home/CVS/myprj/Hello.java,v  <--  Hello.javanew revision: 1.5; previous revision: 1.4done				

하지만 다른 개발자가 수정한 내용을 그대로 놔 두고 내가 고친 부분을 없애기로 했다면 따로 commit을 할 필요가 없다. 이미 저장소에 그 내용이 들어 있기 때문이다.

충 돌은 commit 시에도 발생할 수 있다. 앞의 예에서 다른 개발자가 "환영합니다." 출력 문장을 추가하여 commit을 한 후, 내가 update 대신 commit을 하려 했다면, CVS는 다음과 같이 충돌이 발생했음을 알려 줄 것이다.

$ cvs commit -m "반갑습니다 추가" Hello.javacvs commit: Up-to-date check failed for `Hello.java'cvs [commit aborted]: correct above errors first!				

이런 메시지를 보게 되면 update 명령으로 어디에서 충돌이 발생했는지를 확인하면 된다. 그 결과와 수정 방법은 앞에서 나온 것과 동일하다.

파일의 추가/삭제 (add/delete)

지 금까지는 저장소에 있는 파일을 수정하고, 그 결과를 다시 저장하는 방법을 알아보았다. 하지만 작업을 하다 보면 새로운 파일을 만들거나 기존의 파일을 지워야 할 경우가 생긴다. 이런 경우에 사용하는 명령이 add와 delete이다. 사용 방법은 매우 간단하다. Test.java란 파일을 새로 만들려면 먼저 현재 디렉토리에 Test.java를 생성한 후 다음과 같이 하면 된다.

$ cvs add Test.javacvs add: scheduling file `Test.java' for additioncvs add: use 'cvs commit' to add this file permanently				

메 시지에서 알 수 있듯이 add 명령만으로는 저장소에 Test.java가 생기지 않는다. 저장소를 변경하는 것은 commit 명령뿐이다. add 명령은 단지 commit 명령시에 Test.java를 추가해야 한다는 것을 기록해 놓을 뿐이다. 이 사실은 update로 확인해 볼 수도 있다.

$ cvs updatecvs update: Updating .A Test.java				

앞 의 A는 추가될(added) 파일임을 의미한다. 그러므로 Test.java는 나중에 작업 내용 전체를 commit할 때 저장소에 추가될 것이다. 아니면 미리 Test.java를 인자로 commit을 하여 바로 추가되도록 할 수도 있다.

$ cvs commit -m "새 파일" Test.javaRCS file: /home/CVS/myprj/Test.java,vdoneChecking in Test.java;/home/CVS/myprj/Test.java,v  <--  Test.javainitial revision: 1.1done				

추가된 파일은 다른 개발자가 update를 할 때 그 개발자의 작업 공간에도 생겨나며, 파일 내용이 갱신되는 것과 마찬가지로 U를 써서 표시한다.

$ cvs updatecvs update: Updating .U Test.java				

파일을 지우는 것도 마찬가지이다. Test.java를 지우려면 다음과 같이 한다.

$ rm Test.java$ cvs delete Test.javacvs remove: scheduling `Test.java' for removalcvs remove: use 'cvs commit' to remove this file permanently				

delete 명령을 사용하기 전에 반드시 먼저 파일을 작업 공간에서 삭제하여야 한다. 이제 commit 명령을 사용하면 Test.java는 저장소에서 삭제될 것이다. 이것도 update로 확인해 본다면 다음과 같이 나올 것이다.

$ cvs updatecvs update: Updating .R Test.java				

R은 삭제될(removed) 파일임을 나타낸다. 이제 commit으로 완전히 삭제해 보자.

$ cvs commmit -m "삭제" Test.javaRemoving Test.java;/home/CVS/myprj/Test.java,v  <--  Test.javanew revision: delete; previous revision: 1.1done				

이렇게 삭제된 파일은 이후로 다른 개발자가 update를 하게 되면 다음과 같은 메시지를 출력하면서 그 개발자의 작업 디렉토리에서도 삭제된다.

$ cvs updatecvs update: Updating .cvs update: warning: Test.java is not (any longer) pertinent				

작업 기록 열람 (log)

그 동안의 예에서 본 바와 같이 CVS는 작업 내용을 저장소에 저장할 때마다 메시지를 적도록 하고 있다. 이 내용은 저장소에 함께 저장되어 log 명령을 이용하면 언제라도 꺼내 볼 수 있다. Hello.java를 예로 들어 보자.

$ cvs log Hello.javaRCS file: /home/CVS/myprj/Hello.java,vWorking file: Hello.javahead: 1.5branch:locks: strictaccess list:symbolic names:		start: 1.1.1.1		webdox: 1.1.1keyword substitution: kvtotal revisions: 6;    selected revisions: 6description:----------------------------revision 1.5date: 1999/12/12 04:04:23;  author: minskim;  state: Exp;  lines: +1 -0인사말 변경----------------------------revision 1.4date: 1999/12/12 04:03:50;  author: sehkone;  state: Exp;  lines: +0 -1환영합니다 추가----------------------------revision 1.3date: 1999/12/12 04:01:40;  author: sehkone;  state: Exp;  lines: +2 -1주석 추가----------------------------revision 1.2date: 1999/12/12 03:51:36;  author: minskim;  state: Exp;  lines: +1 -0인사말 추가----------------------------revision 1.1date: 1999/12/12 03:50:48;  author: minskim;  state: Exp;branches:  1.1.1;Initial revision----------------------------revision 1.1.1.1date: 1999/12/12 03:50:48;  author: minskim;  state: Exp;  lines: +0 -0프로젝트 시작=============================================================================				

매 번 commit을 할 때마다 날짜와 시각, 저장한 사람, 메시지 등이 기록되는 것을 알 수 있다. 이렇게 log 명령을 쓰면 언제 누가 어떤 작업을 했는지를 한눈에 알 수 있기 때문에 그간의 작업 내용을 쉽게 파악할 수 있다. 이 기능을 잘 활용하기 위해서는 무엇보다도 매번 commit을 할 때 알기 쉽고 작업 내용을 잘 반영할 수 있는 메시지를 적는 것이 중요하다.

상태 (status)

현재 작업 파일에 대한 상태를 보기 위해서는 status 명령을 사용할 수 있다.

$ cvs status README===================================================================File: README            Status: Up-to-dateWorking revision:    1.6     Tue Nov  5 02:14:40 2002Repository revision: 1.6     /home/CVS/test/README,vSticky Tag:          (none)Sticky Date:         (none)Sticky Options:      (none)				

-v option을 줄 경우 파일에 대한 tag를 보여준다. tag에 대한 내용은 다음 장에서 설명한다.

$ cvs status -v README===================================================================File: README            Status: Up-to-dateWorking revision:    1.6     Tue Nov  5 02:14:40 2002Repository revision: 1.6     /home/CVS/test/README,vSticky Tag:          (none)Sticky Date:         (none)Sticky Options:      (none)Existing Tags:		release1-1                          (revision: 1.1)				

태그 (tag)

예를 들어서 다음과 같은 파일 들이 각각의 버젼을 가지고 있고 현재 상태는 안전된 것으로 하자.

        file1   file2   file3   file4   file5        1.1     1.1     1.1     1.1     1.1        1.2     1.2     1.2     1.2                1.3     1.3                                1.4                                1.5        				

다시 개발을 진행하게 되어 다음과 같은 버젼으로 올라갔다고 하자.

        file1   file2   file3   file4   file5        1.1     1.1     1.1     1.1     1.1        1.2     1.2     1.2     1.2            1.3     1.3     1.3     1.3        1.4             1.4     1.4                        1.5     1.5                        1.6				

하 지만 이미 file1(1.2), file2(1.3), file3(1.5), file4(1.4), file5(1.1)에서 안정된 상태이고 이 버젼에 대한 파일들을 가지고 release하고 싶을 때 일일 파일의 버젼을 확인하여 cvs udpate -r (버젼)을 통해서 하나하나 가져와야하는 번거러움이 있다.

이런 경우 도움이 되는 것이 tag다. 사용법은 다음과 같이 cvs tag [tag이름] [files...]

$ cvs tag release1-1T file1T file2T file3T file4T file5				

아제 앞에서 배운 status -v를 통해서 tag가 지정되었는지 확인해 보자.

$ cvs status -v file1===================================================================File: file1             Status: Up-to-date   Working revision:    1.1     Tue Nov  5 02:14:40 2002   Repository revision: 1.1     /home/CVS/files/file1,v   Sticky Tag:          (none)   Sticky Date:         (none)   Sticky Options:      (none)   Existing Tags:        release1-1                          (revision: 1.1)				

위 방법을 이용하여, release1-1 tag가 각 파일에 지정되어 있다면.

        file1   file2   file3   file4   file5        1.1     1.1     1.1     1.1  /--1.1*      <-*-  TAG (release1-1)        1.2*-   1.2     1.2    -1.2*-        1.3  \- 1.3*-   1.3   / 1.3        1.4          \  1.4  /  1.4                      \-1.5*-   1.5                        1.6				

파일 release1-1에 해당되는 파일을 가지고 올 수가 있다.

$ cvs update -r release1-1U file1U file2U file3U file4U file5				

파일 추출 (export)

저 장소에 있는 파일을 작업 공간에 가져올 때 checkout 또는 update를 통해서 가져오게 되면 작업 공간에는 반드시 CVS라는 이름의 디렉토리가 생성되는 것은 이미 알고 있을 것이다. 그러나 어떤 경우에는 CVS 디렉토리가 불필요하고, 파일만을 가져와야 할 때가 있다. 이런 경우에 사용할 수 있는 명령이 export이다.

$ cvs export -r release1-1 myprj				

위 결과는 tag가 release1-1로 지정되어 있는 파일만 추출 된다.

만약 원하는 파일이 tag로 지정되어 있지 않을 경우는 -f option을 주면 tag가 없는 파일에 대해서는 최신(HEAD) 버젼을 가져온다.


- 출처 : http://wingh.egloos.com/4069320