2008-09-21 3 views

Antwort

14
svn info <Repository-URL> 

oder

svn info --xml <Repository-URL> 

auf das Ergebnis schauen dann. Für xml, parse/info/entry/@ revision für die Revision des Repositories (151 in diesem Beispiel) oder/info/entry/commit/@ revision für die Revision des letzten Commits gegen diesen Pfad (133, nützlich beim Arbeiten mit Tags):

<?xml version="1.0"?> 
<info> 
<entry 
    kind="dir" 
    path="cmdtools" 
    revision="151"> 
<url>http://myserver/svn/stumde/cmdtools</url> 
<repository> 
<root>http://myserver/svn/stumde</root> 
<uuid>a148ce7d-da11-c240-b47f-6810ff02934c</uuid> 
</repository> 
<commit 
    revision="133"> 
<author>mstum</author> 
<date>2008-07-12T17:09:08.315246Z</date> 
</commit> 
</entry> 
</info> 

ich schrieb ein Werkzeug (cmdnetsvnrev, Quellcode enthalten) für mich, die die Revision in meine AssemblyInfo.cs Dateien ersetzt. Es ist zwar auf diesen Zweck beschränkt, aber in der Regel Svn Info und Verarbeitung ist der Weg zu gehen.

1

Nun, Sie können 'svn info' ausführen, um die aktuelle Revisionsnummer zu ermitteln, und Sie könnten das wahrscheinlich ziemlich einfach mit einer Regex, wie "Revision: ([0-9] +)" extrahieren.

+0

'svn info | sed -n 's/^ Revision: // p'' – tripleee

7

Wenn Sie Schildkröte SVN haben, können Sie SubWCRev.exe verwenden

Erstellen Sie eine Datei namens:

RevisionInfo.tmpl

SvnRevision = $WCREV$; 

Dann diesen Befehl ausführen:

SubWCRev.exe . RevisionInfo.tmpl RevisionInfo.txt 

Es wird eine Datei ReivisonInfo.txt mit Ihrer Revisionsnummer wie folgt erstellt:

Anstatt jedoch die .txt-Datei zu verwenden, können Sie die gewünschte Quelldatei verwenden und auf die Reivennummer innerhalb Ihres Quellcodes zugreifen.

12

Add svn: keywords auf die SVN Eigenschaften der Quelldatei:

svn:keywords Revision 

Dann in der Quelldatei enthalten:

private const string REVISION = "$Revision$"; 

Die Revision wird mit der Revisionsnummer beim nächsten aktualisiert werden (z. B.) "$Revision: 4455$". Sie können diese Zeichenfolge analysieren, um nur die Revisionsnummer zu extrahieren.

+0

Eine Frage dazu: Ich habe festgestellt, dass $ Revision $ nur aktualisiert wird, wenn sich diese bestimmte Datei ändert, ansonsten bleibt sie unverändert. Gibt es eine Möglichkeit, $ Revision $ bei jedem Ein-/Auschecken zu erzwingen, unabhängig davon, ob die Datei beim letzten Commit geändert wurde oder nicht? –

+0

Nein, Sie müssen eine Datei ändern und festlegen, dass dies funktioniert. Ich habe immer gerade die REVISION const in die Datei aufgenommen, die die Versionsnummer oder Versionshinweise enthält, die normalerweise vor einer Veröffentlichung sowieso aktualisiert werden. –

+0

Wie würden Sie das tun, wenn die Datei eine .js-Datei ist? – jamesfzhang

1

Wenn Sie unter GNU/Linux laufen, cd in das Verzeichnis der Arbeitskopie und auszuführen:

svn -u status | grep Status\ against\ revision: | awk '{print $4}'

Aus meiner Erfahrung svn info nicht zuverlässig Zahlen nicht geben, nachdem Verzeichnisse umbenennen.

+0

Und wie immer 'grep foo | awk '{bar}' kann am nützlichsten in 'awk '/ foo/{bar}'' - 'svn -u status | awk '/ Status gegen Revision:/{print $ 4}' – tripleee

5

Sie sagen nicht, welche Programmiersprache/Framework Sie verwenden.Hier ist, wie es in Python zu tun mit PySVN

import pysvn 
repo = REPOSITORY_LOCATION 
rev = pysvn.Revision(pysvn.opt_revision_kind.head) 
client = pysvn.Client() 
info = client.info2(repo,revision=rev,recurse=False) 
revno = info[0][1].rev.number # revision number as an integer 
0

Sie wollen die Subversion info subcommand wie folgt:

$ svn info . 
Path: . 
URL: http://trac-hacks.org/svn/tracdeveloperplugin/trunk 
Repository Root: http://trac-hacks.org/svn 
Repository UUID: 7322e99d-02ea-0310-aa39-e9a107903beb 
Revision: 4190 
Node Kind: directory 
Schedule: normal 
Last Changed Author: coderanger 
Last Changed Rev: 3397 
Last Changed Date: 2008-03-19 00:49:02 -0400 (Wed, 19 Mar 2008) 

In diesem Fall gibt es zwei Revisionsnummern: 4190 und 3397. 4190 ist die letzte Revisionsnummer für das Repository und 3397 ist die Revisionsnummer der letzten Änderung des Teilbaums, von dem dieser Arbeitsbereich ausgecheckt wurde. Sie können einen Pfad zu einem Arbeitsbereich oder eine URL zu einem Repository angeben.

AC# Fragment dies unter Windows zu extrahieren etwas würde wie folgt aussehen:

Process process = new Process(); 
process.StartInfo.FileName = @"svn.exe"; 
process.StartInfo.Arguments = String.Format(@"info {0}", path); 
process.StartInfo.UseShellExecute = false; 
process.StartInfo.RedirectStandardOutput = true; 
process.Start(); 

// Parse the svn info output for something like "Last Changed Rev: 1234" 
using (StreamReader output = process.StandardOutput) 
{ 
    Regex LCR = new Regex(@"Last Changed Rev: (\d+)"); 

    string line; 
    while ((line = output.ReadLine()) != null) 
    { 
     Match match = LCR.Match(line); 
     if (match.Success) 
     { 
      revision = match.Groups[1].Value; 
     } 
    } 
} 

(. In meinem Fall verwenden wir die Subversion Revision als Teil der Versionsnummer für Baugruppen)

5

Verwendung C# und SharpSvn (von http://sharpsvn.net) würde der Code:

//using SharpSvn; 
long revision = -1; 
using(SvnClient client = new SvnClient()) 
{ 
    client.Info(path, 
    delegate(object sender, SvnInfoEventArgs e) 
    { 
     revision = e.Revision; 
    }); 
} 
31

Haben Sie Ihren Build-Prozess den svnversion Befehl aufrufen und einbetten seine Ausgabe in generierte {source | binaries}. Dies gibt nicht nur die aktuelle Revision (wie viele andere Beispiele hier), sondern sein Ausgabe-String zeigt auch an, ob ein Build in einem gemischten Baum oder einem Baum gemacht wird, der nicht exakt mit der betreffenden Revisionsnummer übereinstimmt (d. H ein Baum mit lokalen Änderungen).

Mit einem Standard-Baum:

$ svnversion 
3846 

Mit einem modifizierten Baum:

$ echo 'foo' >> project-ext.dtd 
$ svnversion     
3846M 

Mit einer gemischten Revisionen, modifizierte Baum:

$ (cd doc; svn up >/dev/null 2>/dev/null) 
$ svnversion 
3846:4182M 
+0

eine Idee, wie Sie es bekommen können, um die Versionen von irgendwelchen Externals auch aufzulisten? – ShoeLace

+1

@ShoeLace - Nicht mit svnversion, leider - aber ein bisschen grep und awk arbeiten am svn status --verbose wird dich bekommen, was du suchst. –

+0

@ShoeLace, ... btw, um das zu aktualisieren - heute würde ich 'svn status --verbose --xml' verwenden, mit XMLStarlet oder einer XSLT-Template-Nachbearbeitung. –

3

In meinem neuesten Projekt gelöst I Dieses Problem wird durch mehrere Tools, SVN, NAnt und eine benutzerdefinierte NAnt-Task.

  1. Verwendung NAnt svn info --xml ./svnInfo.xml
  2. Verwendung NAnt auszuführen, um die Versionsnummer aus der XML-Datei zu ziehen mit <xmlpeek>
  3. Verwenden Sie eine benutzerdefinierte NAnt Aufgabe, das Attribut Assemblyversion zu aktualisieren, in der AssemblyInfo.cs mit der neuesten Datei mit die Versionsnummer (zB major.minor.maintenance, revision) vor dem Kompilieren des Projekts.

Die Version verwandte Abschnitte meines Build-Skript wie folgt aussehen:

<!-- Retrieve the current revision number for the working directory --> 
<exec program="svn" commandline='info --xml' output="./svnInfo.xml" failonerror="false"/> 
<xmlpeek file="./svnInfo.xml" xpath="info/entry/@revision" property="build.version.revision" if="${file::exists('./svnInfo.xml')}"/> 

<!-- Custom NAnt task to replace strings matching a pattern with a specific value --> 
<replace file="${filename}" 
     pattern="AssemblyVersion(?:Attribute)?\(\s*?\&quot;(?&lt;version&gt;(?&lt;major&gt;[0-9]+)\.(?&lt;minor&gt;[0-9]+)\.(?&lt;build&gt;[0-9]+)\.(?&lt;revision&gt;[0-9]+))\&quot;\s*?\)" 
     value="AssemblyVersion(${build.version})" 
     outfile="${filename}"/> 

Der Kredit für den regulären Ausdruck geht an: http://code.mattgriffith.net/UpdateVersion/. Ich habe jedoch festgestellt, dass UpdateVersion meine Anforderungen nicht erfüllt hat, da das Pin-Feature in meinem Build defekt war. Daher die benutzerdefinierte NAnt-Aufgabe.

Wenn jemand in den Code interessiert ist, für die benutzerdefinierte NAnt replace Aufgabe lassen Sie es mich wissen. Da dies für ein Arbeitsprojekt war, muss ich mit dem Management überprüfen, ob wir es unter einer freundlichen (kostenlosen) Lizenz veröffentlichen können.

19

Der Befehl svnversion ist der richtige Weg, dies zu tun. Es gibt die Revisionsnummer aus, mit der sich Ihre gesamte Arbeitskopie befindet, oder eine Reihe von Revisionen, wenn Ihre Arbeitskopie gemischt ist (z. B. sind einige Verzeichnisse aktuell und andere nicht). Es zeigt auch an, ob die Arbeitskopie lokale Änderungen aufweist. Zum Beispiel in einem ziemlich unsauberen Arbeitsverzeichnis:

$ svnversion 
662:738M 

Die $ Revision $ Schlüsselwort nicht tut, was Sie wollen: es ändert sich nur, wenn die Datei enthält, der Fall ist. Das Subversion-Buch gibt more detail. Der "svn info" -Befehl tut auch nicht das, was Sie wollen, da er Ihnen nur den Status Ihres aktuellen Verzeichnisses mitteilt und den Zustand von Unterverzeichnissen ignoriert. Im gleichen Arbeits Baum wie im vorherigen Beispiel, ich einige Unterverzeichnisse hatte, die als das Verzeichnis neuere war ich war, aber „svn info“ nicht bemerkt:

$ svn info 
... snip ... 
Revision: 662 

Es ist einfach svnversion in Ihren Build-Prozess zu integrieren , so dass jeder Build die Revisionsnummer in einer für die Laufzeit zugänglichen Form erhält. Für ein Java-Projekt zum Beispiel ließ ich unser Makefile die svnversion-Ausgabe in eine .properties-Datei ablegen.

+0

Bitte akzeptieren Sie meine Entschuldigung für den nun umgekehrten Downvote. Zu der Zeit betrachtete ich diesen platformistischen Ansatz - aber er fügt neue Inhalte hinzu (erklärt die Einschränkungen von $ Revision $, was die Verwendung eines Makefiles nahelegt), ohne einen Text wörtlich zu kopieren, also ist es völlig legitim Antworten. –

2

In Rails verwende ich dieses Snippet in meiner environment.rb, die mir eine Konstante gibt, die ich in der ganzen Anwendung verwenden kann (wie in der Fußzeile eines Anwendungslayouts).

SVN_VERSION = IO.popen("svn info").readlines[4].strip.split[1] 
+0

Wow, so einfach ist das. Vielen Dank! – Jaryl

3

Hier ist ein Hinweis, wie Sie Netbeans 'Fähigkeiten
erstellen benutzerdefinierte ant Aufgaben verwenden könnte, die scm-version.txt erzeugen würde:

Öffnen Sie Ihre build.xml Datei, und fügen Sie folgenden Code rechts nach
<import file="nbproject/build-impl.xml"/>

Jetzt
<!-- STORE SUBVERSION BUILD STRING --> 
<target name="-pre-compile"> 
    <exec executable="svnversion" 
    output="${src.dir}/YOUR/PACKAGE/NAME/scm-version.txt"/> 
</target> 

, Netbeans mehreren Geschäften die Subversion Version String zu scm-version.txt jedes Mal wenn Sie sauber/bauen machen.

Sie können die Datei während der Laufzeit lesen, indem Sie:

getClass().getResourceAsStream("scm-version.txt"); // ... 

Sie die Datei scm-version.txt als svn nicht vergessen zu markieren: ignorieren.

0

Ich verwende das MSBuild Community Tasks Projekt, das über ein Tool verfügt, um die SVN-Revisionsnummer abzurufen und zu Ihrer AssemblyInfo.vb hinzuzufügen. Sie können dann mithilfe der Reflektion diese Zeichenfolge abrufen, um sie in Ihrer Benutzeroberfläche anzuzeigen.

Hier ist ein full blog post with instructions.

0

Ich habe ein SVN version plug-in für das Build Version Increment Projekt auf CodePlex erstellt.Dieses SVN-Plug-In zieht die letzte Änderungsversionsnummer aus Ihrer Arbeitskopie und ermöglicht Ihnen, diese in Ihrer Versionsnummer zu verwenden, was genau das erreichen sollte, was Sie tun möchten. Build Version Increment ist ziemlich flexibel und ermöglicht es Ihnen, die Versionierung auf verschiedene Arten einzurichten.

BVI funktioniert nur mit Visual Studio, aber da Sie Asp.Net verwenden, wird das kein Problem sein. Es erfordert keinen Code zu schreiben oder XML zu bearbeiten, also yay!

Verwandte Themen