2008-09-21 16 views

Respuesta

14
svn info <Repository-URL> 

o

svn info --xml <Repository-URL> 

luego ver el resultado. Para xml, parse/info/entry/@ revision para la revisión del repositorio (151 en este ejemplo) o/info/entry/commit/@ revision para la revisión del último commit contra esta ruta (133, útil cuando se trabaja con 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> 

yo escribimos una herramienta (cmdnetsvnrev, código fuente incluido) por mí mismo que sustituye a la revisión de los archivos de mi AssemblyInfo.cs. Sin embargo, está limitado a ese propósito, pero generalmente svn info y luego el procesamiento es el camino a seguir.

1

Bueno, puede ejecutar 'svn info' para determinar el número de revisión actual, y probablemente podría extraerlo bastante fácilmente con una expresión regular, como "Revisión: ([0-9] +)".

+0

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

7

Si tiene tortoisesvn puede utilizar SubWCRev.exe

Crear un archivo llamado:

RevisionInfo.tmpl

SvnRevision = $WCREV$; 

Luego ejecuta este comando:

SubWCRev.exe . RevisionInfo.tmpl RevisionInfo.txt 

Creará un archivo ReivisonInfo.txt con su número de revisión de la siguiente manera:

SvnRevision = 5000; 

Pero en lugar de utilizar la .txt se podría utilizar cualquier fuente que desea, y tener acceso al número reivsion dentro de su código fuente.

12

Agregar SVN: palabras clave a las propiedades SVN del archivo de origen:

svn:keywords Revision 

A continuación, en el archivo de origen incluyen:

private const string REVISION = "$Revision$"; 

La revisión se actualizará con el número de revisión en la próxima comprometerse a (por ejemplo) "$Revision: 4455$". Puede analizar esta cadena para extraer solo el número de revisión.

+0

Una pregunta al respecto: descubrí que $ Revision $ solo se actualiza si ese archivo en particular cambia, de lo contrario permanece intacto. ¿Hay alguna manera de forzar la actualización de $ Revision $ en cada checkin/out, independientemente de si el archivo se modificó en la última confirmación o no? –

+0

No, debes hacer un cambio de archivo y comprometerte a que esto funcione. Siempre acabo de incluir el REVISION const en el archivo que contiene el número de versión o las notas de la versión que normalmente se actualizan antes de una versión de todos modos. –

+0

¿Cómo harías esto si el archivo es un archivo .js? – jamesfzhang

1

Si está ejecutando bajo GNU/Linux, cd al directorio de la copia de trabajo y ejecute:

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

Desde mi experiencia, SVN información no da cifras fiables después de cambiar el nombre de los directorios.

+0

Y como siempre, 'grep foo | awk '{bar}' 'se puede refactorizar a' awk '/ foo/{bar}' '-' svn -u status | awk '/ Estado en contra de la revisión:/{print $ 4}' ' – tripleee

5

No dice qué lenguaje de programación/marco está utilizando.He aquí cómo hacerlo en Python usando 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

desea que el Subversion información subcomando, de la siguiente manera:

$ 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) 

En este caso, hay dos números de revisión: 4190 y 3397. 4190 es el último número de revisión para el repositorio, y 3397 es el número de revisión del último cambio al subárbol del que se ha extraído este espacio de trabajo. Puede especificar una ruta a un espacio de trabajo o una URL a un repositorio.

AC# fragmento para extraer este en Windows sería algo como esto:

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; 
     } 
    } 
} 

(. En mi caso, utilizamos la revisión de Subversion como parte del número de versión para montajes)

5

Uso C# y SharpSvn (de http://sharpsvn.net) el código serían:

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

Haga que su proceso de generación llamar al comando svnversion y embed su salida en generado {fuente | binarios}. Esto no solo proporcionará la revisión actual (como muchos otros ejemplos aquí), sino que su cadena de salida también indicará si se está realizando una construcción en un árbol mixto o en un árbol que no coincide exactamente con el número de revisión en cuestión (es decir, un árbol con cambios locales).

Con un árbol estándar:

$ svnversion 
3846 

Con un árbol modificado:

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

Con mixta de revisión, árbol de modificación:

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

¿Alguna idea de cómo conseguir que enumere también las versiones de los elementos externos? – ShoeLace

+1

@ShoeLace - No con svnversion, lamentablemente, pero un poco de grep y awk funcionan en el estado de svn --verbose te dará lo que estás buscando. –

+0

@ShoeLace, ... btw, para actualizar eso - hoy, usaría 'svn status --verbose --xml', con XMLStarlet o una plantilla XSLT de postprocesamiento. –

3

En mi último proyecto Solucioné este problema mediante el uso de varias herramientas, SVN, NAnt y una tarea NAnt personalizada.

  1. Uso de NAnt para ejecutar svn info --xml ./svnInfo.xml
  2. Uso de NAnt para tirar el número de revisión del archivo XML con <xmlpeek>
  3. Usar una costumbre de NAnt tarea de actualizar el atributo AssemblyVersion en el archivo de AssemblyInfo.cs con la última con el número de versión (por ej., major.minor.maintenance, revision) antes de compilar el proyecto.

La versión relacionada con secciones de mi escritura de la estructura siguiente aspecto:

<!-- 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}"/> 

El crédito para la expresión regular va a: http://code.mattgriffith.net/UpdateVersion/. Sin embargo, descubrí que UpdateVersion no satisfacía mis necesidades ya que la función pin se rompió en la construcción que tenía. De ahí la tarea NAnt personalizada.

Si alguien está interesado en el código, para la tarea personalizada NAnt replace, hágamelo saber. Como esto fue para un proyecto relacionado con el trabajo, tendré que consultar con la administración para ver si podemos publicarlo bajo una licencia amigable (gratuita).

19

El comando svnversion es la forma correcta de hacerlo. Muestra el número de revisión en el que está toda su copia de trabajo, o un rango de revisiones si su copia de trabajo es mixta (por ejemplo, algunos directorios están actualizados y otros no). También indicará si la copia de trabajo tiene modificaciones locales. Por ejemplo, en un directorio de trabajo en lugar inmundo:

$ svnversion 
662:738M 

La Revisión $ $ palabra clave no hace lo que quiere: sólo cambia cuando el archivo que contiene lo hace. El libro de Subversion da more detail. El comando "svn info" tampoco hace lo que desea, ya que solo le informa el estado de su directorio actual, ignorando el estado de los subdirectorios. En el mismo árbol de trabajo que el ejemplo anterior, he tenido algunos subdirectorios que eran más nuevo que el directorio de la que estaba, pero "svn info" no notar:

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

Es fácil de incorporar svnversion en su proceso de construcción , de modo que cada construcción obtenga el número de revisión en alguna forma accesible en tiempo de ejecución. Para un proyecto Java, por ejemplo, nuestro archivo Makefile convirtió el resultado de svnversion en un archivo .properties.

+0

Acepte mis disculpas por el voto negativo ahora invertido. En ese momento, consideré este casi plagio, pero agrega contenido nuevo (explicando las limitaciones de '$ Revision $', sugiriendo el uso de un archivo MAKE, etc.) sin copiar ningún texto textualmente, por lo que es completamente legítimo como propio responder. –

2

En Rails utilizo este fragmento en mi environment.rb que me da una constante que puedo usar en toda la aplicación (como en el pie de página del diseño de una aplicación).

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

Guau, es así de fácil. ¡Gracias! – Jaryl

3

Aquí tiene una pista, cómo puede utilizar las capacidades Netbeans 'a
crear tareas personalizada hormiga que generarían SMC-version.txt:

Abra su build.xml archivo, y agregue el código siguiente correcto después de
<import file="nbproject/build-impl.xml"/>

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

Ahora, Netbeans strores la cadena de versiones Subversion a SMC-version.txt cada vez que haces limpia/construcción.

Usted puede leer el archivo en tiempo de ejecución haciendo:

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

No se olvide de marcar el archivo SMC-version.txt como svn: ignore.

0

Utilizo el proyecto MSBuild Community Tasks que tiene una herramienta para recuperar el número de revisión SVN y agregarlo a su AssemblyInfo.vb. A continuación, puede usar la reflexión para recuperar esta cadena para mostrarla en su UI.

Aquí hay un full blog post with instructions.

0

Creé SVN version plug-in para el proyecto Build Version Increment en CodePlex.Este complemento SVN extraerá el último número de revisión de cambio de su copia de trabajo y le permitirá usarlo en su número de versión, que debería lograr exactamente lo que está tratando de hacer. Build Version Increment es bastante flexible y le permitirá configurar cómo se realiza el control de versiones de varias maneras.

BVI solo funciona con Visual Studio, pero ya que está usando Asp.Net, eso no será un problema. No requiere escribir ningún código ni editar xml, ¡así que sí!

Cuestiones relacionadas