Erhalten Sie die letzte Revisionsnummer in SVN?


103

Mit PHP, Perl oder Python (vorzugsweise PHP) muss eine SVN-Datenbank abgefragt und die zuletzt an SVN gesendete Versionsnummer ermittelt werden. Ich brauche nichts anderes als das. Es muss nicht intensiv sein (also mache ich es alle 5 Minuten als Cron-Job; die Leistung von SVN sollte nicht beeinträchtigt werden).

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

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


2
"svn info --show-item revision" gibt die aktuelle Revision an, auf die das aktuelle Verzeichnis aktualisiert wird.
GreatAndPowerfulOz

1
$ svn info --show-item revision svn: invalid option: --show-itemVerwenden von Apache Subversion 1.8.16 (r1740329) kompiliert 26. April 2016. Auch versucht mit CollabNet 1.6.11 (r934486) kompiliert 6. März 2014.
IceArdor

Überprüfen Sie im Zusammenhang mit diesen Kommentaren svn help infodie rechtlichen Möglichkeiten fürsvn info
XavierStuvw

@ IceArdor Ich verwende SVN v1.9.5 und --show-itemist verfügbar
icc97

Antworten:


68
<?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 geleitet. Um stderr in Ihrer Ausgabe zu erfassen, verwenden Sie Folgendes:

$output = `svn info $url 2>&1`;

2
Wenn ein Fehler auftritt, wird die Ausgabe an stderr geleitet. Um stderr in Ihrer Ausgabe zu erfassen, verwenden Sie Folgendes: $ output = svn info $url 2>&1;
Daniel X Moore

3
Vielen Dank! Ich habe --xml verwendet, um mein eigenes C # -Tool zu erstellen, mit dem ich ein AssemblyFileVersion-Attribut generieren kann. PS: Englisch ist nicht meine Hauptsprache und ich war verwirrt über das Wort "so", das ich noch nie zuvor gehört hatte. Übrigens ist sein Ursprung ziemlich lustig: vgl. ( En.wiktionary.org/wiki/thusly ); Hast du es absichtlich benutzt (Wortspiel?) oder ist es üblich, dass du es absichtlich anstatt so verwendest?
Odalet

7
svn info $url | grep 'Last Changed Rev' | awk '{ print $4; }'
Cobra_Fast

7
@ Cobra_Fast, du musst nicht pfeifen, du kannst svn info --show-item revision $urloder svn info --show-item last-changed-revision $url.
cp.engr

2
@ cp.engr Ich glaube, das ist erst seit SVN v1.9 oder so - das heißt, ich habe es in v1.9.5 und es existiert nicht in v1.8.6
icc97

131

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

Die Versionsnummer ist eine einzelne Nummer, wenn die Arbeitskopie eine einzelne Revision ist, unverändert, nicht umgeschaltet und mit einer URL versehen ist, die dem Argument TRAIL_URL entspricht. Wenn die Arbeitskopie ungewöhnlich ist, ist die Versionsnummer komplexer:

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

2
stimmte zu, viel besser als svn info
Richard

32
svnversion ist für lokale Arbeitskopien vorgesehen und greift nicht wie in der Frage angegeben auf das Repository im Intranet zu.
Daniel X Moore

5
Für diejenigen, die mit svnversion nicht vertraut sind, ist es Teil des Standard-Befehlszeilenclients. Hier ist die Handbuchseite: svnbook.red-bean.com/nightly/en/svn.ref.svnversion.re.html .
Michael Sorens

45

svn info -r HEAD

Dadurch erhalten Sie die neueste Versionsnummer am Kopf Ihres Repositorys.

Es gibt einige nette Blog-Beiträge zum Integrieren von Subversion-Nummern in Ihr Build-Skript:


Dies ist der einfachste Weg, da Sie nicht zuerst die Repository-URL herausfinden müssen. Vielen Dank!
derFunk

Ich habe Fehler mit Anführungszeichen um HEAD bekommen, also sollte es nur seinsvn info -r HEAD
icc97

38

Dies sollte in Bash aus einem Arbeitsverzeichnis funktionieren. Ich habe es in Windows mit installierten Unixutils verwendet :

svn info |grep Revision: |cut -c11-

Es funktioniert, wenn Sie die Repository-URL dort einfügen, wo Sie% * haben, was auch immer Sie damit meinen. Schöne Syntax von cut, wusste es vorher nicht.
Ypnos

1
Hinweis: Da dies -rHEAD fehlt, wird die Commit-Revision für die angeforderte Datei oder das angeforderte Verzeichnis zurückgegeben. Dies ist möglicherweise nicht die letzte Gesamtrevision (da andere Änderungen möglicherweise an anderer Stelle oder in einem Teilbaum vorgenommen wurden).
Herr Fooz

4
Dies funktioniert auch nicht für lokalisierte Versionen von SVN (auf Polnisch ist dies | cut -c9-).
Zgoda

2
Das ist übrigens der Grund, warum ich lokalisierte Befehlszeilen-Entwicklertools nicht mag. Null Vorteil, viele Probleme. Normalerweise entferne ich die Lokalisierungen genau aus diesem Grund.
Gimpf

7
Das Übergeben eines Trennzeichens anstelle einer Zeichenanzahl funktioniert am besten für lokalisierten Inhalt. Beispielsweise svn info | grep Revision | cut -d " " -f 2wird die zweite Zeichenfolge zurückgegeben, nachdem sie mithilfe von Leerzeichen aufgeteilt wurde.
Butifarra

34

Folgendes sollte funktionieren:

svnlook youngest <repo-path>

Es wird eine einzelne Revisionsnummer zurückgegeben.


15

Verwenden Sie Folgendes, um die Nummer der neuesten Revision (" Kopfrevision ") in Ihrem Remote- Respository zu erhalten:

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

Ausgaben zum Beispiel:

35669

12

Ein Hinweis zum Abrufen der neuesten Versionsnummer:

Angenommen, ich habe cdin einem überarbeiteten Unterverzeichnis ( MyProjectDir) gearbeitet. Wenn ich dann anrufe svnversion:

$ svnversion .
323:340

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

 

Wenn ich dann anrufe svn info:

$ 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 - das ist eigentlich die niedrigste Revision von denen, die von gemeldet wurden svnversion!

 

Wir können dann svn infoim rekursiven Modus weitere Informationen aus dem lokalen Verzeichnis abrufen:

> 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 grep, um weitere Details zu sehen).

 

Was tun, wenn wir überprüfen möchten, was die neueste Version des Online- Repositorys ist (in diesem Fall @ server.com)? Dann geben wir erneut aus svn info, aber mit -r HEAD(beachten Sie den Unterschied zwischen -Rfrüherer Kapitaloption und -rjetzt Kleinbuchstaben ):

> svn info -r 'HEAD'
USER@server.com'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 - svn infobezieht sich immer noch auf das aktuelle Unterverzeichnis ( MyProjectDir), der Online-Pfad wird jedoch als MyProjectDir(im Gegensatz zum .lokalen Fall) gemeldet - und die gemeldete Online-Revision ist die höchste ( 340- im Gegensatz zur niedrigsten 323gemeldeten) örtlich).


9
  • Ab Subversion 1.9 können Sie mit der Option --show-item einen Wert für eines der svn infoAusgabefelder des Befehls abrufen . Dieser Befehl zeigt nur die Versionsnummer an:

    svn info --show-item=revision <URL-to-repository>
    
  • Holen Sie sich die XML-Ausgabe von SVN-Informationen mit der --xmlOption 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
    
  • Mit VisualSVN Server 3.4 oder neuer können Sie die Anzahl der Revisionen in einem Repository ermitteln, indem Sie die folgenden Befehle ausführen:

    $repo = Get-SvnRepository <REPOSITORY-NAME>

    $repo.Revisions

    Weitere Informationen finden Sie in der Get-SvnRepositoryPowerShell-Cmdlet-Referenz .


7

Ich denke du suchst

svn info -r HEAD

Können Sie diesen Befehl ausführen?

Sie müssen wahrscheinlich auch Anmeldeinformationen für das Repository angeben.


Ich denke, es muss svn info -r HEAD sein
Stephen

-r kann dann leicht weggelassen werden.
Ypnos

Richtig - ich habe die Option für das -r nicht angegeben - dies war nur für ihn, um zu finden, was er braucht, und um mit der Hilfe / dem Buch zu beginnen.
Tim

4

Jemand anderes hat mich geschlagen, um die Antwort zu veröffentlichen. svnversionDies ist definitiv die beste Lösung, 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 svnlookBefehl. Dies ist der Befehl, den Sie beim Schreiben eines Hook-Skripts zum Überprüfen des Repositorys verwenden (und sogar der aktuellen Transaktion im Fall von Hooks vor dem Festschreiben). Sie können svnlook helpfür Details eingeben. Sie möchten wahrscheinlich den svnlook youngestBefehl verwenden. Beachten Sie, dass ein direkter Zugriff auf das Repo-Verzeichnis erforderlich ist, sodass es auf dem Server verwendet werden muss.


2
nickh@SCLLNHENRY:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svnversion
12354

Oder

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

Oder

nickh@SCLLNHENRY:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svn info --xml | xmlstarlet sel -t --value-of "//commit/@revision"
12335

2

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

Wenn Sie das Unglück haben, dies aus einer Windows-Batchdatei heraus tun zu müssen, finden Sie hier die Beschwörung, nach der Sie suchen:

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 wird ein Doppelpunkt als Trennzeichen zwischen dem ersten und dem zweiten Token in der Zeile verwendet. Wenn das erste Token "Revision" ist, wird die Umgebungsvariable REV auf das zweite Token gesetzt.


1
Sie können auch FINDSTR verwenden:FOR /F "tokens=2" %%i IN ('svn info ^| FINDSTR Revision:') DO SET revision=%%i
icc97

siehe diese andere SO-Antwort für die Grundlage dieser
icc97

2

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 --xmlParameter verwenden, um das Ergebnis als XML abzurufen. Das sollte einfacher zu analysieren sein als die Befehlszeilenausgabe.


Ich benutze subprocess.check_outputin Python, um einen weiteren Bibliotheksaufruf zu vermeiden. Wenn Sie nur die Versionsnummern überprüfen / die neuesten Kopien abrufen, ist es einfacher, svn über die Befehlszeile über zu verwenden subprocess. Nun, wenn Sie automatische Check-Ins und Zusammenführungen durchführen ...
Droogans

2

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 Versionsnummer

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

2

Sie können den folgenden Befehl ausprobieren:

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

1

Just svn infoin 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

Der einfachste und sauberste Weg, dies zu tun (tatsächlich SVN 1.9, veröffentlicht 2015), ist:

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

Die Ausgabe ist die Nummer der letzten (jüngsten) Revision für die SVNURL oder die Nummer der aktuellen Revision der Arbeitskopie von SVNPATH. Das --no-newlineist optional und weist an, svnkeine kosmetischen Zeilenumbrüche auszugeben (\n nach dem Wert ) , wenn Sie nur eine minimale Ausgabe benötigen (nur die ).

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


1
Ich habe svn 1.9.3 ausprobiert und der Befehl hier lautet svn info --show-itemanstelle von--show item
elopio

0

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

Wenn ich eine URL oder eine Arbeitskopie mit dem svn:externalsEigenschaftssatz habe, können sich die externen Elemente ändern, und daher ändert sich die neueste Version des Subversion-Servers. Bei der letzten Überarbeitung der Arbeitskopie oder URL wird die Versionsnummer jedoch nur gemeldet, wenn die Eigenschaft svn: externals geändert wurde oder ein Element im URL-Pfad niedriger ist, was ein erwartetes Verhalten darstellt.

Also bekommst du entweder die svn:externals Eigenschaft und iterieren über 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.

Also, wenn Sie Äußerlichkeiten verwenden, ist es am besten zu verwenden , svn info BASE_URLwo BASE_URLdie Wurzel - URL für alle Pfade auf dem Subversion - Server.


0

Dadurch wird nur die Revisionsnummer der zuletzt geänderten Revision angezeigt:

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

Ich hoffe das hilft.


0

$ svn log | head -10 in welchem ​​Verzeichnis auch immer, das einen .svnOrdner hat


0

svn infooder svnversionnicht berücksichtigen Unterverzeichnisse, um die neueste "Revision" der Live-Codebasis zu finden, hat der unten gehackte Weg für mich funktioniert - es kann eine Weile dauern, bis es ausgeführt wird:

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

0

Dies kann mit der "SVN" -Bibliothek erreicht werden:

import svn.remote

file_path = "enter your filepath"

svn_inf = svn.remote.RemoteClient(file_path)

head_revision = ([x for x in svn_inf.log_default(revision_to = 'HEAD')] [-1]).revision

Die head_revision sollte die neueste Versionsnummer der Datei enthalten


-1

Es sieht so aus, als ob es dafür einen Eintrag in den offiziellen FAQ gibt . Der Quellcode ist in C, aber es gilt das gleiche Prinzip, wie hier in diesem Mailinglistenbeitrag beschrieben .


Dies ist ein großartiges Tool / eine großartige Antwort, aber ich glaube nicht, dass er so viel braucht - ich habe verstanden, dass es nur die neueste Revision braucht, damit er vielleicht einen Build starten kann, wenn sich seine aktuelle Revision von einer vorherigen unterscheidet, seit er sie zuletzt überprüft hat. Vielleicht habe ich falsch verstanden.
Tim

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.