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

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

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

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



답변

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

svn propget svn:externals -R

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

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


답변

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

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

../

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

^ /

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

//

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

/

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

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


답변

TortoiseSVN에 대한 해결 방법 :

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


답변

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


답변

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 또는 이와 유사한 것을 사용하지 않으면 쉘 스크립트가 작동하지 않습니다.


답변

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
}


답변