it-swarm.com.de

Die letzte Revisionsnummer in SVN abrufen?

Mit PHP, Perl oder Python (vorzugsweise PHP) brauche ich eine Möglichkeit, eine SVN-Datenbank abzufragen und die letzte an SVN gesendete Revisionsnummer herauszufinden. Ich brauche nichts anderes als das. Es muss nicht intensiv sein (daher mache ich es alle fünf Minuten als Cron-Job; die Leistung von SVN sollte nicht beeinträchtigt werden).

SVN befindet sich in meinem Intranet, aber nicht auf meinem Computer.

Ich habe SVN installiert, aber keine Bindungen für PHP/Perl/Python. Ich verwende Windows XP, würde aber eine plattformunabhängige Lösung vorziehen, die auch unter Linux funktioniert. Wenn Sie nur eine Lösung für Linux (oder nur für XP) haben, wäre dies ebenfalls hilfreich.

96
Coltin
<?php
    $url = 'your repository here';
    $output = `svn info $url`;
    echo "<pre>$output</pre>";
?>

Sie können die Ausgabe in XML wie folgt erhalten:

$output = `svn info $url --xml`;

Wenn ein Fehler auftritt, wird die Ausgabe an stderr weitergeleitet. Um stderr in Ihrer Ausgabe einzufangen, verwenden Sie so: 

$output = `svn info $url 2>&1`;
66
Daniel X Moore

Wenn Sie eine lokale Arbeitskopie analysieren möchten, ist svnversion das beste Werkzeug, das mit Subversion geliefert wird und eine Ausgabe wie 968:1000M erzeugt. Die Dokumentation sagt:

Die Versionsnummer ist eine einzelne Nummer, wenn die Arbeitskopie einzeln ist Revision, unverändert, nicht geschaltet und mit einer URL, die der .__ entspricht. Argument TRAIL_URL. Wenn das funktioniert Kopie ist ungewöhnlich die Versionsnummer wird komplexer sein:

4123:4168     mixed revision working copy
4168M         modified working copy
4123S         switched working copy
4123:4168MS   mixed revision, modified, switched working copy
124
sth

svn info -r HEAD

Dadurch erhalten Sie die neueste Versionsnummer an der Spitze Ihres Repositorys.

Es gibt einige schöne Blog-Beiträge zur Integration von Subversion-Nummern in Ihr Build-Skript:

43
Nick Haddad

Dies sollte in Bash von einem Arbeitsverzeichnis aus funktionieren. Ich habe es in Windows mit unixutils installiert verwendet:

svn info |grep Revision: |cut -c11-
35
Blorgbeard

Folgendes sollte funktionieren:

svnlook youngest <repo-path>

Es gibt eine einzelne Versionsnummer zurück.

31
Magentus

Um wirklich die neueste Revisionsnummer ("Kopfrevision") in Ihrem remote Repository zu erhalten, verwenden Sie Folgendes:

svn info -r 'HEAD' | grep Revision | egrep -o "[0-9]+"

Ausgaben zum Beispiel:

35669
13
derFunk

Eine Anmerkung zum Abrufen der neuesten Versionsnummer:

Angenommen, ich habe cd- in einem überarbeiteten Unterverzeichnis (MyProjectDir). Wenn ich dann svnversion anrufe:

$ svnversion .
323:340

... Ich bekomme "323:340", was vermutlich bedeutet: " Sie haben hier Artikel, die von Revision 323 bis 340 reichen ".

Wenn ich dann svn info anrufe:

$ svn info
Path: .
URL: svn+ssh://server.com/path/to/MyProject/MyProjectDir
Repository Root: svn+ssh://server.com/path/to/MyProject
Repository UUID: 0000ffff-ffff-...
Revision: 323
Node Kind: directory
Schedule: normal
Last Changed Author: USER
Last Changed Rev: 323
Last Changed Date: 2011-11-09 18:34:34 +0000 (Wed, 09 Nov 2011)

... Ich bekomme "323" als Revision - was eigentlich die niedrigste Revision von denen ist, die von svnversion gemeldet wurden!

Wir können dann svn info im rekursiven Modus verwenden, um weitere Informationen aus dem lokalen Verzeichnis zu erhalten:

> svn info -R | grep 'Path\|Revision'
Path: .
Revision: 323
Path: file1.txt
Revision: 333
Path: file2.txt
Revision: 327
Path: file3.txt
Revision: 323
Path: subdirA
Revision: 328
Path: subdirA/file1.txt
Revision: 339
Path: subdirA/file1.txt
Revision: 340
Path: file1.txt
Revision: 323
...

... (entfernen Sie die Variable grep, um weitere Details anzuzeigen).

Was tun wir schließlich, wenn wir prüfen wollen, welche Revision das online - Repository aktuell ist (in diesem Fall @ server.com)? Dann geben wir erneut svn info aus, jedoch mit -r HEAD (beachten Sie die Differenz zwischen der -R-Option zuvor und dem -r jetzt in Kleinbuchstaben):

> svn info -r 'HEAD'
[email protected]'s password:
Path: MyProjectDir
URL: svn+ssh://server.com/path/to/MyProject/MyProjectDir
Repository Root: svn+ssh://server.com/path/to/MyProject
Repository UUID: 0000ffff-ffff-...
Revision: 340
Node Kind: directory
Last Changed Author: USER
Last Changed Rev: 340
Last Changed Date: 2011-11-11 01:53:50 +0000 (Fri, 11 Nov 2011)

Das Interessante ist, dass svn info immer noch auf das aktuelle Unterverzeichnis (MyProjectDir) verweist, jedoch wird der Online-Pfad als MyProjectDir angegeben (im Gegensatz zu . für den lokalen Fall) - und die gemeldete Online-Revision ist höchste (340). - im Gegensatz zum niedrigsten, 323, der lokal gemeldet wird).

12
sdaau
  • Ab Subversion 1.9 können Sie mit der Option --show-item den Wert eines der Felder der Ausgabe des Befehls svn info abrufen. Dieser Befehl zeigt nur die Revisionsnummer an:

    svn info --show-item=revision <URL-to-repository>
    
  • Rufen Sie die XML-Ausgabe von svn info mithilfe der Option --xml ab und verwenden Sie PowerShell, um die Versionsnummer abzurufen. Hier ist ein einfaches Beispiel:

    [xml]$svninfo = svn info <REPOSITORY-URL> --xml -r HEAD
    $latestrevnum = $svninfo.info.entry.revision
    $latestrevnum
    
  • Wenn Sie VisualSVN Server 3.4 oder höher verwenden, können Sie die Anzahl der Revisionen in einem Repository abrufen, indem Sie die folgenden Befehle ausführen:

    $repo = Get-SvnRepository <REPOSITORY-NAME>

    $repo.Revisions

    Weitere Informationen finden Sie unter Get-SvnRepository Referenz des PowerShell-Cmdlets .

8
bahrep

Ich denke du suchst

svn info -r HEAD

Kannst du diesen Befehl ausführen?

Sie müssen wahrscheinlich auch Anmeldeinformationen mit dem Repository angeben.

5
Tim

Jemand anderes schlug mir vor, die Antwort zu svnversion zu posten, was definitiv die beste Lösung ist, wenn Sie eine Arbeitskopie haben (IIRC, es funktioniert nicht mit URLs). Ich füge folgendes hinzu: Wenn Sie sich auf dem Server befinden, auf dem SVN gehostet wird, verwenden Sie am besten den Befehl svnlook. Dies ist der Befehl, den Sie beim Schreiben eines Hook-Skripts verwenden, um das Repository (und im Falle von Pre-Commit-Hooks sogar die aktuelle Transaktion) zu untersuchen. Sie können svnlook help für Details eingeben. Sie möchten wahrscheinlich den Befehl svnlook youngest verwenden. Beachten Sie, dass direkter Zugriff auf das Repo-Verzeichnis erforderlich ist, sodass es auf dem Server verwendet werden muss.

4
rmeador

Sie können das XML-Out-Format verwenden, zum Beispiel:

  svn info --xml | grep 'revision' | head -1 | grep -Eo "[0-9]+" | xargs expr -1 +

Beispiel: Verwendung der Revisionsnummer

working=`svn info --xml | grep 'revision' | head -1 | grep -Eo "[0-9]+" | xargs expr -1 +`
svn diff -r $working:HEAD --summarize --xml
2
fitorec

Sie können den folgenden Befehl ausprobieren:

svn info -r 'HEAD' | grep Revision: | awk -F' ' '{print $2}'
2
mrajiv

Sie suchen nach einem Anruf, der dem Befehlszeilenaufruf ähnelt

svn info URL

Es scheint, dass dies mit der pysvn-Bibliothek möglich ist, und es gibt ein Rezept , das Ihnen den Einstieg erleichtern soll. Ich bin mir nicht sicher, ob es etwas Ähnliches für PHP gibt.

Wenn Sie die SVN-Binärdatei selbst aufrufen müssen, stellen Sie sicher, dass Sie den Parameter --xml verwenden, um das Ergebnis als XML abzurufen. Das sollte einfacher zu analysieren sein als die Befehlszeilenausgabe.

2
Sander Rijken

Sie können beide Befehle verwenden: 

1)
> svn info | awk '/Revision:/ { print $2 }' =>returns the latest version


2)
> svn log -l 1 | grep '^r[0-9]\+' | awk '{print $1}'

svn log -l 1     => returns the latest version commit 
grep '^r[0-9]\+' => greps the r4324 (revision) number
awk '{print $1}' => prints the match found
2
Angelin Nadar

Wenn Sie wirklich eine kurze wollen:

svn info ^/

Die Caret-Notation ist eine Abkürzung für "die URL des Stammverzeichnisses des Repositorys".

2
Sanghyun Lee
[email protected]:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svnversion
12354

Oder

[email protected]:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svn info --xml |     xmlstarlet sel -t --value-of "//entry/@revision"
12354

Oder

[email protected]:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svn info --xml | xmlstarlet sel -t --value-of "//commit/@revision"
12335
2
Nick Henry

Nur svn info in BASH gibt Ihnen alle Details

RESULT:
Path: .
URL: 
Repository Root: 
Repository UUID: 
Revision: 54
Node Kind: directory
Schedule: normal
Last Changed Author: 
Last Changed Rev: 54
Last Changed Date: 

Sie erhalten die REVISION daraus

1
D_D

Wenn Sie das Unglück aus einer Windows-Stapelverarbeitungsdatei tun müssen, finden Sie hier die gewünschte Beschwörung:

set REV=unknown
for /f "usebackq tokens=1,2 delims=: " %%A in (`svn info`) do if "%%A" == "Revision" set REV=%%B
echo Current SVN revision is %REV%

Dies führt "svn info" aus und durchläuft jede Zeile der generierten Ausgabe. Es verwendet einen Doppelpunkt als Trennzeichen zwischen dem ersten und dem zweiten Zeichen in der Zeile. Wenn das erste Token "Revision" ist, wird die Umgebungsvariable REV auf das zweite Token gesetzt.

1
yoyo

Dies wird nur die Revisionsnummer der zuletzt geänderten Revision erhalten:

<?php
$REV="";
$repo = ""; #url or directory
$REV = svn info $repo --show-item last-changed-revision;
?>

Ich hoffe das hilft.

0
Kram

Die veröffentlichten Lösungen behandeln den Fall nicht, wenn externe Geräte verwendet werden.

Wenn ich eine URL oder eine Arbeitskopie mit der Eigenschaftsgruppe svn:externals habe, können sich die Externen ändern und somit die letzte Version des Subversion-Servers ändern. Die letzte Revision der Arbeitskopie oder URL zeigt jedoch nur die Revisionsnummer an, wenn die Eigenschaft svn: externals geändert wurde, oder wenn sich ein Element im URL-Pfad befindet, dessen Verhalten erwartet wird.

Sie erhalten also entweder die svn:externals-Eigenschaft und iterieren die URLs und wählen die Höhenrevision aus oder fragen die Basis-URL vom Subversion-Server ab. Die von der Basis-URL gemeldete Version enthält die neueste Version für ALLES auf dem Server.

Wenn Sie externe Geräte verwenden, empfiehlt es sich, svn info BASE_URL zu verwenden, wobei BASE_URL die -Stamm-URL für alle Pfade auf dem Subversion-Server ist.

0
Nick

Die einfachste und sauberste Methode (tatsächlich svn 1.9, veröffentlicht 2015) ist die Verwendung von:

svn info --show-item revision [--no-newline] [SVNURL/SVNPATH] 

Die Ausgabe ist die Nummer der letzten Version (am jüngsten) für die SVNURL, Oder die Nummer der aktuellen Version der Arbeitskopie von SVNPATH . Der --no-newline ist optional und weist an svn gibt nach dem Wert keine kosmetische Newline (\n) aus, wenn Sie eine minimale Ausgabe (nur die Versionsnummer) benötigen.

Siehe: https://Subversion.Apache.org/docs/release-notes/1.9.html#svn-info-item

0
F.Igor

svn info oder svnversion berücksichtigen keine Unterverzeichnisse. Um die letzte 'Revision' der Live-Codebase zu finden, funktionierte der gehackte Weg unten für mich.

repo_root$ find ./ | xargs -l svn info  | grep 'Revision: ' | sort
...
Revision: 86
Revision: 86
Revision: 89
Revision: 90
$
0

$ svn log | head -10 in einem beliebigen Verzeichnis, das einen .svn-Ordner hat

0
kip2