작업 사본에서 버전이없는 / 무시 된 파일 / 폴더를 모두 삭제하려면 어떻게해야합니까?


136

Subversion 저장소의 작업 사본이있는 경우 단일 명령 또는 도구를 사용하여 작업 사본에서 버전이 없거나 무시 된 모든 파일을 삭제하는 방법이 있습니까? 본질적으로 SVN 아날로그를 찾고 git clean있습니다.

TortoiseSVN의 경우 명령 줄 또는 GUI 솔루션을 사용할 수 있습니다.


답변:


98

TortoiseSVN 사용 :

  • Shift 키를 누른 상태 에서 작업중 인 복사 폴더를 마우스 오른쪽 버튼으로 클릭하십시오.
  • "버전없는 항목 삭제"를 선택하십시오.

7
좋은 기능! XP의 목록보기 (트리보기가 아닌)에서만 작동한다는 것을 알기 위해 링크를 읽어야했습니다. 아마도 대답에 포함시켜야합니다.
Nick Meyer

5
svn의 명령 행 버전 (특히 Windows에서)이 동일한 기능을 제공하지 않습니까?
blong

3
sombody가 아래 지적한 바와 같이 :svn cleanup --remove-unversioned --remove-ignored .
haui

133
svn status --no-ignore | grep '^[I?]' | cut -c 9- | while IFS= read -r f; do rm -rf "$f"; done

여기에는 다음과 같은 기능이 있습니다.

  • 무시되고 추적되지 않은 파일이 모두 삭제됩니다
  • 파일 이름에 공백이 포함되어 있어도 작동합니다 (줄 바꿈 제외). --xml옵션을 사용 하고 결과 xml 출력을 구문 분석하는 것 외에는 수행 할 수있는 것이 많지 않습니다 )
  • svn status파일 이름 앞에 다른 상태 문자를 인쇄 하더라도 작동 합니다 (파일을 추적하지 않기 때문에 경우에 대비하여 ...)
  • POSIX 호환 시스템에서 작동해야합니다.

svnclean다음을 포함 하는 쉘 스크립트를 사용합니다 .

#!/bin/sh

# make sure this script exits with a non-zero return value if the
# current directory is not in a svn working directory
svn info >/dev/null || exit 1

svn status --no-ignore | grep '^[I?]' | cut -c 9- |
# setting IFS to the empty string ensures that any leading or
# trailing whitespace is not trimmed from the filename
while IFS= read -r f; do
    # tell the user which file is being deleted.  use printf
    # instead of echo because different implementations of echo do
    # different things if the arguments begin with hyphens or
    # contain backslashes; the behavior of printf is consistent
    printf '%s\n' "Deleting ${f}..."
    # if rm -rf can't delete the file, something is wrong so bail
    rm -rf "${f}" || exit 1
done

2
정확히 내가 찾던 것은 리눅스와 MacOS에서도 매력처럼 작동합니다!
rich

IFS를 재설정해야합니까? 나는 'svnclean'스크립트를 작성하지 않기로 선택했습니다. 그래서 스크립트의 나머지 부분에서 IFS를 망칠 지 궁금합니다.
C. Tewalt

3
@matrixugly : 아니요 IFS. 이전 상태로 다시 변경할 필요가 없습니다 . 당신이 할 때 VARNAME=value command의 할당 valueVARNAME만은 실행하는 동안 적용 command(적용되지 않는 일부 예외를 제외하고 read). 자세한 내용 은 POSIX 사양이 POSIX 버그 보고서 를 참조하십시오.
Richard Hansen

@rich, 이것을 공유해 주셔서 감사합니다. 몇 년 전에 svn 정리 솔루션을 찾고 왔으며 쉘 스크립팅 지식을 잃어 버렸습니다! 분명히 나는이 대답에 꽤 되돌아왔다.
C. Tewalt

120

나는 이것이 그 위에 오래된하지만의 경우 다른 사람 비틀 거림, SVN 지원의 최신 버전 (1.9 이상)을 알고 --remove-unversioned, 예 svn cleanup . --remove-unversioned.

https://subversion.apache.org/docs/release-notes/1.9.html#svn-cleanup-options


18
저에게는 이것이 정답입니다. 크로스 플랫폼 명령 줄 답변입니다. 또한 다음을 사용하여 무시 된 파일을 제거 할 수 있습니다.svn cleanup . --remove-ignored
Dan Atkinson

1
svn 1.6 이상에서 작동합니다.
wegry

2
1.9로 변경하십시오. subversion.apache.org/docs/release-notes/1.9.html 도 참조하십시오 (로컬로 시도했지만 작동하지 않고 1.8.8에 있습니다)
ikku100

2
문제는 버전이없는 폴더를 제거하지 않는 것 같습니다 .
Nyerguds

1
@Nyerguds : 사실, 버전없는 폴더는 삭제하지 않고 버전없는 파일 만 삭제합니다. 누구든지 해결책을 찾았습니까?
dhiraj suvarna

42

이 oneliner가 도움이 될 수 있습니다.

$ svn status | grep '^?' | awk '{print $2}' | xargs rm -rf

조심해서 사용하십시오!


13
이 무시 파일을 제거하지 않고 파일 이름에 공백이 포함 된 경우 중단됩니다
리차드 한센

1
또한 무시 된 파일을 삭제하지 않습니다
plaisthos

4
svn status --no-ignore무시 된 파일을 잘 캡처하는 데 사용할 수 있습니다 .
Codure

3
사실, 선택적으로 무시 된 파일을 그대로 두는 기능이라고 생각합니다.
macetw

15

Powershell을 사용하여 Yanal-Yves Fargialla 및 gimpf의 답변 수정 (그러나 Stackoverflow에서 원래 게시물에 댓글을 달 수는 없음) :

powershell -Command "&{(svn status --no-ignore) -match '^[\?i]' -replace '^.\s+' | rm -recurse -force}

이렇게하면 캐럿 ( "^")이 추가되어 줄의 시작을 지정하여 문자 "i"를 포함하는 모든 파일과 일치하지 않습니다. 또한 -recurse 및 -force에 대한 플래그를 rm에 추가하여이 명령을 대화식이 아니므로 스크립트에서 사용할 수있게하십시오.


이 명령에는 끝에 큰 따옴표가 필요합니다. 방금 추가했지만 편집 내용은 6 자 이상이어야합니다.
Ian Miller

7

SVN의 많은 것들이 여기에 주어진 다양한 명령 줄 답변에 의해 입증 된 것처럼 다른 방식으로 수행 될 수 있습니다. 버전 1.7이 등장함에 따라 TortoiseSVN에는 스테판의 답변보다 더 세밀한 해상도를 제공하는 또 다른 기술이 있습니다. 이는 버전이없는 파일을 무시 된 파일과 별도로 선택할 수있게합니다. TortoiseSvn >> Clean up...이 대화 상자를 열려면 선택하십시오 .

TortoiseSVN 정리 옵션


7

Powershell 사용시 :

(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm

명령 행에서 :

powershell -Command "&{(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm}"

3
이 순수한 Windows 스크립트를 좋아합니다! -match '[\?i]' -replace '^.{8}'대신 파일 이름 공백으로 시작 되어 무시 된 파일을 삭제 하더라도 올바르게 작동하는 것이 좋습니다 .
gimpf

1
gimpf의 제안 된 조정을 사용하면 잘 작동하지만 ItemNotFoundException이 발생한 경우가 발생했습니다. svn 상태 결과 세트에는 하나의 파일 만있었습니다. 이 비틀기로 해결되는 문제 : code'. ^ {8}'@ (SVN 상태 --no-무시) -match를 '[? \ i]는'-replace | rm`. 이 게시물의
냈습니다

1
그리고 svn에없는 디렉토리를 묻는 메시지가 표시되므로 (반복이 지정되지 않았으므로) 스크립트에서 사용하기에 좋지 않습니다. 사용 :powershell -Command "&{(svn status --no-ignore) -match '[\?i]' -replace '^.{8}' | remove-item -force -recurse}"
thinkOfaNumber

6

이 oneliner는 나를 위해 일합니다 (리차드 한센의 대답에 따르면 놀랍게도 공백이있는 파일에는 작동하지 않았습니다).

svn status --no-ignore | grep '^[I?]' | cut -c 9- | xargs -d"\n" -I{} rm {}

2
추가, 너무 버전없는 폴더를 삭제하기 -frrm명령을 SVN 상태 --no-무시 | grep '^ [I?]'| 컷 -c 9- | xargs -d "\ n"-I {} rm -fr {}
Dennis Golomazov

5

TortoiseSVN 사용 :

  1. 작업 복사본의 루트를 마우스 오른쪽 버튼으로 클릭하고 TortoiseSVN-> "수정 확인"을 선택하십시오.
  2. "무시 된 파일 표시"를 선택하십시오.
  3. "텍스트 상태"열을 기준으로 정렬
  4. "버전이없는"파일로 스크롤하십시오. 이제 모두 함께 그룹화됩니다. 모두 선택하고 마우스 오른쪽 버튼을 클릭-> 삭제
  5. "무시 된"파일로 스크롤하십시오. 이제 모두 함께 그룹화됩니다. 모두 선택하고 마우스 오른쪽 버튼을 클릭-> 삭제

실제로 훌륭하고 깨끗한 솔루션은 아니지만 내가 아는 가장 빠른 방법은 (Windows)입니다.

무시 된 파일이있는 팁을위한 pkh에 감사합니다.


버전이없는 파일 만 제거 할 것이라고 생각합니다. 무시 된 항목은 영향을받지 않습니다.
Dirk Vollmar

2
커밋 대화를 사용할 필요가 없으며 무시 된 파일을 얻을 수 있습니다. 마우스 오른쪽 버튼을 클릭 | 거북이 SVN | 수정 사항을 확인하십시오. 그런 다음 '무시 된 파일 표시'를 클릭하고 적절하게 정렬 / 삭제할 수 있습니다.
pkh

4

이것은 다른 답변과 비슷하지만 실제로 무시되는 파일을 얻습니다 (RE의 'I'참고).

 rm -rf `svn status --no-ignore | grep '^[\?I]' | sed 's/^[\?I]//'`

1
파일 이름에 공백이 포함 된 경우이 휴식
리차드 한센

4

누군가는 Windows 명령 줄에서 할 수 없다고 말했습니다.

황소.

for /f "tokens=2 delims= " %I IN ('svn st --no-ignore ^| findstr /R "^[I?]"') DO (DEL /S /F /Q /A:H "%I" & rmdir /S /Q "%I")

한 줄로 작성하고 단일 GNU 도구가 필요하지 않습니다. :)


for /f "tokens=2 delims= " %%I IN ('svn st --no-ignore ^| findstr /R "^[I?]"') DO (DEL /S /F /Q /A:H "%%I" & rmdir /S /Q "%%I")
Darien Pardinas

@DarienPardinas, 버전은 젠킨스에 연결하면 난 그냥 배웠다 "Windows 배치 명령을 실행하여"경우에 특히 유용에 대한 때문에 필요 프롬프트하지만 더 배치 스크립트와 같은 명령이 아닌 %%이상%
jxramos

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