wake-up-neo.com

Alle auflisten svn: externals rekursiv?

Wie bekomme ich eine Liste aller svn: externals (rekursiv) in einem Verzeichnis? Gibt es einen Nutzen dafür?

(Ich benutze Windows (und Schildkröte))

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

83
Niels Bosma

Führen Sie im Stammverzeichnis Ihrer Arbeitskopie Folgendes aus:

svn propget svn:externals -R

Wie in den folgenden Kommentaren erläutert, werden in diesem Abschnitt keine externen Elemente aufgeführt.

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

130
Wim Coenen

Alle diese äußeren Eigenschaften manuell zu ändern, ist langweilig. Haben Sie die neue Funktionalität für Externe in Subversion 1.5 hinzugefügt?

Subversion 1.5 macht einen großen Schritt, um diese Frustrationen zu mindern. Wie bereits erwähnt, können die im neuen Externals-Definitionsformat verwendeten URLs relativ sein, und Subversion bietet Syntaxmagie zum Angeben mehrerer Varianten der URL-Relativitätstheorie.

../

Relativ zur URL des Verzeichnisses, in dem die Eigenschaft svn: externals festgelegt ist

^ /

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

//

Relativ zum Schema der URL des Verzeichnisses, in dem 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 ihnen helfen? Ich denke, es hängt davon ab, wie genau Sie verzweigen und wie Ihre Repository-Struktur aussieht.

15
Sebastian Celis

Mein Workaround für TortoiseSVN:

Öffnen Sie den Dialog "Branch/Tag ..." aus dem SVN-Kontextmenü. Der untere Dialog zeigt alle externen Elemente einschließlich verschachtelter externer Elemente.

8
DrRobotNinja

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 externen Elemente verschachtelt, also musste ich das nicht testen und ich denke, das würde nicht funktionieren. Wenn Sie dies jedoch benötigen, reicht es wahrscheinlich aus, diese Funktion rekursiv aufzurufen. Ich habe auch nie mit Dateinamen getestet, die entkommen müssen. Es wird dann wahrscheinlich nicht funktionieren.

HAFTUNGSAUSSCHLUSS: Ich weiß, dass die ursprüngliche Frage nach Fenstern ging, und Shell-Skript funktioniert dort nicht, wenn Sie nicht Cygwin oder ähnliches verwenden.

0
Daniel Alder

Als Problemumgehung könnten Sie Ihr Projekt möglicherweise so strukturieren, dass sich alle externen Geräte in demselben Ordner befinden, beispielsweise im Projektordner direkt unter Trunk. (Dies bedeutet nicht, dass sich alle externen Ordner übrigens in der gleichen Tiefe befinden müssen.) Anschließend können Sie mit der rechten Maustaste auf Ihren Projektordner klicken, dann auf Eigenschaften ..., dann auf die Registerkarte Subversion und dann auf Eigenschaften Doppelklicken Sie auf "svn: externals".

0

Ich nahm Daniel Alder's answer , entfernte die svnversion-Aufrufe und machte sie rekursiv (HINWEIS: read a b c d e funktioniert nicht, wenn in der Quelle oder im Ziel ein Leerzeichen vorhanden ist). Dies ist ein Bash-Skript, so dass Sie entweder etwas wie Cygwin benötigen oder das Windows Subsystem für Linux verwenden.

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
}
0
paulie4