programing tip

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

itbloger 2020. 7. 9. 19:23
반응형

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


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

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


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

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

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

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

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


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

참고 문헌 :


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 각 파일

방금 SVN 작업 복사본에서 모든“누락 된”파일을 제거하십시오 .

svn rm $( svn status | sed -e '/^!/!d' -e 's/^!//' )

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

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

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

이 쉘 스크립트, 반복적으로 시험 일정 ( 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

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

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

A slight modification of the command line, which works on Mac OS (hopefully even on Linux) and copes with the files the command "svm sr" reports, like "!M" (missing and modified).

It copes with spaces in the files.

It is based on a modification of a previous answer:

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

It is actually possible to completely remove the missing.list from user3689460 and Paul Martin

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

When dealing with a lot of files, it can happen that the argument input to xargs is getting too long. I went for a more naive implementation which works in that case, too.

This is for 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

Improved Version

So the full command is:

svn st | grep ^! | sed 's/![[:space:]]*//' |tr '\n' '\0' | xargs -0 svn --force rm

참고URL : https://stackoverflow.com/questions/9600382/svn-command-to-delete-all-locally-missing-files

반응형