작업 복사본을 재설정하는 Subversion 명령이 있습니까?


110

작업 복사본을 저장소에 저장된 상태로 정확히 "재설정"하는 단일 Subversion 명령이 있습니까? 같은 뭔가 git reset --hard나 (하, 하드 힘내 재설정 중 버전없는 파일을 삭제하지 않습니다!) rm -rf wc && svn co <url> wc.

업데이트 : 작업 복사본에서 추가 파일을 삭제하지 않기 때문에 간단한 되돌리기를 수행하지 않았습니다. 데이터를 다시 다운로드 할 필요없이 작업 복사본을 삭제하고 다시 체크 아웃하는 것과 동일한 것을 정말로 원합니다. (분명히 커밋되지 않은 모든 변경 사항을 잃어도 괜찮습니다.)


작업 복사본의 모든 변경 사항을 되 돌리시겠습니까?
mauris

5
git clean -xdf소스 제어하에 있지 않은 것을 제거 하는 데 사용 합니다.
vcsjones 2011-06-01

1
@vcsjones : 감사 git clean합니다. 제가 찾고있는 따옴표에 대한 맨 페이지 : "이는 (아마도 git reset과 함께) 사용하여 깨끗한 빌드를 테스트하기위한 깨끗한 작업 디렉토리를 만들 수 있습니다." Subversion에 이와 같은 내장 기능이없는 것 같아 안타깝습니다.
zoul

답변:


180

다음과 같이 재귀 적으로 되돌릴 수 있습니다.

svn revert --recursive .

(크리에이티브 스크립트를 작성하지 않고) 소스 제어하에 있지 않은 것을 제거 할 수있는 방법은 없습니다. 가장 가까운 방법은 모든 파일을 반복하고 grep의 결과를 사용 svn list하고 grep이 실패하면 삭제하는 것입니다.

편집 : 크리에이티브 스크립트의 솔루션은 여기에 있습니다 : Subversion 버전이 지정되지 않은 파일 자동 제거

따라서 revert연결된 질문에서 가장 적합한 답변과 를 결합하는 스크립트를 만들 수 있습니다 .


3
svn cleanup먼저 wc 에서 실행 하는 것이 좋습니다. 이것은 중단 된 병합 후 정리를위한 나의 표준 관행입니다.
Mike Miller

tortoise는 또한 정리 대화 상자에 "버전이없는 파일 제거"옵션이 있습니다.
v.oddou

2
명령 줄을 통해 "버전없는 파일 제거"를 사용할 수 있다면 좋을 것입니다. 특히 자동화 된 빌드의 경우.
C. Tewalt 2014 년

3
내 대답을 참조하십시오 ... --remove-버전없는이 SVN 정리 존재
데니 와인버그

38

추적 된 파일을 되돌리려면

svn revert . -R

추적되지 않은 파일을 정리하려면

svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')

-rf/ 처음에는 무서워 보이지만, 한 번 이러한 이유로하지 않습니다 이해한다 수 있습니다 :

  1. 완전히 추적되지 않은 디렉토리 만 전달 된 패턴과 일치합니다. rm
  2. -rf다른 이들 디렉토리가 제거되지 않습니다 필요합니다

되 돌린 다음 정리하려면 (OP 질문)

svn revert . -R && svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')

일관된 사용 편의성

.bash_aliases에 영구 별칭 추가

alias svn.HardReset='read -p "destroy all local changes?[y/N]" && [[ $REPLY =~ ^[yY] ]] && svn revert . -R && rm -rf $(awk -f <(echo "/^?/{print \$2}") <(svn status) ;)'

두 번째 스 니펫이 나를 위해 작동하지 않는 것 같습니다.awk: fatal: error reading input file '-': Input/output error
hbogert

명령 ?에서 를 이스케이프해야 했습니다. awk그렇지 않으면 출력의 모든 행과 일치합니다svn status
gpanders

23

다음을 사용하여 로컬 사본 내의 모든 것을 삭제하십시오.

rm -r your_local_svn_dir_path/*

그리고 아래 명령을 사용하여 모든 것을 재귀 적으로 되돌립니다.

svn revert -R your_local_svn_dir_path

파일이 로컬 SVN 메타 데이터에서 복원되기 때문에 전체 디렉토리를 삭제 한 다음 새로 체크 아웃하는 것보다 훨씬 빠릅니다. 네트워크 연결도 필요하지 않습니다.


4
훨씬 빠른 svn cleanup --remove-unversioned입니다.
Znik

7
svn revert . -R

모든 것을 재설정합니다.

svn revert path/to/file

단일 파일


1
작업 복사본에서 버전이 지정되지 않은 추가 파일을 삭제하지 않습니까?
zoul

나는 그렇게 생각하지 않습니다 @zoul,하지만 난 SVN 사용 이후 잠시 된 이후 그 날을 인용하지 않습니다
아베 Voelker

불행히도 추적되지 않은 파일은 건드리지 않습니다. SVN 되돌리기 -R your_local_svn_dir_path 시도
Znik

7

버전이 지정되지 않은 파일을 삭제하고 변경 사항을 되돌립니다.

svn revert D:\tmp\sql -R
svn cleanup D:\tmp\sql --remove-unversioned

밖:

D         D:\tmp\sql\update\abc.txt

1
추가 스크립팅없이 이것이 최상의 답변입니다. 이것은 보편적이며 많은 svn 버전과 호환됩니다.
Znik

3

순수 Windows cmd / bat 솔루션 :

svn cleanup .
svn revert -R .
For /f "tokens=1,2" %%A in ('svn status --no-ignore') Do (
     If [%%A]==[?] ( Call :UniDelete %%B
     ) Else If [%%A]==[I] Call :UniDelete %%B
   )
svn update .
goto :eof

:UniDelete delete file/dir
IF EXIST "%1\*" (
    RD /S /Q "%1"
) Else (
    If EXIST "%1" DEL /S /F /Q "%1"
)
goto :eof

2

OS에서 작업 복사본을 삭제하고 다시 확인하는 것이 가장 간단하지만 분명히 단일 명령은 아닙니다.


고통스럽게 느리다. 이것이 제가이 문제를 해결할 방법을 찾고 있었던 이유입니다.
zoul

1
+1, 이것은 적어도 내가 찾은 이상한 문제를 해결하는 유일한 방법입니다.
Brad

2

매우 빠르고 간단하며 원하는 것을 정확하게 수행합니다.

svn status | awk '{if($2 !~ /(config|\.ini)/ && !system("test -e \"" $2 "\"")) {print $2; system("rm -Rf \"" $2 "\"");}}'

/(config|.ini)/는 내 목적을위한 것입니다.

svn 명령에 --no-ignore를 추가하는 것이 좋습니다.


2
이것은 너무 끔찍합니다. Windows 사용자는 어떻습니까? Subversion은 버전 관리 도구로 진지하게 받아들이 기 전에 분명히 약간의 작업이 필요합니다.
Warren P

1

추적되지 않는 파일을 제거하려면

다음 svn st을 수행하여 bash에서 보고 된 추적되지 않은 모든 파일을 나열 할 수있었습니다 .

echo $(svn st | grep -P "^\?" | cut -c 9-)

운이 좋다면로 대체 echo하여 rm추적되지 않은 파일을 삭제할 수 있습니다. 또는 운이 좋지 않다면 삭제하려는 파일을 직접 복사하십시오.


(나머지 파일을 되돌리려면 @ abe-voelker의 답변을 사용했습니다 : https://stackoverflow.com/a/6204601/1695680 )

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.