Aktueller Subversion-Revisionsbefehl


75

Gibt es einen Subversion-Befehl, um die aktuelle Versionsnummer anzuzeigen?

Nachdem svn checkoutich ein Skript starten möchte und die Revisionsnummer in einer Variablen benötige. Es wäre toll, wenn es einen Befehl wie gäbe svn info get_revision_number.

Antworten:


117

Neuere Versionen von svn unterstützen das --show-itemArgument:

svn info --show-item revision

Verwenden Sie für die Versionsnummer Ihrer lokalen Arbeitskopie:

svn info --show-item last-changed-revision

Sie können os.system()eine Befehlszeile wie folgt ausführen:

svn info | grep "Revision" | awk '{print $2}'

Ich mache das in meinen nächtlichen Build-Skripten.

Auch auf einigen Plattformen gibt es einen svnversionBefehl, aber ich glaube, ich hatte einen Grund, ihn nicht zu verwenden. Ahh, richtig. Sie können die Versionsnummer nicht von einem Remote-Repository abrufen, um sie mit der lokalen mit svnversion zu vergleichen.


4
Beachten Sie, dass es eine war cmd.exeTag in der ursprünglichen Frage, was bedeutet , das OP in Windows ist, wo Sie nicht verwenden können grepund awk.
Iamamac

1
os.system teilt Ihnen nur den Exit-Code mit, bietet jedoch keine Möglichkeit, die Ausgabe abzurufen. Stattdessen ist das Ausführen svn info(z. B. mit dem Unterprozessmodul), das Lesen der Ausgabe und das Ausführen der grep / awk-Schritte direkt in Python ( if "Revision" in line: return line.split()[1]) in der Regel einfacher und einfacher als der Versuch, Bash-Befehle in Python zu schreiben.

4
loswerden von grep:svn info | awk '/Revision/ { print $2; }'
nur jemand

4
Wenn Sie awk trotzdem aufrufen, können Sie den grep-Teil überspringen:svn info | awk '/^Revision:/ {print $2;}'
ndim

1
Wenn Ihr System Gebietsschemas verwendet, sollten Sie vorher "LANG = C" hinzufügen, wie folgt:LANG=C svn info | grep "Revision" | awk '{print $2}'
Florent

24

Es gibt auch einen bequemeren (für einige) svnversionBefehl.

Die Ausgabe kann eine einzelne Revisionsnummer oder ähnliches sein (von -h):

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

Ich verwende dieses Python-Code-Snippet, um Revisionsinformationen zu extrahieren:

import re
import subprocess

p = subprocess.Popen(["svnversion"], stdout = subprocess.PIPE, 
    stderr = subprocess.PIPE)
p.wait()
m = re.match(r'(|\d+M?S?):?(\d+)(M?)S?', p.stdout.read())
rev = int(m.group(2))
if m.group(3) == 'M':
    rev += 1

5
  1. Zunächst hat der SVN-Status die Revisionsnummer, die Sie von dort aus lesen können.

  2. Außerdem kann jede Datei, die Sie in SVN speichern, die $Rev$Versionsnummer in sich selbst speichern. Fügen Sie das Schlüsselwort zu Ihrer Datei hinzu und führen Sie propset aus:svn propset svn:keywords "Revision" file

  3. Schließlich befindet sich die Revisionsnummer auch in der .svn/entriesDatei, vierte Zeile

Jedes Mal, wenn Sie diese Datei auschecken, hat sie die Revision für sich.


Ist es für Punkt 3 vernünftig zu erwarten, dass die Revisionsnummer immer in der 4. Zeile steht? Wenn dies eine vernünftige Erwartung ist, scheint dies der einfachste Weg zu sein, dies in nahezu jeder Umgebung zu tun.
Grimus

Ja, zumindest in einem vernünftigen Subversion-Versionsbereich. Wenn sie das Format in einer zukünftigen Version ändern (möglich, aber nicht wahrscheinlich bald), müssten Sie sich anpassen.
Kornel Kisielewicz

Ich habe mich ein wenig damit befasst und Folgendes festgestellt: svnbook.red-bean.com/de/1.4/svn.developer.insidewc.html Es hört sich so an, als würde sich das Format von Zeit zu Zeit ändern. Ich bin mir sicher, dass das Lesen der Eintragsdatei für die meisten Dinge gut funktioniert, aber Sie müssen sicherstellen, dass Sie Ihren Code beibehalten, wenn sich die Eintragsdatei ändert.
Grimus

Hoppla, ich habe Ihren Kommentar nicht gesehen, bevor ich ihn gepostet habe, aber ich denke, wir sind uns trotzdem einig.
Grimus

Versucht am svn, version 1.11.0 (r1845130) compiled Oct 31 2018, 12:40:42 on x86_64-unknown-cygwin: .svn/entriesenthält nur eine ganze Zahl.
Badams


2

svn infoIch glaube, das ist was du willst.

Wenn Sie nur die Überarbeitung wollten, könnten Sie vielleicht etwas tun wie:

svn info | grep "Revision:"

2

Verwenden Sie Folgendes, um die XML-Ausgabe von Subversion zu nutzen:

# parse rev from popen "svn info --xml"
dom = xml.dom.minidom.parse(os.popen('svn info --xml'))
entry = dom.getElementsByTagName('entry')[0]
revision = entry.getAttribute('revision')

Beachten Sie auch, dass der <commit revision=...>Eintrag je nachdem, wofür Sie dies benötigen, möglicherweise mehr das ist, wonach Sie suchen. Dies ergibt die "Last Changed Rev", die sich erst ändert, wenn sich der Code im aktuellen Baum tatsächlich ändert, im Gegensatz zu "Revision" (was oben angegeben ist), die sich jedes Mal ändert, wenn sich etwas im Repository ändert (sogar Verzweigungen). und du machst ein "svn up", was nicht dasselbe ist oder oft so nützlich.


Svn bitten, XML auszugeben und dann zu analysieren? Ist es als Witz gedacht?
Julien Guertault

1
@JulienGuertault, nein, wird die XML - Ausgabe bedeutet für programmatische Verwendung , während der Nicht-XML nicht ist. Das Parsen der menschlichen Ausgabe birgt das Risiko, dass sich das Format in Zukunft ändert und Ihr Code beschädigt wird. Je nach Kontext ist möglicherweise jedes Mal benutzerdefinierte Arbeit erforderlich, wenn Sie ähnliche Aufgaben ausführen müssen. Wenn Sie den XML-Ansatz verwenden, können Sie im Laufe der Zeit Aufwand für die Infrastruktur sparen. Kein Scherz, aber ich würde auch nicht sagen, dass es auf jeden Fall falsch ist, es anders zu machen . Nur persönliche Vorlieben. Ich habe beides in unterschiedlichen Inhalten gemacht.
Peter Hansen

Die Analyse der Maschine gegen die menschliche Ausgabe ist ein gültiger Punkt (der in Ihrer Antwort hervorgehoben werden sollte). Aber warum nicht einfach benutzen svnversion? Es hat eine dokumentierte kompakte Ausgabe und benötigt nichts so Komplexes, um es zu analysieren.
Julien Guertault

@frgtn hat svnversion für seine Antwort oben angegeben, aber wie bereits erwähnt, bietet die Verwendung der Ausgabeoptionen --xml für die verschiedenen svn-Unterbefehle eine einheitliche Möglichkeit, mit einer Vielzahl von Anforderungen umzugehen. Mit svnversion benötigen Sie möglicherweise noch einen weiteren benutzerdefinierten Parser, z. B. um mit einem angehängten "M" umzugehen, wenn Sie dies nicht möchten. Bitte betrachten Sie meine Antwort als eine von vielen möglichen Alternativen, die vom OP nicht akzeptiert werden, aber möglicherweise für Nachzügler nützlich sind, die von einer Suche hierher kommen.
Peter Hansen

Danke für die zusätzliche Erklärung.
Julien Guertault

2

Ich habe gerade die Antwort von @ badcat in einer modifizierten Version verwendet und Folgendes verwendet subprocess.check_output():

import subprocess
revision = subprocess.check_output("svn info | awk '/^Revision:/ {print $2}'", shell=True).strip()

Ich glaube, Sie können pysvn auch installieren und verwenden, wenn Sie Python als Schnittstelle zu svn verwenden möchten.


1

Niemand erwähnt die Windows-Welt SubWCRev , die bei richtiger Verwendung die benötigten Daten automatisch an den benötigten Stellen ersetzen kann, wenn das Skript SubWCRev in Form aufruftSubWCRev WC_PATH TPL-FILE READY-FILE

Beispiel meines Post-Commit-Hooks (Teil von)

SubWCRev.exe CustomLocations Builder.tpl  z:\Builder.bat
...
call z:\Builder.bat

wo mein Builder.tpl ist

svn.exe export trunk z:\trunk$WCDATE=%Y%m%d$-r$WCREV$

Als Ergebnis habe ich jedes Mal eine Bat-Datei mit dem variablen Teil - Name des Verzeichnisses -, der den Metadaten von Working Copy entspricht


0

Ich denke, ich muss svn info machen und dann die Nummer mit einer String-Manipulation aus "Revision: xxxxxx" abrufen. Es wäre einfach schön, wenn es einen Befehl gäbe, der nur die Nummer zurückgibt :)


0

Andernfalls können Sie in der alten Version den folgenden Befehl verwenden, wenn '--show-item' nicht erkannt wird:

svn log -r HEAD | grep -o -E "^r[0-9]{1,}" | sed 's/r//g'

Ich hoffe es hilft.

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.