내밥줄/개발

[펌]svn status

jjoell 2014. 11. 13. 14:25

 

내 작업 사본의 파일/디렉토리의 상태를 나타내는 명령입니다.
update 명령으로 저장소의 작업물과 동기화 시킨 직후라면 status 명령은 아무 값도 리턴하지 않습니다.
저장소와 내 작업 사본의 내용이 동일하기 때문입니다.
update 이후에 저장소에 변경된 작업물이 있는지, 혹은 update 이후에 내 작업 사본에 변경된 작업물이 있는지를 확인할 수 있습니다.
결국 status 명령은 저장소와 내 작업 사본의 작업물과의 동일하지 않은 파일 및 디렉토리를 알려줍니다.
특정 파일 및 디렉토리가 추가되었는지 변경되었는지 삭제되었는지 충돌하였는지 등을 알 수 있습니다.

 

 

status (st)
usage : svn status(st) [PATH...]

 

작업 사본(working copy)의 모든 파일/디렉토리들의 상태를 나타냅니다.
-v 옵션은 모든 파일에 대해 리비전 정보까지 나타냅니다.
-q 옵션은 작업 사본에서 변경된 작업물만 나타냅니다.(? 마크의 작업물은 나타나지 않음)
-u 옵션은 작업 사본 작업물들의 현재 리비전과 저장소의 최신 리비전을 알 수 있고 최신 리비전과 내용이 다른 작업물은 * 마크로 확인이 가능합니다.

 

파일 한개를 생성하고 커밋하고 다시 수정하고 다시 커밋하는 예를 status 명령으로 상세히 보겠습니다.

 

$ svn up
At revision 10.
// 동기화 후 현재 리비전 출력.

$ svn st
// 아무변화 없음. 저장소와 작업물이 동기화 된 상태이므로.

$ cat > test.txt
// 파일 생성 후

$ svn st
?        test.txt
// 작업 사본 영역에 버전 관리 대상이 아닌 것(?)이 있음.
// 이 상태에서는 test.txt 를 커밋하려 해도 커밋이 되지 않습니다. 버전 관리 대상이 아니기 때문에.
// 다시 update 명령을 날린다 해도 변화는 일어나지 않습니다. 버전 관리 대상이 아니기 때문에.
// 상태가 물음표(?)인 파일을 버전 관리 대상으로 만들기 위해서 add 명령이 있습니다.

$ svn add test.txt
A        test.txt
// 버전 관리 대상으로 예약 되었다는 상태(A:Add)가 표시됩니다.
// 이 상태에서 update 명령을 사용하면 저장소에는 test.txt 파일이 없기 때문에 작업 사본에서도 지워질까요?
// 작업 사본 영역의 상태들은 예약임을 뜻합니다. 아직까지는 작업 사본에서만의 버전 관리 대상입니다.
// 저장소는 이 파일(text.txt)의 존재를 모르므로 지워지지 않습니다.

$ svn ci -m 'add test.txt by oops' test.txt
Sending        test.txt
Transmitting file data .
Committed revision 11.
// 커밋으로부터 리비전이 1증가하게 됩니다.
// 커밋하기 전에 다른 사용자가 몇번의 커밋을 사용하여 리비전이 이미 증가되고 업데이트된 작업물이 있을 수 있으니
// 커밋 전에는 항상 update 명령을 사용하는 습관을 들입니다.

$ svn up
At revision 11.
$ svn st
// 저장소와 내 작업 사본의 최신 리비전인 11 에서 변경된 작업물이 없으므로 아무 것도 출력되지 않습니다.

 

* 출력된 작업물 상태 설명 라인의 마크 설명

 

위 예에서 처럼 상태를 나타내는 마크는 7칸에 걸쳐 나타날 수 있습니다.
작업시에는 보통 첫번째 컬럼의 마크를 자주 보게 됩니다.

 

$ svn st
?______ test.txt

 

 

1. 첫번째 7컬럼 중 첫번째 컬럼 : 작업물이 추가되거나, 삭제되거나, 다른 변경이 있는지 여부
' ' 변경 없음
'A' 추가되었음(Add)
'C' 충돌했음(Conflicted)
'D' 삭제됐음(Deleted)
'I' svn:ignore 로 무시된 작업물
'M' 변경됐음(Modified)
'R' 교체됐음(Replaced)
'X' svn:externals 로 지정된 외부 관리 대상인 디렉토리
'?' 버전관리 대상이 아닌 작업물
'!' 불안전한 파일이거나 버전관리 대상이지만 svn 명령어를 사용하지 않고 삭제되었음.
'~' 저장소와 작업 사본에 이름은 같지만 다른 타입의 개체로 존재함. (파일-디렉토리).

 

2. 두번째 컬럼 : 작업물 속성의 변경 여부
' ' 변경 없음
'C' 충돌했음(Conflicted)
'M' 변경됐음(Modified)

 

3. 세번째 컬럼 : 작업 사본 디렉토리가 잠겼는지 여부
' ' 잠기지 않았음
'L' 잠겼음(Lock)

 

4. 네번째 컬럼 : 과거의 커밋로그를 포함하여 전송될 예정인지 여부
' ' 과거의 커밋로그를 포함하지 않음
'+' 과거의 커밋로그를 포함

 

5. 다섯번째 컬럼 : 작업물이 전환되거나 외부 파일인지 여부
' ' 기본 작업물
'S' branches 나 tags 로 전환된 작업물임
'X' svn:externals 지정으로 생성된 버전관리 파일임

 

6. 여섯번째 컬럼 : 저장소 잠금 토큰
' ' 잠금 토큰 아님
'K' 잠금 토큰 존재(toKen)
-u 옵션 사용시
' ' 저장소가 잠기지 않았고, 잠금 토큰도 아님
'K' 저장소가 잠겼고, 잠금 토큰 존재
'O' 저장소가 잠겼고, 다른(Other) 작업 사본에 잠금 토큰 존재
'T' 저장소가 잠겼고, 잠금 토큰이 존재하지만 사라짐(sTolen)
'B' 저장소가 잠기지 않았고, 잠금 토큰은 존재하지만 깨졌음(Broken)

 

7. 일곱번재 컬럼 : 구조(tree)의 충돌로 영향을 받은 작업물인지 여부
' ' 기본 작업물
'C' 트리 충돌 (다음 행에 충돌에 대한 부연 설명 출력)
아홉번째 컬럼 : 최신 리비전 여부 (-u 옵션 사용시)
' ' 최신 리비전
'*' 저장소에 새로운 리비전이 존재

 

$ svn st -u wc
?                   wc/new.c
!            965    wc/txt.c
 M           965    wc/bar.c
       *     965    wc/foo.c
D            965    wc/del.c
A  +         965    wc/qax.c
I            965    wc/session
Status against revision:   981

 

new.c(?) 새로 생성되었고 버전관리 대상이 아닙니다. commit 에도 영향을 받지 않으며 버전관리 하기 위해서는 add 후 commit 하면 됩니다. ?를 가진 파일이 많다면 status 명령시 -q 옵션으로 ? 파일들은 출력되지 않게 할 수 있습니다.
txt.c(!) 버전관리 대상이지만 svn del 명령이 아닌 삭제나 이동등으로 파일이 존재하지 않습니다. revert로 복구합니다.
bar.c(M) 두번째 컬럼이므로 파일 속성이 변경되었음을 뜻합니다. 예로 동일한 파일명이지만 덮어씌워지거나 하여 원래의 속성의 파일이 아닌 경우 발생합니다. commit 시 저장소에 적용됩니다.
foo.c(*) 최신 리비전에 변경 사항이 있는 파일입니다. update시 최신 리비전의 변경사항을 저장소에서 작업 사본으로 가져옵니다.
del.c(D) 작업 사본에서 삭제가 예약된 파일입니다. commit 시 저장소에서도 삭제됩니다.
qax.c(A+) svn copy나 move 등으로 새로 생성되었고 기존 파일의 히스토리도 가지고 있는 파일입니다. commit 시 저장소에도 추가됩니다.
session(I) 저장과 삭제가 반복되는 session 디렉토리나 temp_image 디렉토리 같은 경우는 버전관리 대상이지만 svn:ignore 옵션으로 무시합니다. 무시하지 않는다면 session 디렉토리에 생성되는 무수히 많은 세션관련 파일들이 ?로 나타날 것입니다.

 

출처:http://www.oops4u.com/1685