모든 svn : externals를 재귀 적으로 나열 하시겠습니까?


94

디렉토리에있는 모든 svn : externals 목록을 (재귀 적으로) 얻으려면 어떻게해야합니까? 이것에 대한 유틸리티가 있습니까?

(저는 Windows (및 거북이)를 사용하고 있습니다)

내 프로젝트의 다른 공유 부분에 연결되는 svn : externals가 많이 있으며 분기 할 때 일반적으로 모든 외부를 찾아서 변경하여 새 분기 내의 경로에 대한 링크를 변경하는 데 오류가 발생하기 쉽습니다.


답변:


144

작업 복사본의 루트에서 다음을 수행합니다.

svn propget svn:externals -R

아래 주석에서 논의한 것처럼 이것은 외부의 외부를 나열하지 않습니다.

TortoiseSVN 사용자를위한 참고 사항 : TortoiseSVN 설치 프로그램에는 SVN 명령 줄 클라이언트도 설치하는 옵션이 있습니다. 이 옵션은 기본적으로 활성화되어 있지 않습니다.


그것은 단지 나에게 모든 외부와 그들이 가리키는 위치의 목록을 제공합니다. 그러나 외부의 '위치'는 아닙니다 .. 즉, 외부로 lib \ my_ex를 가지고 있다면 나는 my_ex http : / svnlinkhere
ShoeLace

4
@ShoeLace : 1.6.1에서는 출력 에이 정보 포함되어 있으므로 이전 SVN으로 작업해야합니다 .
빔 COENEN

1
미안하지만 나는 그것을 아래로 투표해야한다. a) 이것은 모든 외부를 출력하지 않을 것이다 ; fx, 외부 폴더가 있고이 폴더 내부에 외부가있는 경우-이것은 표시되지 않습니다. b) 질문에 tortoise svn 태그가 지정되어 있지만 대답은 명령 줄 클라이언트와 관련이 있습니다
pmod

2
@pmod : a) 나는 그것을 몰랐지만 그것은 내 부분의 오류 라기보다는 나에게 SVN 버그처럼 보인다. b) TortoiseSVN 1.7 설치 프로그램 에는 명령 줄 클라이언트가 포함 되어 있습니다 !
Wim Coenen 2011

1
재귀 성은 명령을 호출하는 작업 복사본의 폴더 구조와 관련됩니다. 외부 내부에 중첩 된 외부와 관련이 없습니다. 그래서 나는 그것이 버그라고 생각하지 않습니다. 그렇지 않으면 기간 측면에서 작업을 더 많이 사용할 수 없게됩니다.
Frank Rem

15

이러한 모든 외부 속성을 수동으로 변경하는 것은 지루한 것처럼 들립니다. Subversion 1.5에 추가 된 외부 기능에 대한 새로운 기능을 보셨습니까 ?

Subversion 1.5는 이러한 좌절감을 덜어주는 데 큰 걸음을 내디뎠습니다. 앞서 언급했듯이 새로운 외부 정의 형식에 사용되는 URL은 상대적 일 수 있으며 Subversion은 여러 유형의 URL 상대성을 지정하기위한 구문 마법을 제공합니다.

../

    svn : externals 속성이 설정된 디렉터리의 URL을 기준으로합니다.

^ /

    svn : externals 속성의 버전이 지정된 저장소의 루트에 상대적

//

    svn : externals 속성이 설정된 디렉토리의 URL 스키마에 상대적

/

    svn : externals 속성의 버전이 지정된 서버의 루트 URL을 기준으로합니다.

그중 하나가 도움이 될까요? 정확히 어떻게 분기하는지와 저장소 구조가 어떻게 생겼는지에 달려 있다고 생각합니다.


8

TortoiseSVN에 대한 해결 방법 :

SVN 컨텍스트 메뉴에서 "Branch / tag ..."대화창을 엽니 다. 아래쪽 대화 상자에는 중첩 된 외부를 포함한 모든 외부가 표시됩니다.


TortoiseSVN이 svn : externals 내에서 svn : externals를 재귀 적으로 찾지 않는 것처럼 보이므로 svn propget svn:externals -R.
paulie4

0

해결 방법으로 모든 외부 항목이 동일한 폴더 (예 : Trunk 바로 아래의 프로젝트 폴더)에 설정되도록 프로젝트를 구성 할 수 있습니다. (이것은 모든 외부 폴더가 같은 깊이에 있어야한다는 것을 의미하지는 않습니다.) 그런 다음 프로젝트 폴더를 마우스 오른쪽 버튼으로 클릭 한 다음 속성 ..., 하위 버전 탭, 속성 ...을 차례로 클릭합니다. svn : externals를 두 번 클릭합니다.


0

Wim Coenen의 답변을 사용하고 다음 스크립트를 작성하여 모든 개정 목록을 작성했습니다.

getSvnRevs() {
  cd "$1"
  wcver="$(svnversion)"
  [ -n "$wcver" ] || panic "Unable to get version for $wcdir"
  echo "$1: $wcver"
  svn propget svn:externals -R | while read a b c d e; do
    [ -n "$a" ] || continue
    if [ "$b" = "-" ]; then
      wcparent="$a"
      wcdir="$wcparent/$c"
      [ -z "$e" ] || panic "Invalid format #1"
    else
      [ -n "$wcparent" ] || panic "Invalid format #2"
      wcdir="$wcparent/$a"
      [ -z "$c" ] || panic "Invalid format #3"
    fi
    [ -d "$wcdir" ] || panic "Invalid directory: $wcdir"
    wcver="$(svnversion "$wcdir")"
    [ -n "$wcver" ] || panic "Unable to get version for $wcdir"
    echo "$1/$wcdir: $wcver"
  done
}

다행히도 중첩 된 외부가 없기 때문에 이것을 테스트 할 필요가 없었고 작동하지 않을 것이라고 생각합니다. 그러나 이것이 필요하다면이 함수를 재귀 적으로 호출하는 것으로 충분할 것입니다. 또한 이스케이프가 필요한 파일 이름으로 테스트하지 않았습니다. 그러면 작동하지 않을 것입니다.

면책 조항 : 원래 질문이 창에 관한 것이었고 cygwin 또는 이와 유사한 것을 사용하지 않으면 쉘 스크립트가 작동하지 않습니다.


0

Daniel Alder의 대답을 가져 와서 svnversion 호출을 제거하고 재귀 적으로 만들었습니다 (참고 : read a b c d e소스 또는 대상에 공백이 있으면 작동하지 않습니다). 이것은 bash 스크립트이므로 Cygwin과 같은 것이 필요하거나 Linux 용 Windows 하위 시스템을 사용해야합니다 .

getSvnExternals() {
  svnbase="$1"
  svnpath="$2"
  svn propget svn:externals -R "$svnbase/$svnpath" 2> /dev/null | while read a b c d e; do
    [ -n "$a" ] || continue
    if [ "$b" = "-" ]; then
      wcparent="$a"
      external="$c"
      wcdir=$(echo "$wcparent/$d" | sed s#^./##)
      [ -z "$e" ] || echo "WARNING: Invalid format #1. line='$a $b $c $d $e'"
    else
      [ -n "$wcparent" ] || echo "WARNING: Invalid format #2. wcparent=$wcparent"
      external="$a"
      wcdir=$(echo "$wcparent/$b" | sed s#^./##)
      [ -z "$c" ] || echo "WARNING: Invalid format #3. line='$a $b $c $d $e'"
    fi
    echo "$1/$wcdir: $external"
    ## recurse into external directory
    [ -d "$wcdir" ] && getSvnExternals "$1/$wcdir"
  done
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.