Wie ermitteln Sie die neueste SVN-Revisionsnummer, die in einem Verzeichnis verwurzelt ist?

StackOverflow https://stackoverflow.com/questions/56227

  •  09-06-2019
  •  | 
  •  

Frage

Ich möchte damit beginnen, meine bereitgestellten Binärdateien mit der neuesten SVN-Revisionsnummer zu kennzeichnen.

Da SVN jedoch dateibasiert und nicht verzeichnis-/projektbasiert ist, muss ich alle Dateien des Verzeichnisses und Unterverzeichnisses durchsuchen, um die höchste Revisionsnummer zu ermitteln.

Benutzen svn info im Stammverzeichnis funktioniert nicht (es meldet nur die Version dieses Verzeichnisses, nicht die Dateien in Unterverzeichnissen):

Ich habe mich gefragt, ob es eine Verknüpfung mit dem gibt svn Befehl, dies zu tun.Kann sonst jemand ein einfaches Skript vorschlagen, das netzwerkeffizient ist (ich würde es vorziehen, wenn es den Remote-Server überhaupt nicht erreichen würde)?

Ich verstehe auch, dass ein alternativer Ansatz darin besteht, einen zu behalten Versionsdatei mit dem svn:keywords.Das funktioniert (ich habe es bei anderen Projekten verwendet), aber ich bin es leid, sicherzustellen, dass die Datei schmutzig ist, und mich mit den unvermeidlichen Zusammenführungskonflikten auseinanderzusetzen.

Antwort Ich sehe mein Problem darin, dass ich es nicht richtig gemacht habe svn up bevor Sie anrufen svn info im Stammverzeichnis:

$ svn info
Path: .
...
Last Changed Author: fak
Last Changed Rev: 713
Last Changed Date: 2008-08-29 00:40:53 +0300 (Fri, 29 Aug 2008)

$ svn up
At revision 721.

$ svn info
Path: .
...
Revision: 721
Last Changed Author: reuben
Last Changed Rev: 721
Last Changed Date: 2008-08-31 22:55:22 +0300 (Sun, 31 Aug 2008)
War es hilfreich?

Lösung

Eine Möglichkeit. Wenn Sie den Code überprüfen, sehen Sie die letzte Zeile von svn Ausgabe:

$ svn up
...stuff...
Updated to revision 66593.

Ein direkterer Weg:

$ svn info
Path: .
URL: https://svn.example.com/svn/myproject/trunk
Repository Root: https://svn.example.com/svn/
Repository UUID: d2a7a951-c712-0410-832a-9abccabd3052
Revision: 66593
Node Kind: directory
Schedule: normal
Last Changed Author: bnguyen
Last Changed Rev: 66591
Last Changed Date: 2008-09-11 18:25:27 +1000 (Thu, 11 Sep 2008)

Andere Tipps

svnversion scheint der zu sein, sauberste Weg, dies zu tun:

svnversion -c /path/to/your-projects-local-working-copy/. | sed -e 's/[MS]//g' -e 's/^[[:digit:]]*://'

Der obige Befehl wird allen M und S Buchstaben reinigen (was lokale Änderungen oder switchedness) aus der Ausgabe sowie die kleinere Versionsnummer bei svnversion einen Bereich gibt, statt nur eine Revisionsnummer (siehe die Dokumentation für weitere Informationen ). Wenn Sie nicht über die Ausgabe filtern wollen, das Rohr herausnehmen und den sed Teil dieses Befehls.

Wenn Sie svn info verwenden möchten, müssen Sie die „rekursiven“ (-R) Argument verwenden, um die Informationen aus allen Unterverzeichnissen sowie zu bekommen. Da der Ausgang wird dann eine lange Liste, müssen Sie einige Filter tun, um die zuletzt geänderten Revisionsnummer von allen denen zu erhalten, das ist die höchste:

svn info -R /path/to/your-projects-local-working-copy/. | awk '/^Last Changed Rev:/ {print $NF}' | sort -n | tail -n 1

Was dieser Befehl tut, ist, dass es alle Zeilen nimmt, die die Zeichenfolge "Last Changed Rev" enthalten, dann ist alles aus jeder dieser Zeilen mit Ausnahme der letzten Feld entfernt (dh die Revisionsnummer), dann diese Zeilen numerisch sortiert und entfernt alles, aber die letzte Zeile, was gerade in der höchsten Revisionsnummer. Wenn Sie Windows laufen lassen, ich bin sicher, dass Sie dies in Powershell ganz leicht tun können, als auch, zum Beispiel.

Just klar zu sein: die oben genannten Ansätze erhalten Sie die rekursive letzte geänderte Revisionsnummer nur den Weg in den Repo, die Ihrer lokalen Arbeitskopie repräsentiert, für die lokale Arbeitskopie, , ohne den Server zu schlagen . Also, wenn jemand etwas in diesem Pfad auf den Repository-Server nach dem letzten svn update aktualisiert hat, wird es nicht in dieser Ausgabe reflektiert werden.

Wenn das, was Sie wollen, ist die letzte geänderte Revision dieses Pfades auf dem Server können Sie tun:

svn info /path/to/your-projects-local-working-copy/.@HEAD | awk '/^Last Changed Rev:/ {print $NF}'

Duplizieren von diese Frage . Als ich dort geschrieben, ist der svnversion Befehl dein Freund. Keine Notwendigkeit, die Ausgabe zu analysieren, keine Notwendigkeit, zuerst zu aktualisieren, so die Arbeit erledigt.

Ich weiß nicht, ob Sie MSBuild (Visual Studio) verwenden, um Ihre Binärdateien zu bauen. Aber wenn man es: gibt es eine Verbindung möglich zwischen Subverion und MSBuild durch MSBuild Community-Aufgaben Projekt

Hier ist Teil unseres Build-Skript: unsere (C #) Anwendung wird die SVN-Revisionsnummer enthalten:

  <SvnVersion LocalPath="$(MSBuildProjectDirectory)" ToolPath="installationpath\of\subversion\bin">
     <Output TaskParameter="Revision" PropertyName="Revision" />
  </SvnVersion>
  <Message Text="Version: $(Major).$(Minor).$(Build).$(Revision)"/>
...
    AssemblyVersion="$(Major).$(Minor).$(Build).$(Revision)"
     AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)"

Jan

Die gegebenen Antworten von @Charles Miller und @Troels Arvin korrekt sind - Sie den Ausgang des svn update oder svn info verwenden können, aber wie Sie andeuten, funktioniert diese nur, wenn das Repository auf dem neuesten Stand ist. Dann wieder, ich bin mir nicht sicher, welchen Wert jeder Revisionsnummer Sie sein wird, wenn ein Teil Ihrer Quellbaum auf einer anderen Version als ein anderer Teil ist. Es klingt wirklich für mich wie Sie auf einem homogenen Baum arbeiten sollten. Ich würde entweder die Aktualisierung vorschlagen, bevor info läuft (oder, wenn Sie bereits für Ihren Build aktualisiert haben, Sie sind golden) oder mit svn info URL-to-source.

Es ist ein Programm, mit Subversion verteilt genannt svnversion das tut genau das, was Sie tun möchten. Es ist, wie wir unsere Webseiten markieren.

Wenn Sie nur die Revisionsnummer der letzten Änderung wollen, die begangen wurde, und mit Windows ohne grep / awk / xargs, hier ist die nackten Knochen Befehl ausgeführt werden soll (Kommandozeile):

X:\trunk>svn info -r COMMITTED | for /F "tokens=2" %r in ('findstr /R "^Revision"') DO @echo %r
67000

svn info -r COMMITTED geben Ihnen die neueste verpflichtet in das Verzeichnis Sie sich gerade befinden:

X:\Trunk>svn info -r COMMITTED
Path: trunk
URL: https://svn.example.com/svn/myproject/trunk
Repository Root: https://svn.example.com/svn/
Repository UUID: d2a7a951-c712-0410-832a-9abccabd3052
Revision: 67400
Node Kind: directory
Last Changed Author: example
Last Changed Rev: 67400
Last Changed Date: 2008-09-11 18:25:27 +1000 (Thu, 11 Sep 2008)

Die for-Schleife läuft findstr des Revisionsteil des Ausgangssignals von svn info zu lokalisieren. Die Ausgabe von dieser wird (Sie werden sehen, das nicht):

Revision: 67000

Welche dann teilt sich die Token und gibt den zweiten, echoed geführt werden:

67000

„svn info“ zeigen Ihnen die Revisionsnummer der Arbeitskopie (siehe die „Revision“ Zeile in der Ausgabe von „svn info“). Ihr Build-System wahrscheinlich ermöglicht es Ihnen, den entsprechenden Teil von „svn info“ 'zu platzieren s Ausgabe irgendwo, wo es in Ihrer Anwendung widerspiegeln. Zum Beispiel können Sie festlegen, dass beim Bau, eine temporäre (un-versioniert) Datei erstellt werden soll, von „svn info“ enthalten Ausgang; und Sie dann schließen Sie diese Datei beim Kompilieren.

Für mich ist der beste Weg, um die letzte Revisionsnummer der Stamm / Filiale, um herauszufinden, ist es von der Remote-URL zu erhalten. Es ist wichtig, nicht das Arbeitsverzeichnis zu verwenden, da es veraltet sein kann. Hier ein Ausschnitt mit Batch ist (ich hasse es, eine viel; -)):

@for /f "tokens=4" %%f in ('svn info %SVNURL% ^|find "Last Changed Rev:"') do set lastPathRev=%%f

echo trunk rev no: %lastPathRev%

Dennoch habe ich ein Problem, diese Zahl als Interims-Version in Quellen zu codieren $ Rev enthalten: $. Das Problem ist, dass $ Rev: $ die Datei rev enthält. Nein. Also, wenn Stamm rev nicht größer ist als der rev keine der Versionsdatei, muß ich diese Datei „künstlich“ ändern und sie zu verpflichten, die richtige Zwischenversion (= Stamm-Version) zu erhalten. Dies ist eine Scheibe! Hat jemand eine bessere Idee? Vielen Dank

Das ist lächerlich, aber svn info oder svnversion wird nicht berücksichtigt Verzeichnisse; es ist eine Eigenschaft ‚Gemischte Revisionen‘ genannt arbeiten - ich nenne es Folter. Ich brauche nur die neueste ‚Revision‘ der Live-Code-Basis zu finden und die Art und Weise unten arbeitete für mich gehackt - es könnte eine Weile dauern, laufen:

repo_root# find ./ | xargs -l svn info  | grep 'Revision: ' | sort
...
Revision: 86
Revision: 86
Revision: 89
Revision: 90
root@fairware:/home/stage_vancity#
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top