Programming

불필요한 svn : mergeinfo 속성 제거

procodes 2020. 6. 24. 08:08
반응형

불필요한 svn : mergeinfo 속성 제거


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

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

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

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

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


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

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

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

다음은 모든 하위 트리 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 파이프를 모두 제거하십시오.


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

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

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

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

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

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


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


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

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

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


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

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

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

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


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

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

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

참고 URL : https://stackoverflow.com/questions/767418/remove-unnecessary-svnmergeinfo-properties

반응형