2009-03-25 34 views
80

Jak mogę uzyskać listę wszystkich svn: externals (rekursywnie) w katalogu? Czy jest na to jakieś narzędzie?Lista wszystkich rekursywnie svn: externals?

(używam Windows (i żółw))

Mam kilka svn: zewnętrznymi linkami do różnych części udostępnionych w moim projekcie i kiedy oddział jest zazwyczaj dość podatne na błędy, aby znaleźć wszystkie urządzenia zewnętrzne i zmienili je tak, aby link do ścieżek w nowym oddziale.

+0

Kwestia ta jest również obecna na http://stackoverflow.com/questions/5118320/find-paths-with-svnexternal-properties-with-certain-string –

Odpowiedz

125

Wykonaj następujące czynności w korzeniu kopii roboczej:

svn propget svn:externals -R 

Jak wspomniano w komentarzach poniżej, to nie wymienia urządzenia zewnętrzne w pozory.

Uwaga dla użytkowników TortoiseSVN: w instalatorze TortoiseSVN istnieje opcja instalacji klienta wiersza poleceń SVN. Ta opcja nie jest domyślnie włączona.

+0

że po prostu daje mi listę wszystkich zewnętrznych i gdzie wskazują ... ale nie "lokalizacja" zewnętrznego .. tj. jeśli mam lib \ my_ex jako zewnętrzny otrzymuję tylko my_ex http:/svnlinkhere – ShoeLace

+3

@ ShoeLace: musisz być praca ze starszym SVN, ponieważ w 1.6.1 wynik * nie * zawiera te informacje. –

+0

Dobra odpowiedź ... ale jak mogę to zrobić w oknach z TortoiseSVN? - Nie mam 'svn.exe' na moim komputerze, ale mam zainstalowany TortoiseSVN. – Eddified

15

Ręczna zmiana wszystkich tych zewnętrznych właściwości brzmi nużąco. Czy spojrzałeś na new functionality for externals dodany w Subversion 1.5?

Subversion 1.5 robi ogromny krok w łagodzeniu tych frustracji. Jak wspomniano wcześniej, adresy URL używane w nowym formacie definicji zewnętrznych mogą być względne, a Subversion zapewnia magię składni do określania wielu smaków względności URL.

../

      W stosunku do zawartości katalogu, w którym svn: externals jest ustawiony

^/

      względna do katalogu głównego repozytorium w którym właściwość svn: externals jest wersjonowana

//

      Względem schematu URL katalogu w którym svn: externals jest ustawiony

/

      W stosunku do głównego adresu URL serwera, na którym svn: Właściwość zewnętrzna jest wersjonowana

Może jedna z nich może pomóc? Sądzę, że zależy to od tego, jak dokładnie rozgałęziają się i jak wygląda twoja struktura repozytorium.

0

Może, jako rozwiązanie tymczasowe, można skonstruować projekt w taki sposób, aby wszystkie obiekty zewnętrzne były ustawione w tym samym folderze, na przykład w folderze projektu tuż poniżej Trunk. (Nie oznacza to, że wszystkie zewnętrzne foldery muszą znajdować się na tej samej głębokości). Następnie możesz kliknąć prawym przyciskiem myszy folder projektu, a następnie Właściwości ..., następnie zakładkę Subversion, a następnie Właściwości ..., a następnie dwukrotnie kliknij svn: externals.

0

Kiedyś odpowiedź Wim Coenen i napisał następujący skrypt, aby utworzyć listę wszystkich wersjach:

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 
} 

Na szczęście nie mam zagnieżdżone urządzenia zewnętrzne, więc nie trzeba przetestować i myślę, że to by nie zadziałało. Ale jeśli tego potrzebujesz, prawdopodobnie wystarczy wywołać tę funkcję rekursywnie. Ponadto nigdy nie testowałem z nazwami plików, które wymagają ucieczki. To prawdopodobnie nie zadziała.

OŚWIADCZENIE: Wiem, że pierwotne pytanie dotyczyło systemu Windows, a skrypt powłoki nie będzie działać, chyba że używasz programu cygwin lub podobnego.

7

Moja obejście TortoiseSVN:

Otwórz "Branża/tag ..." dialog z menu kontekstowego SVN. Dolne okno dialogowe pokazuje wszystkie zewnętrzne, w tym zagnieżdżone zewnętrzne.

+0

Wygląda na to, że TortoiseSVN nie rekurencyjnie szuka svn: externals wewnątrz svn: externals, więc to jest to samo, co wykonanie 'svn propget svn: externals -R'. – paulie4

0

Wziąłem Daniel Alder's answer, usunąłem wywołania svnversion i ustawiłem je jako rekursywne (UWAGA: read a b c d e nie działa, jeśli w źródle lub miejscu docelowym jest spacja). To jest skrypt bash, więc będziesz potrzebować czegoś takiego jak Cygwin lub użyj Windows Subsystem for Linux.

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 
} 
Powiązane problemy