Alle svn: externals rekursiv auflisten?

94

Wie kann ich eine Liste aller svn: externals (rekursiv) in einem Verzeichnis erhalten? Gibt es dafür ein Dienstprogramm?

(Ich benutze Windows (und Schildkröte))

Ich habe eine Reihe von svn: externals, die mit verschiedenen gemeinsam genutzten Teilen meines Projekts verknüpft sind, und wenn ich verzweige, ist es normalerweise ziemlich fehleranfällig, alle externen Elemente zu finden und sie so zu ändern, dass die Verknüpfung zu Pfaden innerhalb des neuen Zweigs erfolgt.

Niels Bosma
quelle
Diese Frage ist auch unter stackoverflow.com/questions/5118320/…
Thiago Burgos

Antworten:

144

Gehen Sie im Stammverzeichnis Ihrer Arbeitskopie wie folgt vor:

svn propget svn:externals -R

Wie in den Kommentaren unten erläutert, werden hier keine externen Elemente in externen Elementen aufgeführt.

Hinweis für TortoiseSVN-Benutzer: Im TortoiseSVN-Installationsprogramm gibt es eine Option, um auch den SVN-Befehlszeilenclient zu installieren. Diese Option ist standardmäßig nicht aktiviert.

Wim Coenen
quelle
das gibt mir nur eine Liste aller externen Elemente und wo sie zeigen .. aber nicht die 'Position' des externen .. dh wenn ich lib \ my_ex als externes habe, bekomme ich nur my_ex http: / svnlinkhere
ShoeLace
4
@ShoeLace: Sie müssen mit einem älteren SVN arbeiten , weil in 1.6.1 die Ausgabe macht diese Informationen enthalten.
Wim Coenen
1
Entschuldigung, aber ich muss es ablehnen, da a) dies nicht alle externen Daten ausgibt ; fx, wenn wir einen externen Ordner haben und irgendwo in diesem Ordner ein externer Ordner vorhanden ist - dies wird nicht angezeigt. b) Die Frage ist mit tortoise svn gekennzeichnet, aber die Antwort bezieht sich auf den Befehlszeilen-Client
pmod
2
@pmod: a) Das wusste ich nicht, aber es scheint mir eher ein SVN-Fehler als ein Fehler meinerseits zu sein. b) Das TortoiseSVN 1.7-Installationsprogramm enthält den Befehlszeilenclient!
Wim Coenen
1
Die Rekursivität bezieht sich auf die Ordnerstruktur der Arbeitskopie, in der Sie den Befehl aufrufen. Dies gilt nicht für externe Elemente, die in externen Elementen verschachtelt sind. Ich denke also nicht, dass es ein Fehler ist. Andernfalls würde dies die Operation in Bezug auf die Dauer noch unbrauchbarer machen.
Frank Rem
15

Das manuelle Ändern all dieser externen Eigenschaften klingt mühsam. Haben Sie sich die neuen Funktionen für externe Geräte angesehen, die in Subversion 1.5 hinzugefügt wurden?

Subversion 1.5 macht einen großen Schritt, um diese Frustrationen zu lindern. Wie bereits erwähnt, können die im neuen externen Definitionsformat verwendeten URLs relativ sein, und Subversion bietet Syntaxzauber für die Angabe mehrerer Varianten der URL-Relativitätstheorie.

../

    Relativ zur URL des Verzeichnisses, für das die Eigenschaft svn: externals festgelegt ist

^ /

    Relativ zum Stammverzeichnis des Repositorys, in dem die Eigenschaft svn: externals versioniert ist

// //

    Relativ zum Schema der URL des Verzeichnisses, für das die Eigenschaft svn: externals festgelegt ist

/.

    Relativ zur Stamm-URL des Servers, auf dem die Eigenschaft svn: externals versioniert ist

Vielleicht würde einer von denen helfen? Ich denke, es hängt genau davon ab, wie Sie verzweigen und wie Ihre Repository-Struktur aussieht.

Sebastian Celis
quelle
8

Meine Problemumgehung für TortoiseSVN:

Öffnen Sie das Dialogfeld "Zweig / Tag ..." im SVN-Kontextmenü. Der untere Dialog zeigt alle externen Elemente einschließlich verschachtelter externer Elemente.

DrRobotNinja
quelle
Es sieht so aus, als würde TortoiseSVN nicht rekursiv nach svn: externals innerhalb von svn: externals suchen. Dies ist also dasselbe wie bei svn propget svn:externals -R.
Paulie4
0

Um dieses Problem zu umgehen, können Sie Ihr Projekt möglicherweise so strukturieren, dass alle externen Elemente im selben Ordner festgelegt sind, z. B. im Projektordner direkt unter Trunk. (Dies bedeutet übrigens nicht, dass alle externen Ordner dieselbe Tiefe haben müssen.) Dann können Sie mit der rechten Maustaste auf Ihren Projektordner klicken, dann auf Eigenschaften ..., dann auf die Registerkarte Subversion, dann auf Eigenschaften ... und dann Doppelklicken Sie auf svn: externals.

Anonymer Feigling
quelle
0

Ich habe die Antwort von Wim Coenen verwendet und das folgende Skript geschrieben, um eine Liste aller Revisionen zu erstellen:

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
}

Glücklicherweise habe ich keine verschachtelten externen Geräte, daher musste ich dies nicht testen und ich denke, es würde nicht funktionieren. Wenn Sie dies benötigen, reicht es wahrscheinlich aus, diese Funktion nur rekursiv aufzurufen. Außerdem habe ich nie mit Dateinamen getestet, die maskiert werden müssen. Dann wird es wahrscheinlich nicht funktionieren.

HAFTUNGSAUSSCHLUSS: Ich weiß, dass die ursprüngliche Frage Windows betraf und das Shell-Skript dort nur funktioniert, wenn Sie Cygwin oder ähnliches verwenden.

Daniel Alder
quelle
0

Ich nahm die Antwort von Daniel Alder , entfernte die svnversion-Aufrufe und machte sie rekursiv (HINWEIS: Funktioniert read a b c d enicht, wenn in der Quelle oder im Ziel ein Leerzeichen vorhanden ist). Dies ist ein Bash-Skript, daher benötigen Sie entweder etwas wie Cygwin oder verwenden das Windows-Subsystem für 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
quelle