Sanghoon’s Blog

2월 25, 2008

Makefile 에러

밑에 신청: Tips — sanghoon @ 3:54 오후
Tags:


Makefile 에러 정리

다음은 make의해서 생성될 수 있는 가장 일반적인 에러들의 리스트이며 그것들이 의미하는 바와 그것들을 고치는 방법에 대한 정보이다.

때때로 make 에러들은, 특별히 명령 스크립트 라인에서 - 접두사가 있을 때나 명령 라인 옵션으로써 -k 가 있을 때, 치명적인 것이 아니다. 치명적인 에러들은 *** 문자열이 그 앞에 붙는다.

에러 메시지들은 모두 프로그램(보통 `make’)의 이름이 앞에 붙거나, 에러가 makefile 안에 있는 것이라면 문제를 담고 있는 파일과 라인넘버가 앞에 붙는다.

아래 테이블에서 이런 공통 접두사들이 빠져있다.

`[foo] Error NN
`[foo] signal description
이런 에러들은 실제로 make 에러들이 전혀 아니다. 그들은 make 가 명령 스크립트의 일부로써 호출한 프로그램이, make 가 실패로 해석하는 0이 아닌 에러 코드 (`Error NN‘) 를 리턴하거나 다른 이상한 스타일로(어떤 종류의 시그널과 함께) 종료하였다는 것을 의미한다. *** 가 메시지에 붙어 있지 않으면 서브프로세스가 실패했지만 makefile 의 그 규칙이 특수 문자 - 를 앞에 달고 있어서 make 가 그 에러를 무시한 것이다.
`missing separator. Stop.’
이것은 make 의 일반적인 “Huh?” 에러 메시지이다. 이것은 make 가 makefile 의 이 라이을 파싱하면서 완벽하게 성공하지 못했다는 것을 의미한다. 이것은 기본적으로 “문법 에러(syntax error)” 를 의미한다. 이런 메시지가 나오는 가장 일반적인 이유들 중의 하나는 여러분이 (또는 많은 MS-Windows 에디터들의 경우와 비슷하게, 여러분의 에디터가) TAB 문자 대신에 공백들로 명령 스크립트들을 들여쓰기하려고 하는 것이다. 명령 스크립트에 있는 모든 라인은 반드시 TAB 문자로 시작하는 것을 기억하자. 8개의 공백은 의미가 없다.
`commands commence before first target. Stop.’
`missing rule before commands. Stop.’
이것은 makefile 에서 처음으로 나오는 것이 명령 스크립트의 일부분인 것처럼 보인다는 것을 의미한다: 이것은 TAB 문자로 시작하고 합법적인 make 명령(변수 할당과 같은)처럼 보이지 않는다. 명령 스크립트들은 항상 어떤 타겟과 연결되어 있어야 한다. 두번째 형태는 그 라인이 첫번째 공백문자가 아닌 문자로써 세미콜론을 가진다면 생성된다; make 는 이것을, 어떤 규칙의 “target: dependency” 섹션을 그냥 떠났다는 것으로 해석한다.
`No rule to make target `xxx‘.’
`No rule to make target `xxx‘, needed by `yyy‘.’
이것은 make 가 타겟을 빌드할 필요가 있다고 판단했지만 makefile 안에서 그렇게 하는 것에 대한, 명시적 또는 묵시적(디폴트 규칙 데이터베이스를 포함해서) 규칙들(instructions)도 찾을 수 없다는 것을 의미한다. 그 파일이 빌드되기를 원한다면 그 타겟이 빌드되는 방법을 설명하는 규칙을 추가할 필요가 있다. 이 문제의 다른 가능성은 makefile 을 오자(그 파일 이름이 잘못되었다)했거나 소스 트리가 잘못된 경우이다(그 파일이 빌드될 것으로 생각된 것이 아니고 단지 종속물이다).
`No targets specified and no makefile found. Stop.’
`No targets. Stop.’
전자는 명령행에서 빌드될 타겟을 하나도 제공하지 않았고 make 가 읽어들일 makefile 들을 찾을수 없다는 것을 의미한다. 후자는 어떤 makefile 들이 찾아졌으나 디폴트 타겟이 없고 어떤 것도 명령행에서 주어지지 않았다는 것을 의미한다. 이들 경우에 GNU make 는 아무것도 하지 않는다.
`Makefile `xxx‘ was not found.’
`Included makefile `xxx‘ was not found.’
명령행에서 주어진 makefile (첫번째 형태) 또는 포함된 makefile (두번째 형태) 가 없다.
`warning: overriding commands for target `xxx
`warning: ignoring old commands for target `xxx
GNU make 는 타겟 하나에 대해서 단 한번만 명령들이 지정되는 것을 허락한다(더블-콜론 규칙들을 제외하고). 이미 명령들을 가지도록 정의된 타겟에 대해서 명령들을 다시 주면 이 경고가 발행되고 두번째 명령들은 첫번째 것을 오버라이드할 것이다.
 
`Circular xxx <- yyy dependency dropped.’
make 가 종속성 그래프에서 루프를 발견했다는 것을 의미한다: 타겟 xxx 의 종속물 yyy, 그리고 이것의 종속물들 등등 을 추적한 후 그들중 하나가 xxx 에 다시 종속한다는 의미이다.
 
`Recursive variable `xxx‘ references itself (eventually). Stop.’
이것은 확장될 때 자기자신(xxx)을 참조할 일반 (재귀적인) make 변수 xxx 를 정의했다는 것을 의미한다. 이것은 허용되지 않는다; 단순-확장 변수 (:=) 를 사용하든지 아니면 추가 연산자 (+=) 를 사용하자.
 
`Unterminated variable reference. Stop.’
이것은, 변수나 함수 참조에서 적절하게 닫는 괄호나 중괄호를 제공하는 것을 잊었다는 것을 의미한다.
 
`insufficient arguments to function `xxx‘. Stop.’
이것은 이 함수에 대해서 필요한 개수의 매개변수들을 제공하지 않았다는 것을 의미한다. 매개변수들의 설명에 대해서는 그 함수의 문서를 보자.
`missing target pattern. Stop.’
`multiple target patterns. Stop.’
`target pattern contains no `%’. Stop.’
이들은 잘못된 정적 패턴 규칙들에 대해서 생성된다. 첫번째는 규칙의 타겟 섹션에 어떤 패턴도 없다는 것을 의미하고, 두번째는 타겟 섹션에 다수의 패턴들이 있다는 것을 의미하며, 세번째는 타겟이 패턴 문자 (%) 를 담고 있지 않다는 것을 의미한다.

Makefile:17: *** missing separator. Stop.

Makefile을 작성할 때 명령어(command)부분은 모두 TAB 문자로 시작해야 한다고 첫 번째 장부터 강조하였다. 위의 에러는 TAB 문자를 쓰지 않았기 때문에 make가 명령어인지 아닌지를 구별 못하는 경우이다.

대처: 17번째 줄(근처)에서 명령어가 TAB 문자로 시작하게 바꾼다.

make: *** No rule to make target `io.h', needed by `read.o'. Stop.

위의 에러는 의존 관계에서 문제가 발생했기 때문이다. 즉 read.c가 io.h에 의존한다고 정의되어 있는데, io.h를 찾을 수 없다는 에러이다.

대처: 의존 관계에서 정의된 io.h가 실제로 존재하는지 조사해 본다. 없다면 그 이유를 한번 생각해 본다. make dep를 다시 실행시켜서 의존 관계를 다시 생성시켜 주는 것도 하나의 방법이다.

Makefile:10: *** commands commence before first target. Stop.

위 의 에러는 ‘첫 번째 타겟이 나오기 전에 명령어가 시작되었다’는 애매한 에러 메시지이다. 필자가 경험한 이 에러의 원인은 주로 긴 문장을 여러 라인에 표시를 하기 위해서 ”를 사용할 때, 이를 잘못 사용했기 때문인 것 같다. 즉 ”부분은 라인의 가장 끝문자가 되어야 하는데 실수로 ”뒤에 스페이스를 몇 개 집어넣으면 여지없이 위의 에러가 발생한다.

대처: 10번째 줄(근처)에서 ”문자가 있거든 이 문자가 라인의 가장 끝문자가 되도록 한다. 즉 ”문자 다음에 나오는 글자(스페이스가 대부분) 는 모조리 없애 버린다.

make를 수행시키면 의도했던 실행 파일은 안생기고 이상한 행동만 한다. 가령 make clean 했을 때와 같은 행동을 보인다.

make는 천재가 아니라는 점을 생각해야 한다. make는 Makefile의 내용을 읽다가 첫 번째 타겟으로 보이는 것을 자신이 생성시켜야 할 결과 파일이라고 생각한다. 따라서 clean 부분을 Makefile의 첫번째 타겟으로 정해 버리면 위와 같은 결과가 나타나게 된다.

대 처: 예제 7.1에서 all 이라는 필요 없는 타겟을 하나 만들어 두었다. 이것은 make가 all 을 첫 번째 타겟으로 인식시키기 위함이었다. 따라서 자신이 생성시키고 싶은 결과 파일을 첫 번째 타겟이 되게 하던지, 아니면 예제 7.1처럼 all과 같은 더미 타겟(dummy target)을 하나 만들어 둔다. 그리고 make clean, make dep 같은 부분은 Makefile의 끝부분에 만들어 두는 것이 안전하다.

이미 컴파일했던 파일을 고치지 않았는데도 다시 컴파일한다.

이 행동은 make가 의존 관계를 모르기 때문이다. 즉 사용자가 의존 관계를 설정해 주지 않았다는 말이 된다. 따라서 make는 무조건 모든 파일을 컴파일해서 실행 파일을 만드는 일이 자신이 할 일이라고 생각하게 된다.

대처: 목적 파일, 소스 파일, 헤더 파일들의 의존 관계를 설정해 주어야 한다. gccmakedep *.c 라고 하면 Makefile의 뒷부분에 자동적으로 의존 관계를 만들어 준다. 그외의 다른 파일들에 대해서는 사용자가 적절하게 의존 관계를 설정해 주어야 한다.

main.o : main.c io.h

read.o : read.c io.h

write.o : write.c io.h

위의 예제는 첫 번째 장에서도 제시했던 건데… TARGET : DEPENDENCY의 형식으로 의존 관계를 작성한 것이다. (make에게 의존 관계를 알려주는 방법이죠)

  1. 그 외의 경우에 대해서는 각자가 한번 원인과 결과를 알아보기 바란다. 그리고 팁의 형식으로 글을 올린다면 다른 사람에게도 많은 도움이 될 것이다. 일단 make에서 에러를 내기 시작하면 초보자는 원인조차 모르는 경우가 많기 때문이다.

강좌를 마치면서
이번 make 강좌는 make 유틸리티에 대한 전반적인 이해와 간단한 Makefile 작성을 목적으로 하였습니다. make에 관한 모든 것을 다 소개하지는 않았습니다. (개인적인 능력의 한계 !!) make를 아주 잘 쓰기 위해서는 make 자체에 대한 지식보다는 유닉스(리눅스)의 샐 프로그램과 고난이도(?)의 명령어까지 알고 있어야 하기 때문이죠. 해커가 되려면 이런 지식을 많이 알고 있어야 합니다. 한가지 아쉬운 게 imake에 대해서 설명을 못한 것입니다. imake에 대해서는 make 중급코스란 이름으로 언젠가 강좌를 해보도록 하죠. imake는 Makefile을 생성시켜 준다고 생각하세요)
지 금 make 다음의 강좌로 뭘해야 할지 고민 중입니다. 우선 X 강좌를 하시는 분(아직은 조용하네요)의 강좌의 이해를 높이기 위해서 X의 개념을 2회 정도의 강좌로 할 생각입니다. X 가 왜 X 이고 어떤 특징을 가지고 있는지 한번 살펴보기로 하죠.

원본 : http://wiki.kldp.org/koreandoc/html/gnu ··· e-8.html

12월 5, 2007

error while loading shared libraries

밑에 신청: Tips — sanghoon @ 5:53 오전

내가 library를 내 개인 directory에 설치했을 때 이런 에러가 났다. 해결책은 LD_LIBRARY_PATH에 해당 library directory를 추가하는 것.
예를 들어, ~/lib에 해당 library가 있다면,export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/lib이렇게 해 주면 된다.
그전에 컴파일은 잘 된다. 나는 gsl을 ~에 깔았는데,gcc -lgslcblas poissonserial.c -I/home/wsshin/include -L/home/wsshin/lib이처럼 -I 와 -L을 지정해주면 컴파일에는 문제 없다.


from http://home.bawi.org/~wsshin/blog/archives/000291.html

환경변수

밑에 신청: Tips — sanghoon @ 5:52 오전

csh 쉘을 사용한다면
setenv PATH ${PATH}:/usr/lib/

setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:~/lib

svn command line

밑에 신청: Tips — sanghoon @ 5:49 오전

프로젝트 소스 파일 액세스에 명령줄 서브버전 사용

명령줄 서브버전 시작

서브버전을 사용하여 버전을 관리하는 개발 프로젝트에 참여하는 경우, 프로젝트 소스 파일에 접근하고 변경하려면 서브버전을 사용해야 합니다. 프로젝트의 왼쪽 탐색 창에서 서브버전 링크를 클릭하면 온라인으로 소스 코드를 탐색하면서 프로젝트의 디렉토리 구조 및 파일을 볼 수 있습니다.

서브버전 페이지는 branches/, tags/, trunk/의 3개 하위 디렉토리와 리드미(README) 파일로 구성됩니다. 리드미 파일은 서브버전 저장소에 대한 최상위 보기를 제공합니다. 접근 옵션을 클릭하여 서브버전 클라이언트 설정 지침을 볼 수 있습니다. 먼저 로컬 시스템에 서브버전 클라이언트가 설치되어 있어야 합니다.

프로젝트의 로컬 작업 복사본 가져오기: svn checkout

최신 소스 파일의 “작업 복사본”을 가져오려면 소스 파일을 체크아웃, 즉 저장소에서 시스템으로 파일을 복사하는 과정을 거쳐야 합니다. 셸 또는 터미널 클라이언트에서 다음과 같이 입력합니다.

svn checkout https://(projectname).(domain)/svn/(projectname)/(DIR) (projectname) --username [type-user-name-here]프 롬프트가 나타나면 사용자 패스워드를 입력합니다. 이 사이트의 사용자 계정에서 사용하는 패스워드와 같아야 합니다. 디렉토리를 지정하지 않으면 프로젝트 소스 코드 전체가 체크아웃됩니다. ‘trunk/’ 디렉토리에 작업 ‘www/’ 폴더가 있으므로 이 디렉토리를 체크아웃할 수 있습니다.

스위치: --revision (-r) REV, --quiet (-q), --non-recursive (-N), --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR기본 작업 주기, 초기 체크아웃, 작업 복사본 참조

참고: 사이트에서 SSL(Secured Socket Layer)이 활성화되어 있지 않은 경우 https 대신 http를 사용하여 Subversion 작업을 수행합니다. 예를 들어 프로젝트 저장소에서 최신 소스 코드를 체크아웃하려면 다음 명령을 사용합니다.

svn checkout https://(projectname).(domain)/svn/(projectname)/(DIR) (projectname) --username [type-user-name-here]

서브버전 저장소에서 파일 관리하기

프 로젝트 저장소의 로컬 복사본을 체크아웃했다면 로컬에서 기존 파일을 편집하고 새 파일과 디렉토리를 만들며 파일을 삭제할 수 있습니다. 모든 변경 사항은 서브버전 저장소로 커밋하기 전까지 프로젝트 파일의 로컬 복사본에만 적용됩니다.

작업 복사본에서 저장소로 파일/디렉토리 추가: svn add

새 파일을 만들고 작업 디렉토리에서 이를 편집한 다음 저장소로 추가하거나, 내용이 있거나 없는 디렉토리를 저장소에 추가할 수 있습니다.

svn add FILENAME/DIR을 사용하면 됩니다.그러면 파일/디렉토리를 작업 복사본으로 추가하고, 저장소에 추가할 일정을 정합니다. 다음 번에 커밋을 수행하면 저장소에 업로드되어 추가됩니다. 추가한 것이 있었으나 커밋하기 전에 마음이 바뀌었다면 svn revert를 사용하여 추가 일정을 취소할 수 있습니다.

스위치: --targets FILENAME, --non-recursive (-N), --quiet (-q), --config-dir arg, --auto-props, --no-auto-props파일/디렉토리 추가 예 참조

개정 및 작성자 정보와 함께 파일 내용 보기: svn blame

다음과 같이 입력하면 지정된 파일에서 작성자 및 개정 정보를 인라인으로 볼 수 있습니다.

svn blame FILENAME각 텍스트 줄의 앞에는 작성자(사용자 이름) 및 해당 줄이 마지막으로 변경된 개정 번호가 주석으로 표시됩니다.

스위치: --revision (-r) REV, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

파일 내용 보기: svn cat

작업 복사본이 저장소의 버전보다 오래되었거나 로컬 작업 복사본을 수정했을 수도 있습니다. 이 경우, 변경 사항을 커밋하거나 작업 복사본 편집을 결정하기 전에 해당 파일의 내용 차이점을 확인할 필요가 있습니다. svn cat FILENAME을 실행하면 저장소에서 HEAD 개정판을 자동으로 가져옵니다. 이 하위 명령은 파일을 기존 개정 번호의 상태대로 검색하고 이를 화면에 표시할 때 주로 사용합니다. 또는 이 사이트에서 프로젝트의 소스 코드를 탐색하여 동일한 작업을 수행할 수 있습니다.

스위치: --revision (-r) REV, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

작업 복사본 정리하기: svn cleanup

“작업 복사본 잠김” 오류가 발생할 때가 있습니다. 잠금을 해제하고 작업 복사본을 반복적으로 정리하려면 svn update를 사용합니다.

스위치: --diff3-cmd CMD, --config-dir DIRsvn cleanup 참조

작업 복사본 또는 저장소의 파일이나 디렉토리 복사: svn copy

프로젝트에서 기존 문서를 사용해야 하는 경우가 있습니다. 예를 들어, 새로운 내용을 개발하면서 ‘외양’은 그대로 유지하기 위해 기존 HTML 파일의 코드를 참조할 수 있습니다. 파일을 완전히 새로 만들 필요 없이 svn copy를 사용하여 이 파일을 복사하고 다른 이름으로 저장한 다음 그 내용을 변경할 수 있습니다. 저장소에서 로컬 작업 복사본으로, 또는 그 반대로 파일을 복사할 수 있습니다. 또는 로컬 작업 복사본 내부로부터 파일을 복사할 수도 있습니다. 서브버전에서는 저장소 간 복사는 지원하지 않습니다. 그 작업에는 svn copy SRC DST를 사용합니다.

스위치: --message (-m) TEXT, --file (-F) FILE, --revision (-r) REV, --quiet (-q), --username USER, --password PASS, --no-auth-cache, --non-interactive, --force-log, --editor-cmd EDITOR, --encoding ENC, --config-dir DIRsvn copy 참조

로컬 작업 복사본에서 파일이나 디렉토리 삭제하기: svn delete

로컬 작업 복사본에서 불필요한 파일을 삭제하고 싶은 경우가 있습니다. svn delete FILENAME을 사용하면 파일의 삭제 일정을 정합니다. 커밋을 수행해야 저장소에서 실제로 파일이 삭제됩니다.

스위치: --force, --force-log, --message (-m) TEXT, --file (-F) FILE, --quiet (-q), --targets FILENAME, --username USER, --password PASS, --no-auth-cache, --non-interactive, --editor-cmd EDITOR, --encoding ENC, --config-dir DIR

파일간 차이점 보기: svn diff

svn diff를 사용하면 작업 복사본에서 지정된 파일의 로컬 수정 사항을 저장소 버전과 비교하여 표시할 수 있습니다. 명령 프롬프트에서 다음과 같이 입력합니다.

svn diff (파일 경로) (프로젝트의 저장소 URL)예를 들어, 로컬에서 수정된 “index.html” 파일을 프로젝트 저장소의 파일과 비교하려면 다음과 같이 입력합니다.

svn diff $SRC/...../index.html https://(projectname).(domain)/svn/(projectname)/trunk (projectname) --username [type-user-name-here]또는 파일이 있는 디렉토리로 이동하여 다음과 같이 입력합니다.

svn diff (FILENAME)그러면 개정 번호와 함께 차이점이 표시됩니다.

스위치: --revision (-r) REV, --old OLD-TARGET, --new NEW-TARGET, --extensions (-x) "ARGS", --non-recursive (-N), --diff-cmd CMD, --notice-ancestry, --username USER, --password PASS, --no-auth-cache, --non-interactive, --no-diff-deleted, --config-dir DIR이력 검사, svn diff 참조

로컬 시스템에서 정리된 디렉토리 트리 내보내기: svn export

로컬 시스템상의 버전 없는 복사본, 즉 정리된 트리 디렉토리를 프로젝트 저장소나 로컬 작업 복사본 내부로부터 추출할 수 있습니다. 이전 개정판의 정리된 디렉토리를 저장소로부터 가져오려면 다음과 같이 입력합니다.

svn export [-r REV] [PATH]URL 에 의해 지정된 저장소로부터 개정 REV가 지정되었다면 그곳에서 내보내거나, 아니면 HEAD에서 PATH로 정리된 디렉토리 트리를 내보냅니다. PATH가 생략되면 URL의 마지막 컴포넌트가 로컬 디렉토리 이름으로 사용됩니다. 또는 로컬 시스템 내부에서 PATH1 작업 복사본에서 PATH2 작업 복사본으로 정리된 디렉토리 트리를 내보낼 수도 있습니다. 그러면 로컬 변경 사항이 모두 보존되지만, 버전 관리 대상 파일은 복사하지 않습니다. 이 작업을 수행하려면 다음과 같이 입력합니다.

svn export PATH1 PATH2스위치: --revision (-r) REV, --quiet (-q), --force, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

Subversion에 관한 도움말 가져오기: svn help

서브버전은 명령줄 인터페이스 내부에서 도움말을 제공합니다. 특정 하위 명령에 대한 도움말을 확인하려면 다음과 같이 입력합니다.

svn help [SUBCOMMAND...]스위치: --version, --quiet (-q)

SVN 저장소로 변경 사항 보내기

파일 및/또는 디렉토리를 로컬에서 변경했다면 SVN 저장소로 이 변경 사항을 커밋해야 합니다.

변경 사항 커밋하기: svn commit

공유 저장소로 변경 사항을 커밋하려면 다음과 같이 입력합니다.

svn commit -m "여기에 근거 입력"파 일 변경 사항에 대한 설명을 포함시키지 않으면 svn이 커밋 작업을 완료하기 전에 파일 편집기를 호출하여 이를 추가하라는 메시지가 표시되며, 그렇지 않으면 “커밋 실패” 오류가 발생합니다. 모든 커밋은 자동으로 기록되어 프로젝트의 커밋 메일링리스트에 게시됩니다.

스위치: --message (-m) TEXT, --file (-F) FILE, --quiet (-q), --non-recursive (-N), --targets FILENAME, --force-log, --username USER, --password PASS, --no-auth-cache, --non-interactive, --encoding ENC, --config-dir DIR변경 사항 커밋, editor-cmd 참조

프로젝트 저장소에서 버전 없는 파일 또는 트리 가져오기: svn import

svn import를 사용하여 버전 없는 파일이나 트리를 프로젝트 저장소로 반복 커밋할 수 있습니다. 필요에 따라 저장소에 상위 디렉토리가 만들어집니다. 다음 명령은 PATH에서 URL로 복사본을 반복 커밋합니다. PATH가 생략되면 “.”로 가정합니다.

svn import [PATH] URL예: 로컬 시스템의 파일로 버전 없는 디렉토리 (D)를 만드는 경우. 프로젝트의 왼쪽 탐색 창에서 서브버전 링크를 클릭하여 서브버전 페이지로 이동합니다. 소스 코드 탐색 아래에 NEWDIR이 나열되지 않습니다. 프로젝트 저장소로 D를 가져오려면 다음과 같이 입력합니다.

svn import -m "여기에 메시지 입력" D http://(projectname).(domain)/svn/(projectname)/NEWDIR페이지를 새로 고칩니다. 소스 코드 탐색 아래에 D가 나열됩니다. 파일을 보려면 D를 클릭합니다.

스위치: --message (-m) TEXT, --file (-F) FILE, --quiet (-q), --non-recursive (-N), --username USER, --password PASS, --no-auth-cache, --non-interactive, --force-log, --editor-cmd EDITOR, --encoding ENC, --config-dir DIR, --auto-props, --no-auto-props

작업 복사본에서 경로 정보 인쇄하기: svn info

어떤 하위 명령을 실행하기 위해 작업 복사본의 파일에 대한 특정 정보가 필요할 때가 있습니다. svn info라 고 입력하면 작업 복사본의 작업 복사본 경로에 있는 항목에 대해 경로, 이름, URL, 개정판, 노드 종류, 마지막 변경 시점, 작성자, 마지막으로 변경된 개정 번호, 마지막 변경일, 마지막으로 갱신된 텍스트, 마지막으로 갱신된 등록 정보, 체크섬 등 유용한 모든 정보가 인쇄됩니다.

스위치: --targets FILENAME, --recursive (-R), --config-dir DIR

저장소에서 디렉토리 항목의 목록 보기: svn list

어떤 프로젝트에 대한 작업을 시작하거나 ‘작업 복사본’을 가져오기 전에 그 내용, 즉 프로젝트 저장소에 있는 디렉토리와 파일을 확인하거나 로컬 작업 복사본에 있는 디렉토리 항목을 보고 싶은 경우가 있습니다. 명령 프롬프트에서 svn list [TARGET...]이라고 입력하면 똑같은 내용을 볼 수 있습니다. 또는 프로젝트 내부에서 소프트웨어 구성 관리 페이지로 이동하여 해당 프로젝트의 저장소를 볼 수도 있습니다.

스위치: --revision (-r) REV, --verbose (-v), --recursive (-R), --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

커밋 로그 메시지 보기: svn log

다음과 같이 입력하여 ‘작업 복사본’ 또는 저장소에 있는 파일/디렉토리의 개별 파일/디렉토리 이력을 조회하면서 개정 정보를 추적할 수 있습니다.

svn log [PATH]그 러면 가장 최신 개정판을 시작으로 파일/디렉토리 개정 정보가 표시되며, 커밋 메시지와 작성자 이름 등의 정보가 함께 표시됩니다. 또는 이 사이트를 사용하여 프로젝트 저장소에 있는 개별 파일의 커밋 로그 메시지를 볼 수 있습니다. 프로젝트의 왼쪽 탐색 창에서 서브버전 링크를 클릭합니다. 서브버전 페이지가 나타납니다. 소스 코드 탐색 아래 디렉토리에 있는 파일을 검색하고 파일 이름을 클릭합니다. 그러면 커밋 로그 메시지와 함께 페이지가 표시됩니다.

스위치: --revision (-r) REV, --quiet (-q), --verbose (-v), --targets FILENAME, --stop-on-copy, --incremental, --xml, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIRsvn log 참조

변경 사항 병합하기: svn merge

svn merge 명령을 실행하면 서브버전 기능을 통해 저장소에서 가장 최신 버전의 파일을 작업 복사본으로 병합할 수 있습니다.

스위치: --revision (-r) REV, --non-recursive (-N), --quiet (-q), --force, --dry-run, --diff3-cmd CMD, --ignore-ancestry, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIRsvn merge, 충돌 해결(다른 변경 사항 병합), 브랜치 및 병합: 일반적인 병합 사용 사례, 병합 베스트 프랙티스 참조

저장소를 이용한 작업하기

새 디렉토리 만들기: svn mkdir

작업 디렉토리에서 새 디렉토리를 만들려면 다음과 같이 입력합니다.

svn mkdir PATH프로젝트 저장소에서 새 디렉토리를 만들려면 다음과 같이 입력합니다.

svn mkdir URLPATH 또는 URL의 마지막 컴포넌트에 의해 디렉토리 이름이 결정됩니다. 저장소에서 디렉토리는 즉시 커밋이 수행되면서 만들어지므로 커밋 메시지가 필요합니다.

스위치: --message (-m) TEXT, --file (-F) FILE, --quiet (-q), --username USER, --password PASS, --no-auth-cache, --non-interactive, --editor-cmd EDITOR, --encoding ENC, --force-log, --config-dir DIR

파일 또는 디렉토리 이동: svn move

svn move SRC DST를 사용하면 작업 복사본이나 프로젝트 저장소 내부에서 파일이나 디렉토리를 옮길 수 있습니다. 이 명령은 svn copy 다음에 svn delete를 실행하는 것과 동일한 결과를 가져옵니다. 작업 복사본 내부에서 파일이나 디렉토리를 이동할 경우, 파일이나 디렉토리가 옮겨지고 다음 커밋에 추가되도록 일정이 계획됩니다. 프로젝트 저장소 내부에서 파일이나 디렉토리를 옮기면 자동으로 커밋이 수행되므로 커밋 메시지가 필요합니다.

스위치: --message (-m) TEXT, --file (-F) FILE, --revision (-r) REV, --quiet (-q), --force, --username USER, --password PASS, --no-auth-cache, --non-interactive, --editor-cmd EDITOR, --encoding ENC, --force-log, --config-dir DIR

등록 정보 관리하기

서 브버전에는 그 동작을 결정짓거나 영향을 미치는 등록 정보가 많습니다. 파일의 내용처럼 등록 정보 변경 사항도 수정, 커밋, 취소할 수 있습니다. 로컬 작업 복사본이나 프로젝트 저장소에서 파일, 디렉토리 또는 개정판의 등록 정보를 삭제, 편집, 인쇄, 나열하거나 설정할 수 있습니다.

속성, 버전 없는 속성, 메타데이터 속성, svn propdel, svn propedit, svn propget, svn proplist, svn propset, Hook 스크립트 참조

충돌 해결: svn resolved

로컬 작업 복사본을 갱신하는 중 충돌이 발생할 수 있습니다. 이 경우 충돌을 해결해야 합니다. 충돌 해결 후 svn resolved PATH...라고 입력하여 충돌이 ‘해결’되었음을 작업 복사본에 알립니다.

스위치: --targets FILENAME, --recursive (-R), --quiet (-q), --config-dir DIR

충돌 해결(다른 변경 사항 병합) 참조

변경 사항 취소하기: svn revert

서브버전에서 svn revert PATH...는 Windows의 Ctrl Z와 같습니다. 여러 가지 옵션이 있습니다.

  • 로컬 작업 복사본에서 로컬 변경 사항을 취소하여 충돌된 상태를 해결합니다.
  • 작업 복사본에서 어떤 항목의 내용 및 그 속성 변경 사항을 취소합니다.
  • 파일 추가, 파일 삭제와 같은 일정 계획 작업을 수행합니다.

참고: 대상을 지정하지 않으면 작업 복사본의 변경 사항을 잃게 될 수 있습니다.

스위치: --targets FILENAME, --recursive (-R), --quiet (-q), --config-dir DIR

파일/디렉토리의 상태 가져오기: svn status

버전 관리에서는 변경 사항을 프로젝트 저장소로 커밋하기 전에 검토하는 것이 좋습니다. svn status를 실행하여 작업 복사본의 파일 및 디렉토리 상태를 인쇄할 수 있습니다. 이 명령을 실행하면 코딩된 8개 열이 출력됩니다. 열마다 긴 설명이 붙어 있으므로 이 출력에서 ‘오류 없는’ 결론을 이끌어내기는 어렵습니다. 이 작업을 더 간단하게 해결하고 예를 함께 볼 수 있으려면 명령 프롬프트에서 svn help status라고 입력합니다.

스위치: --show-updates (-u), --verbose (-v), --non-recursive (-N), --quiet (-q), --no-ignore, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir

변경 사항 검사를 확인하십시오.

작업 복사본 전환하기: svn switch

svn switch URL [PATH]를 사용하면 새 URL을 미러링하도록 작업 복사본을 갱신할 수 있습니다. 작업 복사본 또는 그 일부를 새 브랜치로 이동할 수 있습니다. 이 하위 명령을 브랜치 바로가기로 사용할 수 있습니다.

스위치: --revision (-r) REV, --non-recursive (-N), --quiet (-q), --diff3-cmd CMD, --relocate, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

작업 복사본 전환, 브랜치 및 병합svn switch 참조

작업 복사본 갱신하기: svn update

버전 관리에서는 다음 명령을 사용하여 로컬 작업 복사본을 프로젝트 저장소로 매일 갱신하는 것이 좋습니다.

svn update [PATH...]

갱신된 항목은 다음과 같이 표시되는 현재 상태와 함께 나열됩니다.

  • A = 파일이 작업 복사본에 추가되었습니다.
  • U = 파일이 작업 복사본에서 갱신되었습니다.
  • D = 파일이 작업 복사본에서 삭제되었습니다.
  • R = 파일이 작업 복사본에서 대체되었습니다.
  • G = 파일이 성공적으로 병합되었습니다.
  • C = 파일에 병합 충돌이 발생해 수동으로 해결해야 합니다.

스위치: --revision (-r) REV, --non-recursive (-N), --quiet (-q), --diff3-cmd CMD, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR

작업 복사본 갱신, 수동 병합 충돌 참조

브랜치 및 태그

일 반적으로 프로젝트의 트렁크는 주 개발 라인에서 사용되지만, 브랜치는 그 라인의 변형에서 사용됩니다. 브랜치는 진행형 개발 라인입니다. 소프트웨어 개발 생명주기에서 어떤 소프트웨어 제품의 출시가 예정된 가운데 테스트 담당자들이 예비 릴리즈를 대상으로 작업을 수행하도록 허용함으로써 테스트와 상관 없이 새로운 개발이 진행되게 할 때 브랜치를 자주 사용합니다. 또한 브랜치는 실험적인 작업을 수행하거나 코드 전체를 재작성할 때에도 사용됩니다. 태그는 파일 개정판을 함께 묶어서 그룹으로 만드는 방법입니다. 브랜치와 태그는 svn copy 하위 명령을 사용하여 만들지만, 이 두 가지는 서로 다른 개념입니다. 브랜치는 여러 개정판을 나타내지만 태그는 하나의 개정판을 나타냅니다.

이 사이트에서 호스팅되는 프로젝트의 서브버전 저장소에서는 소스 파일의 브랜치 및 태그 작업을 지원합니다. 태그와 브랜치는 서브버전에 대한 손쉽고 실용적인 ‘복사’ 작업입니다.

브랜치 또는 태그 프로젝트 파일을 만들려면 다음과 같이 입력합니다.

svn copy SRC DST -m "여기에 메시지 입력"

브랜치 및 병합 참조

from:

http://www.open.collab.net/scdocs/ddUsingSVN_command-line.html.ko#workwithfiles

svn

밑에 신청: Tips — sanghoon @ 5:45 오전

SVN 사용법

용어 설명
저장소 : 리포지토리(Repository)라고도 하며 모든 프로젝트의 프로그램 소스들은 이 저장소 안에 저장이 됩니다. 그리고 소스뿐만이 아니라 소스의 변경 사항도 모두 저장됩니다. 네트워크를 통해서 여러 사람이 접근 할 수 있습니다. 버전 관리 시스템 마다 각각 다른 파일 시스템을 가지고 있으며 Subversion은 Berkeley DB를 사용합니다. 한 프로젝트 마다 하나의 저장소가 필요합니다.

리비전(Revision) : 소스 파일등을 수정하여 커밋하게 되면 일정한 규칙에 의해 숫자가 증가 합니다. 저장소에 저장된 각각의 파일 버전이라 할 수 있습니다. Subversion의 경우 파일별로 리비전이 매겨지지 않고 한번 커밋 한 것으로 전체 리비전이 매겨 집니다. 리비전을 보고 프로젝트 진행 상황을 알 수 있습니다.

trunk : 단어 자체의 뜻은 본체 부분, 나무줄기, 몸통 등 입니다. 프로젝트에서 가장 중심이 되는 디렉토리입니다. 모든 프로그램 개발 작업은 trunk 디렉토리에서 이루어집니다. 그래서 위의 구조에서 trunk 디렉토리 아래에는 바로 소스들의 파일과 디렉토리가 들어가게 됩니다.

branches : 나무줄기(trunk)에서 뻗어져 나온 나무 가지를 뜻합니다. trunk 디렉토리에서 프로그램을 개발하다 보면 큰 프로젝트에서 또 다른 작은 분류로 빼서 따로 개발해야 할 경우가 생깁니다. 프로젝트안의 작은 프로젝트라고 생각하면 됩니다. branches 디렉토리 안에 또 다른 디렉토리를 두어 그 안에서 개발하게 됩니다.

tags : tag는 꼬리표라는 뜻을 가지고 있습니다. 이 디렉토리는 프로그램을 개발하면서 정기적으로 릴리즈를 할 때 0.1, 0.2, 1.0 하는 식으로 버전을 붙여 발표하게 되는데 그때그때 발표한 소스를 따로 저장하는 공간입니다. 위에서 보면 tags 디렉토리 아래에는 버전명으로 디렉토리가 만들어져 있습니다.

명령어 의미
Import : svn import sampledir svn+ssh://svn-domain/svn/sample/trunk
맨 처음 프로젝트 시작할때 저장소에 등록하는 명령어 한 번 하고 나면 쓸일이 잘 없을 듯.

Checkout : svn checkout svn+ssh://svn-domain/svn/sample/trunk sample
저장소에서 소스를 받아 오는 명령어. 받아온 소스에는 소스 뿐만이 아니라 버젼관리를 위한 파일도 같이 받아 온다. 지우거나 변경시 저장소와 연결 불가능

Export : svn export svn+ssh://svn-domain/svn/sample2/trunk sample
체크아웃과는 달리 버젼관리 파일을 뺀 순수한 소스만 가져오는 명령어 마지막에 사용.

Commit : svn commit
체크아웃 한 소스를 수정, 파일 추가, 삭제 등을 한 뒤 저장소에 저장하여 갱신 하는 명령어. Revision이 1 증가 한다.

Update : svn update
체크아웃 해서 받은 소스를 최신의 소스로 업데이트 하는 명령어. 소스 수정이나 Commit 하기전에 한 번씩 해줘야 할 듯. 잘 못하면 소스 망치는 경우가 있을 듯.

Log : svn log
저장소에 어떠한 것들이 변경 되었는지 확인 할 수 있는 log 명령어

Diff : svn diff –revision 4 sample.c
diff 명령은 예전 소스 파일과 지금의 소스 파일을 비교해 보는 명령어

Blame : svn blame sample.c
Blame은 한 소스파일을 대상으로 각 리비전 대해서 어떤 행을 누가 수정했는지 알아보기 위한 명령어

lock : svn lock hello.c
파일에 락을 걸어 락을 건 사용자만이 수정할 수 있게 해주는 명령어. 해제는 svn unlock.
왜 파일에 락을 걸었는지 로그를 기록 할 수 있다.

Add : svn add hello.c
새 파일을 만들었을 경우에 파일을 추가 해주는 명령어. 그 뒤엔 꼭 svn commit를 꼭 해줘야 한다.
새 파일을 생성해서 올릴 때에도 꼭 add를 해줘야 함. 안해주면 commit을 해도 안 올라감.

파일 백업및 복구
dump : svnadmin dump sample > sample.dump
load : svnadmin load sample < sample.dump
새 파일을 만들었을 경우
1. svn add filename.*
2. svn ci filename.*

그냥 기존 소스 수정할 경우
1. svn ci filename.*

항상 svn update는 꼭 해주자

svn status : 자신이 수정하고 있는 파일의 상태를 알려주는 명령어

from http://timehappy.net/tt/809

tar

밑에 신청: Tips — sanghoon @ 5:44 오전

tar -jxvf ~.tar.bz2
tar -zxvf ~tar.gz

자세한 사항은 man tar

grep

밑에 신청: Tips — sanghoon @ 5:43 오전
Tags:

grep -nr “string” ~/

find

밑에 신청: Tips — sanghoon @ 5:42 오전

ind 라는 명령으로, 디스크에 저장된 각종 파일/디렉토리를 검색할 수 있습니다.

파일 찾기 (파일명 검색)

현재 디렉토리에서, pl 확장자를 가진 모든 파일 찾기

find -name ‘*.pl’

(현재 디렉토리 밑의 하위 디렉토리까지 다 찾습니다.)

루트에서부터, 즉 전체 하드에서, pl 확장자를 가진 모든 파일 찾기

find / -name ‘*.pl’

전체 하드 디스크에서, 파일명이 ab 로 시작하는 모든 파일 찾기

find / -name ‘ab*’

전체 하드 디스크에서, 파일명이 .bash 로 시작하는 모든 파일 찾기

find / -name ‘.bash*’

전체 하드 디스크에서, 파일명이 .bash 로 시작하는 모든 파일 찾기
+ ls 명령 형식으로 출력

find / -name ‘.bash*’ -ls

뒤에 -ls 라는 옵션을 붙이면 됩니다.

from http://mwultong.blogspot.com/2006/10/find-linux-file-find-command.html

Blog at WordPress.com.