Wyświetl rekursywnie wszystkie pliki svn: externals?

94

Jak mogę uzyskać listę wszystkich svn: externals (rekurencyjnie) w katalogu? Czy jest do tego jakieś narzędzie?

(Używam Windows (i żółwia))

Mam kilka svn: externals łączących się z różnymi współdzielonymi częściami mojego projektu, a kiedy rozgałęziam, zwykle jest dość podatne na błędy, aby znaleźć wszystkie zewnętrzne i zmienić je tak, aby łącze do ścieżek w nowej gałęzi.

Niels Bosma
źródło
To pytanie jest również obecne na stackoverflow.com/questions/5118320/ ...
Thiago Burgos

Odpowiedzi:

146

Wykonaj następujące czynności w katalogu głównym kopii roboczej:

svn propget svn:externals -R

Jak omówiono w komentarzach poniżej, nie wymienia to zewnętrznych w zewnętrznych.

Uwaga dla użytkowników TortoiseSVN: istnieje opcja w instalatorze TortoiseSVN, aby również zainstalować klienta linii poleceń SVN. Ta opcja nie jest domyślnie włączona.

Wim Coenen
źródło
to daje mi tylko listę wszystkich zewnętrznych i gdzie one wskazują .. ale nie 'lokalizację' zewnętrznego ... tzn. jeśli mam lib \ my_ex jako zewnętrzną, dostaję tylko my_ex http: / svnlinkhere
ShoeLace
4
@ShoeLace: musisz pracować ze starszą SVN bo w 1.6.1 wyjście ma zawierać te informacje.
Wim Coenen
1
Przepraszam, ale muszę głosować negatywnie, ponieważ a) to nie wyświetli wszystkich zewnętrznych; fx, jeśli mamy folder zewnętrzny, a gdzieś w tym folderze jest zewnętrzny - to się nie pojawi b) pytanie jest oznaczone tagiem svn żółwia, ale odpowiedź jest związana z klientem wiersza poleceń
pmod
2
@pmod: a) Nie wiedziałem tego, ale wydaje mi się to raczej błędem SVN niż moim błędem. b) Instalator TortoiseSVN 1.7 zawiera klienta wiersza poleceń!
Wim Coenen
1
Rekurencyjność odnosi się do struktury folderów kopii roboczej, w której wywołujesz polecenie. Nie dotyczy to elementów zewnętrznych zagnieżdżonych w zewnętrznych. Więc nie sądzę, żeby to był błąd. W przeciwnym razie operacja byłaby jeszcze bardziej bezużyteczna pod względem czasu trwania.
Frank
15

Ręczna zmiana wszystkich tych zewnętrznych właściwości brzmi nużąco. Czy spojrzałeś na nową funkcjonalność zewnętrznych elementów dodaną 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 elementów zewnętrznych mogą być względne, a Subversion zapewnia magię składni do określania wielu odmian względności adresów URL.

../

    Względem adresu URL katalogu, w którym ustawiono właściwość svn: externals

^ /

    Względem katalogu głównego repozytorium, w którym właściwość svn: externals jest wersjonowana

//

    Względem schematu adresu URL katalogu, w którym ustawiono właściwość svn: externals

/

    Względem głównego adresu URL serwera, na którym właściwość svn: externals jest wersjonowana

Może któryś z nich by pomógł? Myślę, że zależy to od tego, jak dokładnie się rozgałęziasz i jak wygląda struktura repozytorium.

Sebastian Celis
źródło
9

Moje obejście dla TortoiseSVN:

Otwórz okno dialogowe „Branch / tag…” z menu kontekstowego SVN. Dolne okno dialogowe pokazuje wszystkie zewnętrzne, w tym zagnieżdżone.

DrRobotNinja
źródło
Wygląda na to, że TortoiseSVN nie szuka rekursywnie svn: externals w svn: externals, więc jest to to samo, co robienie svn propget svn:externals -R.
paulie4
0

Być może, aby obejść ten problem, możesz zorganizować projekt w taki sposób, aby wszystkie zewnętrzne były umieszczone w tym samym folderze, na przykład w folderze projektu tuż pod Trunk. (Nie oznacza to, że wszystkie foldery zewnętrzne muszą być na tej samej głębokości.) Następnie możesz kliknąć prawym przyciskiem myszy folder projektu, następnie Właściwości ..., następnie zakładkę Subversion, następnie Właściwości ... kliknij dwukrotnie svn: externals.

Anonimowy tchórz
źródło
0

Użyłem odpowiedzi Wima Coenena i napisałem następujący skrypt, aby utworzyć listę wszystkich wersji:

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żonych zewnętrznych elementów, więc nie musiałem tego testować i myślę, że to nie zadziała. Ale jeśli tego potrzebujesz, prawdopodobnie wystarczy wywołać tę funkcję rekurencyjnie. Poza tym nigdy nie testowałem z nazwami plików, które wymagają ucieczki. Wtedy prawdopodobnie nie zadziała.

ZRZECZENIE SIĘ: Wiem, że pierwotne pytanie dotyczyło okien, a skrypt powłoki nie będzie tam działał, chyba że używasz cygwin lub podobnego.

Daniel Alder
źródło
0

Wziąłem odpowiedź Daniela Aldera , usunąłem wywołania svnversion i uczyniłem ją rekurencyjną (UWAGA: read a b c d enie działa, jeśli jest spacja w źródle lub miejscu docelowym). To jest skrypt bash, więc będziesz potrzebować czegoś takiego jak Cygwin lub użyć podsystemu Windows dla systemu 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
}
paulie4
źródło