불필요한 svn : mergeinfo 속성 제거


136

리포지토리에 항목을 병합 할 때 Subversion은 svn:mergeinfo병합하려는 항목과 전혀 관련이없는 파일에 많은 속성을 추가 / 변경 하려고합니다.

이 동작에 대한 질문은 이전에 스택 오버플로에서 요청되었습니다.

위에서 언급 한 주제에서 이해 한 바에 따르면 내 저장소의 많은 파일은 명시 적으로 svn:mergeinfo속성이 없어야합니다. 조언은 양을 줄이고 해당 속성을 관련 파일 / 폴더에만 두는 것입니다.

이제 내 질문 : 불필요한 속성을 어떻게 쉽게 제거 할 수 있습니까? TortoiseSVN을 사용하고 있지만 수백 개의 파일을 수동으로 확인 / 수정하는 것을 꺼려합니다. 불필요한 svn:mergeinfo속성 을 제거하는 더 쉬운 방법이 있습니까?

추신 : 나는 C ++ SVN API 코드를 찾고 있지 않다 .

답변:


142

다음은 루트 폴더가 아닌 모든 하위 트리 svn : mergeinfo 속성을 삭제하는 또 다른 방법입니다 (분기가 제대로 작동하려면 필요함).

프로젝트의 루트에서 다음을 수행하십시오.

svn propdel svn:mergeinfo -R
svn revert .
svn ci -m "Removed mergeinfo"

57
또는 루트 디렉토리 "svn propdel -R svn : mergeinfo ./*"에서하지 마십시오
JeremyWeir

3
"dot"/ * ix 개의 숨겨진 파일이 있으면 "svn propdel -R svn : mergeinfo ./* ./.[^.]*"입니다. 질문에 따라 Windows 사용자에게는 문제가되지 않을 것입니다.
피터

3
"svn propdel svn : mergeinfo -R> nul"(또는 Linux를 사용하여> / dev / null)
bebbo

2
@JeremyWeir "루트 디렉토리에서하지 마십시오"는 무슨 뜻입니까? 그때 어디서? 그 의견에 대해 많은 찬사를 보냈지 만 대안을 보지 못했습니다.
TT.

3
@TT. 아이디어는 엉망인 병합 정보가 모두있는 디렉토리로 가서 거기에서 수행하는 것이므로 루트 디렉토리를 되돌릴 필요가 없습니다. 루트의 mergeinfo를 엉망으로 만들고 싶지 않습니다.
JeremyWeir

15

다음은 모든 하위 트리 svn : mergeinfo 속성을 삭제하는 방법입니다. 저장소 루트 내에서 실행하십시오.

svn propget svn:mergeinfo --depth=infinity 
    | grep -v "^/"
    | grep -v "^\."   
    | cut -d- -f1 
    | xargs svn propdel svn:mergeinfo

한 줄로 모두 쉽게 복사 / 붙여 넣기를 할 수 있습니다.

svn propget svn:mergeinfo --depth=infinity | grep -v "^/" | grep -v "^\." | cut -d- -f1 | xargs svn propdel svn:mergeinfo

파일을 실행하기 전에 어떤 파일이 영향을 미치는지 미리 보려면 마지막 "propdel"을 "propget"으로 변경하거나 마지막 xargs 파이프를 모두 제거하십시오.


2
파일에서 하이픈과 함께 작동합니다. svn propget -R svn : mergeinfo | grep -v "^ /"| grep -v "^ \." | 컷 "-d"-f1 | xargs svn propdel svn : mergeinfo
다람쥐

12

이 스레드 에서 언급했듯이 :

  • 대부분의 빈 mergeinfo ( "blank")는 소스 항목에 명시적인 mergeinfo가없는 작업 사본에 대한 작업 사본 / 이동으로 인해 발생할 수 있습니다. 1.6 SVN을 사용하지 않는 한 propdel을 사용하는 것이 해결책이 될 수 있습니다. 1.5.5부터이 WC-to-WC 사본은 더 이상 대상에서 빈 mergeinfo를 작성하지 않습니다.
  • 이전 svn 이동 (이름 변경) 재구성 작업은 또한 루트 디렉토리에 머지 정보를 남기지 않고 mergeinfo를 전파 할 수 있습니다.
  • 케이스 3393에 의해 추적되는 잠재적 인 메모리 문제 가 있으며, 이는 다음 1.6.2 버전에서 수정되고 1.5에서 백 포트됩니다.

6

블라인드 svn:merge-info속성 삭제에 대해 확신하지 못 하므로 작업 복사본에서 현재 상황을 분석하고 루트가 아닌 병합 정보 속성에서 가능한 많은 병합 개정을 제거하는 도구를 구현했습니다. 추가 사람 점검 및 제어 후에 작업 사본의 변경 사항을 적용 할 수 있습니다.

여기 있습니다 : svn-clean-mergeinfo

사용법을 개선하기 위해 주저하지 말고 사용하십시오.

Subversion 1.10에는 해당 작업 전용의 새로운 도구가 도입되었습니다. svn-mergeinfo-normalizer


2
이 도구는 대규모 팀에서 완벽하게 조정 된 개발자가 만들 수있는 부분 하위 디렉토리 병합으로 생성되는 종류와 같은 병합 정보 속성을 통합하는 데 유용합니다. 이 도구는 모든 브랜치에 존재하지 않는 파일에 문제가있는 것 같습니다. 파일에 존재하지 않는 브랜치의 개정을 나타내는 파일에 대해 남은 병합 정보 속성을 얻습니다.
davenpcj

나는 그것이 완벽하지 않다는 것에 동의한다. 그것이 "인간 점검과 통제"가 여전히 요구되는 이유이다. 귀하의 경우 merge-info 속성에서 관련없는 개정을 확인한 경우 커밋하기 전에 해당 파일에서 이러한 개정 또는 전체 svn : merge-info 속성을 제거 할 수 있습니다. github을 사용하여 개선을 요청하십시오.
이브 마틴

4

나는 그것이 오래되었다는 것을 알고 있지만 비슷한 문제가 발생했습니다. TortoiseSVN 1.6.7을 사용하고 있습니다. 재산이 내 작업 사본의 근본에 있던 것입니다. 루트의 속성을보고 svn : mergeinfo에서 제거를 클릭하면 재귀 적으로 제거할지 묻습니다. 이것은 내 svn : mergeinfo cockups를 모두 제거했습니다.


나는 같은 상황에 있었다. 나를 위해 일했다. 감사!
andrewd18

2

mergeinfo 속성을 대량 제거하려는 경우 다음 BASH 스크립트를 사용할 수 있습니다.

FILES=`svn status |grep "^ M      " |sed s/" M      "// |tr '\n', ' '`
svn revert $FILES

변경된 파일 목록을 가져 와서 변경 사항 만 병합 정보로 필터링하고 실제 파일 경로를 제외한 모든 것을 제거하고 한 줄당 하나의 경로를 공백으로 구분 된 목록으로 변환하며 호출은 해당 목록에서 되돌아갑니다.


2
당신은 내가 TortoiseSVN을 언급에서 알고 있으므로 고맙습니다,하지만 난 Windows 사용자 해요 및 배쉬 쉘 :-) 사용하지 마십시오
LeonZandman

DOS에서도 똑같은 것이 가능해야하지만 아마도 간결하지는 않습니다.
체이스 세이버 트

1
현재 작업 디렉토리에서 mergeinfo가 수정 된 파일 만 되 돌리지 않습니까? 그렇다면 기존 명시 적 mergeinfo와 같은 문제를 해결하지 못합니다. 이를 위해서는 전파해야합니다.
Dominic Scheirlinck 2009

2
이름이 공백 인 파일 이름이 있습니까? 그 이름에 glob 문자가 있습니까? 두 경우 모두 나쁜 소식입니다. svn status에서 출력을 구문 분석하는 승인 / 지원되는 방법은 --xml플래그와 XML 파서를 사용하는 것입니다. 텍스트 출력 형식의 순방향 호환성이 보장되지 않으므로 버전마다 다른 사항이 변경 될 수 있습니다.
Charles Duffy

2

mergeinfo 속성을 맹목적으로 삭제하는 대신 "missing"병합을 완료 할 수도 있습니다.

루트 폴더에서 mergeinfo 속성을 복사 한 다음 하위 폴더에서 적절한 상대 경로와 정확히 동일한 개정 목록에 대해 병합을 수행하십시오. 이 목록과 이미 하위 폴더에있는 목록의 차이점 만 나열 할 수 있지만 반드시 그럴 필요는 없습니다.

일반적으로이 병합은 실제 파일이 아닌 mergeinfo 속성 만 변경해야합니다. (파일이 변경되면 이전 병합 중 하나는 부분 병합 일 뿐이므로 문제가 발생했을 수 있습니다.)

이 작업을 수행하면 mergeinfo 속성이 모두 정확하게 일치하면 삭제됩니다. 하위 폴더에만있는 모든 병합 개정을 루트로 병합해야합니다 (전체 목록을 붙여넣고 SVN이 차이점을 찾도록 정렬 할 수 있음).


1

디렉토리 구조를 변경하려면 다음과 같습니다 (DOS가 아닌 '찾기'만 해당).

find . -path "*/.svn" -prune -or -exec svn propdel svn:mergeinfo '{}' \;

1.5 서버에 연결된 1.6.12 클라이언트를 실행하면 비슷한 문제가 있습니다. 거기에 있다 자신의 SVN 필요가있는 프로젝트의 하위 디렉토리 : mergeinfo,하지만 ( "SVN : 무시 *"로 ./var 아래 5 디렉토리 포함) (121 개) 등의 항목이있는 것은 다소 부적절 보인다. 따라서 명백하게 불필요한 병합 정보를 제거하고 다른 차이점에 대해 말할 수있는 (예 : Python) 스크립트가 있으면 좋을 것입니다 ...

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