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 이병준

TRACKBACK http://www.buggymind.com/trackback/46 관련글 쓰기

댓글을 달아 주세요

Languages/bash2007/08/28 09:38
rm에 대한 앨리어스로 등록 후 사용하는 것이 바람직.
이 셸 스크립트는 /home/<자기 계정 이름>/bin/remove로 저장하여 두고,
alias rm='/home/<자기 계정 이름>/bin/remove' 같이 해 놓으면 된다.
휴지통 저장 없이 그냥 지우려면 \rm ... 과 같이 하면 되니까 그편이 낫다.
복구 유틸리티도 만들면 좋은데 귀찮아서 아직 못만들었다.

#!/bin/bash

trashcan=~/trashcan
trashcan_cnt=~/trashcan/count
trashcan_idx=~/trashcan/index

if [ ! -e $trashcan ]
then
    mkdir $trashcan
fi

if [ ! -e $trashcan_cnt ]
then
    echo '000' > $trashcan_cnt
fi

if [ ! -e $trashcan_idx ]
then
    touch $trashcan_idx
fi

cur_dir=`pwd`
cur_cnt=`head -1 $trashcan_cnt`
cur_cnt=`printf "%03d" $(expr $cur_cnt + 1)`
cur_date=`date +%Y/%m/%d/%H:%M:%S`

for item in $@
do
    if [ -e $item ]
    then
        first_char=`expr substr $item 0 1`
        printf "%s" $first_char
        if [ "$first_char" = "/" ]
        then
            dir=${item}
        else
            dir=${cur_dir}/${item}
        fi

        file=`basename $item`

        printf "%s\t%s\t%s\t%s\n" $cur_cnt $dir $file $cur_date >> $trashcan_idx
        echo $cur_cnt > $trashcan_cnt
        if [ ! -e $trashcan/$cur_cnt ]
        then
            mkdir $trashcan/$cur_cnt
        fi
        mv $item $trashcan/$cur_cnt
    fi
done

'Languages > bash' 카테고리의 다른 글

파일 복구 unrm 유틸리티  (1) 2007/08/31
휴지통기능이 있는 rm 유틸리티 만들기  (1) 2007/08/28


Posted by 이병준

TRACKBACK http://www.buggymind.com/trackback/2 관련글 쓰기

  1. 파일 복구 unrm 유틸리티  삭제

    2007/08/31 11:25TRACKBACK FROM John Coder's Diary

    앞서 썼던 글중에 "휴지통 기능을 지원하는 rm 유틸리티" (새 창으로 열기)에 대한 글이 있었다. 이 글은 그 글에 대한 후속편으로, 휴지통에 들어간 파일을 자동복구해주는 unrm 유틸리티의 구현에 관한 것이다.이 유틸리티는 셸 스크립트로 구현되어 있으며,alias unrm="/home/&lt;자기계정이름&gt;/bin/recover" 와 같이 앨리어스를 지정해놓고 이용하면 편리하다. 물론 그러려면 아래의 셸 스크립트를 /home/&lt;자기계정이..

댓글을 달아 주세요

  1. 네트워크 정보의 좋은 소스셔서 감사합니다 ,내가이 기사를 읽고 오랫동안 귀하의 사이트를 추적 유지되었습니다, 내가 더 관심을 지불할 것입니다 흥미로운 읽을 수 있습니다,기사가 가장 고전적인 스타일 중 하나가, 내가 한 번 읽으면, 내가 그들과 사랑에 깊이되었습니다이며, 좀 더 완벽한 작품을 기대
    http://www.uggbootslife.com/

    2012/01/17 16:34 [ ADDR : EDIT/ DEL : REPLY ]