Extremely Agile/CVS2007.09.19 13:41
CVS에서 프로젝트를 체크인 한 다음에 어떤 디렉터리 하나를 지우려고 들면, 그 삽질이 여간 아니다. 그 디렉터리 아래에 무수히 많은 디렉터리가 있거나, 무수히 많은 다른 파일들이 있다면 더더욱... 그러니 그 안에 있는 파일들을 지우고, cvs remove하는 작업을 재귀적으로 자동으로 해 줄 수 있다면 좋지 않을까? 그런 필요를 느끼는 사람은 다음의 셸 스크립트를 활용해 보는 것도 좋을 듯.

/home/<자기 계정 이름>/bin 같은 데 설치해놓고 (물론 PATH의 일부로 해당 디렉터리가 포함되어 있어야 함) 필요할 때 불러쓰면 OK.

사용법은 cvs_deltree <디렉터리 이름>

잠깐 테스트 해 봤는데 별 무리 없이 돌아간다. 문제점은, 이렇게 해도 저장소에 있는 빈 디렉터리는 사라지지 않는다는 것. 따라서 나중에 다시 체크아웃 해 보면, 빈 디렉터리들이 고스란히 살아난다. 저장소에서 직접 지워주지 않는 한 없어지지 않는다는 것. "실용주의 프로그래머를 위한 버전 관리 using CVS"에도 같은 문제가 지적된 걸로 봐서, 뾰족한 해결책은 없는 듯.

이유는 "디렉터리를 제거하면 변경사항 추적이 곤란해질 수 있기 때문"이라고 아래의 링크에서 지적하는데,

http://www.gproject.co.kr/confluence/pages/viewpage.action?pageId=4014

그것이 요인이라면 체크아웃을 할 때 cvs co -P와 같이 빈 디렉터리는 체크아웃하지 않도록 하는 습관을 들이는 것이 유일한 해결책. subversion을 쓰면 이런 문제는 없다고들 하지만서도.

#!/bin/bash

usage() {
    echo "Usage: cvs_deltree <directory>"
    exit 0
}

if [ ! "$1" ]
then
    usage
fi

dir_name=$1

if [ ! -d $dir_name ]
then
    usage
fi

remove_dir() {
    local dir=$1

    # get inside
    cd $dir

    local file_list=*

    for file in $file_list
    do
        if [ "$file" == "CVS" ]
        then
            continue;
        fi

        if [ -d $file ]
        then
            remove_dir $file
        else
            rm $file
            cvs remove $file
        fi
    done

    # get outside
    cd ..

    # remove itself
    cvs update -P $dir
}

remove_dir $dir_name

cvs commit -m "directory tree $dir_name has been removed"
신고
Posted by 이병준

소중한 의견, 감사합니다. ^^

Extremely Agile/CVS2007.09.18 15:55

CVS에 소스를 등록할 때 사용되는 명령어는 다음과 같다.

cvs import -m "" <프로젝트 이름> <프로젝트 이름> initial

대충 이런 형식으로 사용하면 되는데, 보통 사용하는 형태가 저렇다는 것이지 원래 명령어의 의미가 저렇다는 것은 아님에 유의.

소스를 등록할 때 보통 해당 소스 트리 아래에 써드파티 소스가 포함되는 경우가 있을 수 있는데, 그 경우는 소스를 등록하기 전에 해당 소스가 있는 디랙터리에 가서

%> make distclean

을 실행해 주어야 한다. (./configure; make; make install로 설치하는 Unix 계열 프로그램에 한함)

그래야 .deps라던지 .libs와 같은 자동생성되는 디렉터리나 파일들이 CVS 저장소에 등록되지 않는다. 실수로 그런 파일들이 등록되는 경우에는 나중에 체크아웃한 다음에 파일을 지우고 cvs remove(삭제된 파일을 저장소에서도 삭제하도록 하고 싶을때 사용), cvs commit(삭제된 내용을 confirm하고자 할 때 사용), cvs update -P(지역 저장소에서 빈 디렉터리 전부 제거)를 하는 삽질을 해야 하는데, 어느 쪽이건 별로 권장하고 싶지 않다.

특히 .libs와 같은 디렉터리와 파일들은 엄청나게 많이 생기므로 -_- 그걸 손으로 지워주는 작업을 해야 한다면 아마 돌아버리게 될 듯.

신고
Posted by 이병준

소중한 의견, 감사합니다. ^^