로컬로 누락 된 모든 파일을 삭제하는 SVN 명령


134

SVN에는 디렉토리에서 로컬로 누락 된 모든 파일을 삭제하는 데 사용할 수있는 명령이 있습니까?

또는 누락 된 파일 만 나열하는 방법 (또는 일반적인 경우 상태가 A, D,? 등) 인 방법


1
작업 폴더 1 개와 체크 아웃 폴더 1 개를 유지합니다. 작업 폴더에서 체크 아웃 폴더로 파일 만 이동하십시오. 폴더를 추가 / 제거해야하는 경우 수동으로 수행 한 다음 파일을 해당 폴더로 이동합니다 (예 : 새 패키지, 이전 패키지). 대부분의 svn 문제는 작업 복사본에서 폴더를 이동할 때 발생합니다. 작업 복사본에서 파일을 복사하여 복사 할 때에도 폴더가 아닌 파일 만 이동해야합니다.
Siddharth

답변:


99

TortoiseSVN을 사용하는 경우 수정 확인을 수행 하고 상태 열을 기준으로 정렬 한 후 표시된 모든 항목을 선택하고 missing마우스 오른쪽 버튼을 클릭하여 상황에 맞는 메뉴를 열고 삭제를 선택하십시오 . 마지막으로 변경 사항을 저장소에 공개하십시오.

Windows를 사용하고 있지만 명령 줄을 선호하고 PowerShell에서 손쉬운 사용을 원한다면이 한 줄짜리가 트릭을 수행합니다.

svn status | ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] }

즉, 누락 된 파일 (줄 시작 부분에 느낌표로 표시됨)을 표시하는 행으로 만 출력을 필터링하고 연관된 파일 이름을 캡처 한 후 해당 파일 이름에서 수행 svn rm하십시오.

(블로그 게시물 SVN 작업 복사본에서 모든“누락 된”파일을 제거하면 Unix / Linux와 비슷한 작업 이 수행됩니다.)


서브 클립 플러그인을 사용하는 이클립스 방법이 있습니까? 업데이트 한 다음 프로젝트에서 찾아서 다시 삭제하는 것은 너무 나쁩니다.
Stan

참고로, 서브 버전 암호가 필요한 경우 다음 구문을 사용하십시오. svn status --username user_name_here --password password_here | ? {$ _ -match '^! \ s + (. *)'} | % {svn rm $ Matches [1] --username user_name_here-- 암호 password_here}
Jeff

실행하기 전에이 줄을 먼저 커밋해야 svn up합니까? 파일이 svn 서버에서 복원 되었기 때문에
Pierre

이 조치는 저장소에서도 파일을 삭제합니까?
Sebastián Ulloa

175

Mac ( Darwin ) 또는 Linux를 사용하는 경우 다음 명령의 출력을 svn rm누락 된 모든 파일에 파이프 할 수 있습니다. 전체 작업 복사본을 실행할 것인지 아니면 하위 집합 만 실행할 것인지에 따라 현재 작업 디렉터리를 적절한 디렉터리 나 하위 디렉터리로 설정할 수 있습니다.

  1. svn 상태 실행
  2. "!"로 시작하는 줄을 검색하십시오. (잃어버린)
  3. # 2 출력의 "--force"(svn argument) 및 두 번째 열 (파일 이름)을 인쇄하십시오.
  4. svn rm# 3의 출력을 인수로 사용하여 실행

따라서 전체 명령은 다음과 같습니다.

svn st | grep ^! | awk '{print " --force "$2}' | xargs svn rm

참고 문헌 :


4
파일 이름에 공백이 있으면 작동하지 않습니다. 그래도 그것을 고칠 충분한 awk을 모른다.
bugloaf

2
사용 awk '{print " --force "$2"@"}'하여 파일 이름이 포함되어있는 경우 @(당신은 예를 들어 아이폰 OS 디바이스를 인 경우)
기욤 Algis

1
공백을 사용하여 파일 이름을 처리 awk '{$1=""; print " --force \""substr($0,2)"@\"" }'하고 트릭을 수행해야합니다 (추악한 것처럼 보이기 시작 함)
Guillaume Algis

12
공간을 처리하는 전체 명령은 "svn st | grep ^! | awk '{$ 1 =" "; print"--force \ ""substr ($ 0,2) "@ \" "}'| xargs svn rm "
HelloWorld

1
--forcexargs 부분에 넣지 않습니까?
jwg

53
svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
  1. svn status
  2. 누락 된 파일에 대해서만 필터링
  3. 느낌표를 잘라
  4. 후행 공백 필터링
  5. 선행 인용 추가
  6. 후행 견적 추가
  7. svn remove 각 파일

파일 / 디렉토리에 공백이 있으면이 솔루션이 작동합니다.
yuric

어떻게 이것에 자세한 정보를 추가합니까? xargs -verbose svn rm?
TekiusFanatikus

1
스크립트 사용자 등을위한 힌트 일뿐입니다. 삭제할 파일이 없으면이 명령이 실패합니다. svn : E205001 : 자세한 정보는 'svn help delete'를 시도하십시오 svn : E205001 : 인수가 충분하지 않습니다
Thorsten Schöning

1
옵션 에 추가 -r하여 @ ThorstenSchöning의 문제를 해결할 수 있습니다 xargs(또는 인수가 주어지지 않으면 실행하지 마십시오). 또한 많은 수의 인수로 호출이 실패하기 때문에 인수의 수를 제한하고 제거를 일괄 처리해야합니다 (예 :) -n 500. 그리고 마지막으로는 수행 인용이없는 이상은 같은 쉘 스페셜을 포함하는 파일에 대한 최적이다 $-를보다 효율적으로 사용할 \n구분 기호로는과에 인용 둡니다 xargs:svn status | grep "!" | cut -d! -f2 | sed 's/^ *//' | xargs -n 500 -d "\n" -r svn rm
깃발을 올려


19

Windows 버전의 Paul Martin에게 감사합니다.

공백이있는 Windows 파일도 고려하도록 스크립트를 약간 수정했습니다. 또한 missing.list파일은 마지막에 제거됩니다.

SVN bin 디렉토리 (%% PATH 환경에서 설정)의 svndel.bat에 다음을 저장하여 명령 프롬프트의 모든 폴더에서 호출 할 수 있습니다.

### svndel.bat
svn status | findstr /R "^!" > missing.list
for /F "tokens=* delims=! " %%A in (missing.list) do (svn delete "%%A")
del missing.list 2>NUL

좋은 몇 가지 혁신적인 배치 코드가 여전히 나타나는 : 볼
user230910

와우, 좋은 대답입니다. powershell을 사용하려고했지만 훨씬 쉬웠습니다.
Jim Andrakakis

나는 후 다른 라인을 추가 del missing.list 2>NUL나는 모든 새 파일을 직접 후 처음으로 삭제 된 파일을 제거 추가하기 때문에 추가 그래서 missing.listsvn을 위해 : svn delete "missing.list"나를 위해 일한
피에르

임의 위치에서 실행되도록이 스크립트를 수정 한 후이 문제가 발생했습니다. stackoverflow.com/questions/1137219/… 이 작업을 수행하려면 반드시 현재 작업 디렉토리를 사용해야합니다.
aolszowka

7

PowerShell 옵션이 마음에 듭니다. 그러나 Windows 배치 스크립트를 사용하는 경우 다른 옵션이 있습니다.

svn status | findstr /R "^!" > missing.list
for /F "tokens=2 delims= " %%A in (missing.list) do (svn delete %%A)

5

제거 할 파일에 대해 Linux (bash)에서 작동하는 대안은 경로에 공백이 포함되지 않은 것입니다.

svn delete`svn status | grep! | awk '{print $ 2}'`

4

이 쉘 스크립트, 반복적으로 시험 일정 ( svn status) 프로젝트의 디렉토리 (질문의 요구로) 누락 된 파일 제거 저장소에 새 파일을 추가. 일종의 "프로젝트의 현재 스냅 샷을 저장소에 저장"입니다.

if [ $# != 1 ]
then
    echo  "usage: doSVNsnapshot.sh DIR"
    exit 0
fi

ROOT=$1

for i in `find ${ROOT} -type d \! -path "*.svn*" `
do

    echo
    echo "--------------------------"
    ( cd $i ; 
    echo $i
    echo "--------------------------"


    svn status | awk '  
            /^[!]/ { system("svn rm " $2) }
            /^[?]/ { system("svn add " $2) }
        '
    )
    echo

done

4

Mac OS (Linux에서도 가능)에서 작동하는 명령 줄의 약간의 수정은 "! M"(missing and modified)과 같은 "svm sr"명령이보고하는 파일을 처리합니다.

파일의 공백에 대응합니다.

이전 답변의 수정을 기반으로합니다.

svn st | grep ! | sed 's/!M/!/' | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn --force rm

4

실제로 missing.listuser3689460과 Paul Martin에서 완전히 제거하는 것이 가능합니다

for /F "tokens=* delims=! " %%A in ('svn status ^| findstr /R "^!"') do (svn delete "%%A")

참조 -이 DOS / 윈도우 땅에서 cmd.exe를하다
user230910

2

많은 파일을 처리 할 때 xargs에 대한 인수 입력이 너무 길어질 수 있습니다. 나는 그 경우에도 더 순진한 구현을 갔다.

이것은 Linux 용입니다.

#! /bin/bash
# 1. get all statii in the working copy
# 2. filter out only missing files
# 3. cut off the status indicator (!) and only return filepaths
MISSING_PATHS=$(svn status $1 | grep -E '^!' | awk '{print $2}')
# iterate over filepaths
for MISSING_PATH in $MISSING_PATHS; do
    echo $MISSING_PATH
    svn rm --force "$MISSING_PATH"
done

1

개선 된 버전

따라서 전체 명령은 다음과 같습니다.

svn st | grep ^! | sed 's/![[:space:]]*//' |tr '\n' '\0' | xargs -0 svn --force rm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.