Linux
CVS (Concurrent Versions System) 사용하기
aucd29
2013. 9. 26. 20:52
///////////////////////////////////////////////////////////////////////////
//
//
// 저장소 및 디렉토리 생성 및 초기화
// 다운로드 : http://www.cvshome.org
//
//
///////////////////////////////////////////////////////////////////////////
mkdir /home/cvs
cvs =d /home/cvs init
adduser cvs
chown root.cvs /home/cvs -R
chmod 770 /home/cvs -R
// 유저 패스워드 설정
htpasswd -nb [ID] [PASS]
// cvs server start
/etc/xinetd.d/cvspserver
/////////////////////////////////////////////////////////////////////////////
//
//
// cvs서버를 실행 시키기 위해서 아래 파일을 생성
//
//
/////////////////////////////////////////////////////////////////////////////
// 파일명
/etc/xinetd.d/cvspserver
// 내용
service cvspserver
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = cvs
server = /usr/bin/cvs
server_args = --allow-root=/home/cvs pserver
}
// 파일 생성후 진행 작업
service xinetd restart
netstat -an grep 2401
////////////////////////////////////////////////////////////////////////
//
//
// cvs 로그인 하기
//
//
////////////////////////////////////////////////////////////////////////
cvs -d:pserver:kurome@localhost:2401/home/cvs login
:[접속방법]:[cvs사용자ID]@[주소:포트/경로]
맨날 하기 귀찮아서리 다른 방법이 존재하는데
~/.bash_profile
에다가 아래 내용을 추가한다.
export CVSROOT=:pserver:kurome@localhost:/home/cvs
추가한뒤
source ~/.bash_profile
을 명령한다.
여기서 pserver 대신 ext를 사용하게 되면 시스템 계정을 이용한 rsh 나 ssh로 접속 하는 것을 의미한다.
////////////////////////////////////////////////////////////////////////
//
//
// cvs 파일 등록하기
//
//
////////////////////////////////////////////////////////////////////////
cvs import -m "diary project start " diary project start
////////////////////////////////////////////////////////////////////////
//
//
// cvs 프로젝트 파일 받아 오기
//
//
////////////////////////////////////////////////////////////////////////
cvs checkout diary
나
cvs co diary
////////////////////////////////////////////////////////////////////////
//
//
// cvs 수정한 내용을 저장소 디렉토리에 반영
//
//
////////////////////////////////////////////////////////////////////////
cvs commit -m "main.c file comment append" main.c
////////////////////////////////////////////////////////////////////////
//
//
// cvs 수정한 파일이 많은데 일일히 수정하기 곤란할 때 이용
//
//
////////////////////////////////////////////////////////////////////////
cvs ci
////////////////////////////////////////////////////////////////////////
//
//
// cvs 현재 작업 디렉토리에 최신 소스 반영하기
//
//
////////////////////////////////////////////////////////////////////////
cvs update
나
cvs up
////////////////////////////////////////////////////////////////////////
//
//
// cvs 파일과 디렉토리 추가 및 삭제
//
//
////////////////////////////////////////////////////////////////////////
cvs add newfile.c // 파일 추가
////////////////////////////////////////////////////////////////////////
//
//
// cvs 디렉토리 트리를 추가하는 스크립트 파일
//
//
////////////////////////////////////////////////////////////////////////
#!/usr/bin/python
# vi: set ts=4 sts=4 sts=4 sw=4 : #
import os
import sys
import getopt
import glob
def read_dir(args, dirname, filenames) :
if not dirname.endswith("CVS") :
if dirname.endswith("/") :
dirname = dirname[ 0:dirname.rindex("/")]
os.system("cvs add " + dirname)
for f in filenames :
if os.path.isfile(dirname + "/" + f) :
os.system("cvs add " + dirname + "/" + f)
################ main start ###############
if len(sys.argv) > 1:
options, args = getopt.getopt(sys.argv[1:], "t:")
for op, var in options:
if op == "-t" :
os.path.walk(var, read_dir, [] )
os.system("cvs ci -m \"append directories\"")
위 스크립트를 cvsadd.py 로 작성하고 chmod 755 /usr/local/cvsadd.py 명령으로 실행 권한
을 준다. 그리고 newdir 디렉토리의 상위 디렉토리에서 아래와 같이 명령을 내리면 newdir 디렉
토리 이하 모든 파일과 디렉토리가 CVS 서버에 추가된다.
cvsadd.py -t newdir
////////////////////////////////////////////////////////////////////////
//
//
// cvs 디렉토리의 삭제
//
//
////////////////////////////////////////////////////////////////////////
rm -rf newfile.c
cvs remove newfile.c
cvs ci -m "newfile.c 파일 제거"
////////////////////////////////////////////////////////////////////////
//
//
// cvs 현재 버전 확인
//
//
////////////////////////////////////////////////////////////////////////
cvs status newfile.c
////////////////////////////////////////////////////////////////////////
//
//
// cvs 이전 버전으로 복귀
//
//
////////////////////////////////////////////////////////////////////////
cvs up -r 1.5 -p newfile.c > newfile.c
이건 일시적은 복귀이고 완전히 복귀 하기 위해서는
cvs add newfile.c 명령을 사용하여 파일을 추가 해야 한다.
cvs up -j 1.6 -j 1.5 newfile.c
기타 > 이미지와 같은 바이너리 파일의 경우는 -kb 옵션을 주어 바이너리
파일 이라는 것을 알려야 한다.
cvs add -kb image.jpg
기타 > 간혹 롤백(Rollback)을 하고 롤백한 파일을 수정한 후 commit을 할때
sticky tag `1.2`와 같은 메시지가 출력 되면서 commit 이 되지 않는 경우가 발
생할 경우가 있는데 이는 파일에 sticky tag가 있어서 그렇다. sticky tag는 이
전 버전으로 되돌린다거나 할 때 자동으로 들어가게 되는데 sticky tag가 들어
가는 이유는 main.c파일을 1.2로 바꾸고 commit이 가능하다면 현재 저장소
디렉토리에 있는 main.c 파일은 훨씬 이전 버전인 1.2 버전으로 바뀌기 때문
이다.
이런 일을 미연에 방지하고자 CVS는 cvs up -r 1.2 main.c 명령으로 main.c
파일을 1.2 버전으로 되돌릴 때 항상 스티키 태그를 집어 넣는다. 스티키 존재
유무는 cvs status [파일명]으로 확인 가능하다.
cvs up -A main.c
////////////////////////////////////////////////////////////////////////
//
//
// cvs 파일 로그 및 특정 부분을 수정한 사람 확인
//
//
////////////////////////////////////////////////////////////////////////
cvs log [파일명]
을 이용하면 버전별로 수정한 사람이 나타나게 되고
cvs annotate [filename] or cvs ann [filename]
을 이용 소스 라인 별로 수정한 사람이 나타나게 된다.
////////////////////////////////////////////////////////////////////////
//
//
// cvs 파일 버전대별 차이점 확인
//
//
////////////////////////////////////////////////////////////////////////
cvs diff -r 1.5 -r 1.6 main.c
1.5버전에서 main.c 파일과 1.6 버전의 main.c 파일에서 달라진 부분이 있
는지 출력한다.
////////////////////////////////////////////////////////////////////////
//
//
// cvs 현재 작업 디렉토리에 있는 main.c 와 저장소 디렉토리 내용 비교
//
//
////////////////////////////////////////////////////////////////////////
cvs diff -r HEAD main.c
////////////////////////////////////////////////////////////////////////
//
//
// cvs 소스에 TAG걸기
//
//
////////////////////////////////////////////////////////////////////////
소스 편집 상태를 저장 하기 위해서 특정 시점에 TAG을 걸 수 가 있다.
cvs tag TAG_1
이런식으로 현재 상태를 태깅 해놓으면 추후 TAG_1 의 상태로 돌아
갈수 가 있다.
cvs up -r TAG_!
이렇게 태그를 거는건 버그 수정 하거나 소스를 많이 수정해야 할 경우 유용
하다.
///////////////////////////////////////////////////////////////////////
cvs command
///////////////////////////////////////////////////////////////////////
login : cvs server login
logout : cvspass file에서 저장소 제거
import : 프로젝트 파일 등록
checkout(co, get) : 프로젝트 파일 가져오기
commit(ci) : project file 수정후 cvs 서버에 반영
update(up) : cvs server의 최신 버전을 작업 디렉토리에 반영
add(new) : 파일 또는 디렉토리 추가
remove(rm, delete) : 파일 삭제
diff : 파일 버전에 따른 차이점 비교
log : 파일 로그 보기
annotate(ann) : 행별 정보 출력(날짜 작성자 등)
status : 파일 상태 보기
history : 각종 히스토리 보기
tag : 프로젝트 파일들 태깅
rtag : 저장소 디렉토리에 태깅
release : 모듈 release
/////////////////////////////////////////////////////////////////////////
참조 사이트
http://wiki.kldp.org/wiki.php/DocbookSgml/CVS_Tutorial-KLDP
http://jakarta-k.sourceforge.net/guide/HOWTO_Sourceforge_CVS.html#%C1%D8%BA%F1%B9%B0
다운로드 사이트
http://www.cvshome.org
//
//
// 저장소 및 디렉토리 생성 및 초기화
// 다운로드 : http://www.cvshome.org
//
//
///////////////////////////////////////////////////////////////////////////
mkdir /home/cvs
cvs =d /home/cvs init
adduser cvs
chown root.cvs /home/cvs -R
chmod 770 /home/cvs -R
// 유저 패스워드 설정
htpasswd -nb [ID] [PASS]
// cvs server start
/etc/xinetd.d/cvspserver
/////////////////////////////////////////////////////////////////////////////
//
//
// cvs서버를 실행 시키기 위해서 아래 파일을 생성
//
//
/////////////////////////////////////////////////////////////////////////////
// 파일명
/etc/xinetd.d/cvspserver
// 내용
service cvspserver
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = cvs
server = /usr/bin/cvs
server_args = --allow-root=/home/cvs pserver
}
// 파일 생성후 진행 작업
service xinetd restart
netstat -an grep 2401
////////////////////////////////////////////////////////////////////////
//
//
// cvs 로그인 하기
//
//
////////////////////////////////////////////////////////////////////////
cvs -d:pserver:kurome@localhost:2401/home/cvs login
:[접속방법]:[cvs사용자ID]@[주소:포트/경로]
맨날 하기 귀찮아서리 다른 방법이 존재하는데
~/.bash_profile
에다가 아래 내용을 추가한다.
export CVSROOT=:pserver:kurome@localhost:/home/cvs
추가한뒤
source ~/.bash_profile
을 명령한다.
여기서 pserver 대신 ext를 사용하게 되면 시스템 계정을 이용한 rsh 나 ssh로 접속 하는 것을 의미한다.
////////////////////////////////////////////////////////////////////////
//
//
// cvs 파일 등록하기
//
//
////////////////////////////////////////////////////////////////////////
cvs import -m "diary project start " diary project start
////////////////////////////////////////////////////////////////////////
//
//
// cvs 프로젝트 파일 받아 오기
//
//
////////////////////////////////////////////////////////////////////////
cvs checkout diary
나
cvs co diary
////////////////////////////////////////////////////////////////////////
//
//
// cvs 수정한 내용을 저장소 디렉토리에 반영
//
//
////////////////////////////////////////////////////////////////////////
cvs commit -m "main.c file comment append" main.c
////////////////////////////////////////////////////////////////////////
//
//
// cvs 수정한 파일이 많은데 일일히 수정하기 곤란할 때 이용
//
//
////////////////////////////////////////////////////////////////////////
cvs ci
////////////////////////////////////////////////////////////////////////
//
//
// cvs 현재 작업 디렉토리에 최신 소스 반영하기
//
//
////////////////////////////////////////////////////////////////////////
cvs update
나
cvs up
////////////////////////////////////////////////////////////////////////
//
//
// cvs 파일과 디렉토리 추가 및 삭제
//
//
////////////////////////////////////////////////////////////////////////
cvs add newfile.c // 파일 추가
////////////////////////////////////////////////////////////////////////
//
//
// cvs 디렉토리 트리를 추가하는 스크립트 파일
//
//
////////////////////////////////////////////////////////////////////////
#!/usr/bin/python
# vi: set ts=4 sts=4 sts=4 sw=4 : #
import os
import sys
import getopt
import glob
def read_dir(args, dirname, filenames) :
if not dirname.endswith("CVS") :
if dirname.endswith("/") :
dirname = dirname[ 0:dirname.rindex("/")]
os.system("cvs add " + dirname)
for f in filenames :
if os.path.isfile(dirname + "/" + f) :
os.system("cvs add " + dirname + "/" + f)
################ main start ###############
if len(sys.argv) > 1:
options, args = getopt.getopt(sys.argv[1:], "t:")
for op, var in options:
if op == "-t" :
os.path.walk(var, read_dir, [] )
os.system("cvs ci -m \"append directories\"")
위 스크립트를 cvsadd.py 로 작성하고 chmod 755 /usr/local/cvsadd.py 명령으로 실행 권한
을 준다. 그리고 newdir 디렉토리의 상위 디렉토리에서 아래와 같이 명령을 내리면 newdir 디렉
토리 이하 모든 파일과 디렉토리가 CVS 서버에 추가된다.
cvsadd.py -t newdir
////////////////////////////////////////////////////////////////////////
//
//
// cvs 디렉토리의 삭제
//
//
////////////////////////////////////////////////////////////////////////
rm -rf newfile.c
cvs remove newfile.c
cvs ci -m "newfile.c 파일 제거"
////////////////////////////////////////////////////////////////////////
//
//
// cvs 현재 버전 확인
//
//
////////////////////////////////////////////////////////////////////////
cvs status newfile.c
////////////////////////////////////////////////////////////////////////
//
//
// cvs 이전 버전으로 복귀
//
//
////////////////////////////////////////////////////////////////////////
cvs up -r 1.5 -p newfile.c > newfile.c
이건 일시적은 복귀이고 완전히 복귀 하기 위해서는
cvs add newfile.c 명령을 사용하여 파일을 추가 해야 한다.
cvs up -j 1.6 -j 1.5 newfile.c
기타 > 이미지와 같은 바이너리 파일의 경우는 -kb 옵션을 주어 바이너리
파일 이라는 것을 알려야 한다.
cvs add -kb image.jpg
기타 > 간혹 롤백(Rollback)을 하고 롤백한 파일을 수정한 후 commit을 할때
sticky tag `1.2`와 같은 메시지가 출력 되면서 commit 이 되지 않는 경우가 발
생할 경우가 있는데 이는 파일에 sticky tag가 있어서 그렇다. sticky tag는 이
전 버전으로 되돌린다거나 할 때 자동으로 들어가게 되는데 sticky tag가 들어
가는 이유는 main.c파일을 1.2로 바꾸고 commit이 가능하다면 현재 저장소
디렉토리에 있는 main.c 파일은 훨씬 이전 버전인 1.2 버전으로 바뀌기 때문
이다.
이런 일을 미연에 방지하고자 CVS는 cvs up -r 1.2 main.c 명령으로 main.c
파일을 1.2 버전으로 되돌릴 때 항상 스티키 태그를 집어 넣는다. 스티키 존재
유무는 cvs status [파일명]으로 확인 가능하다.
cvs up -A main.c
////////////////////////////////////////////////////////////////////////
//
//
// cvs 파일 로그 및 특정 부분을 수정한 사람 확인
//
//
////////////////////////////////////////////////////////////////////////
cvs log [파일명]
을 이용하면 버전별로 수정한 사람이 나타나게 되고
cvs annotate [filename] or cvs ann [filename]
을 이용 소스 라인 별로 수정한 사람이 나타나게 된다.
////////////////////////////////////////////////////////////////////////
//
//
// cvs 파일 버전대별 차이점 확인
//
//
////////////////////////////////////////////////////////////////////////
cvs diff -r 1.5 -r 1.6 main.c
1.5버전에서 main.c 파일과 1.6 버전의 main.c 파일에서 달라진 부분이 있
는지 출력한다.
////////////////////////////////////////////////////////////////////////
//
//
// cvs 현재 작업 디렉토리에 있는 main.c 와 저장소 디렉토리 내용 비교
//
//
////////////////////////////////////////////////////////////////////////
cvs diff -r HEAD main.c
////////////////////////////////////////////////////////////////////////
//
//
// cvs 소스에 TAG걸기
//
//
////////////////////////////////////////////////////////////////////////
소스 편집 상태를 저장 하기 위해서 특정 시점에 TAG을 걸 수 가 있다.
cvs tag TAG_1
이런식으로 현재 상태를 태깅 해놓으면 추후 TAG_1 의 상태로 돌아
갈수 가 있다.
cvs up -r TAG_!
이렇게 태그를 거는건 버그 수정 하거나 소스를 많이 수정해야 할 경우 유용
하다.
///////////////////////////////////////////////////////////////////////
cvs command
///////////////////////////////////////////////////////////////////////
login : cvs server login
logout : cvspass file에서 저장소 제거
import : 프로젝트 파일 등록
checkout(co, get) : 프로젝트 파일 가져오기
commit(ci) : project file 수정후 cvs 서버에 반영
update(up) : cvs server의 최신 버전을 작업 디렉토리에 반영
add(new) : 파일 또는 디렉토리 추가
remove(rm, delete) : 파일 삭제
diff : 파일 버전에 따른 차이점 비교
log : 파일 로그 보기
annotate(ann) : 행별 정보 출력(날짜 작성자 등)
status : 파일 상태 보기
history : 각종 히스토리 보기
tag : 프로젝트 파일들 태깅
rtag : 저장소 디렉토리에 태깅
release : 모듈 release
/////////////////////////////////////////////////////////////////////////
참조 사이트
http://wiki.kldp.org/wiki.php/DocbookSgml/CVS_Tutorial-KLDP
http://jakarta-k.sourceforge.net/guide/HOWTO_Sourceforge_CVS.html#%C1%D8%BA%F1%B9%B0
다운로드 사이트
http://www.cvshome.org