Comment déterminer le dernier numéro de révision SVN enraciné dans un répertoire?
j'aimerais commencer à étiqueter mes binaires déployés avec le dernier numéro de révision SVN.
cependant, étant donné que SVN est basé sur des fichiers et non sur des répertoires/projets, je dois parcourir tous les fichiers du répertoire et du sous-répertoire afin de déterminer le numéro de révision le plus élevé.
utiliser svn info
sur la racine ne fonctionne pas (il ne fait que signaler la version de ce répertoire, pas les fichiers dans les sous-répertoires):
I je me demandais s'il y avait un raccourci utilisant la commande svn
pour faire ceci. Sinon, Est-ce que quelqu'un peut suggérer un script simple qui est efficace pour le réseau (je préférerais qu'il n'ait pas touché le serveur distant du tout)?
je comprends aussi que l'une des approches possibles est de conserver un fichier de version avec le svn:keywords
. Cela fonctionne (je l'ai utilisé sur d'autres projets), mais je suis fatigué de faire face à s'assurer que le dossier est sale et de traiter avec le inévitables conflits de fusion.
Réponse je vois mon problème menti à ne pas faire un bon svn up
avant d'appeler svn info
dans le répertoire de racine:
$ 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)
10 réponses
Sens Unique. Lorsque vous vérifiez le code, regardez la dernière ligne de sortie svn:
$ svn up
...stuff...
Updated to revision 66593.
un chemin plus direct:
$ 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)
svnversion
semble être la façon la plus propre de faire cela:
svnversion -c /path/to/your-projects-local-working-copy/. | sed -e 's/[MS]//g' -e 's/^[[:digit:]]*://'
la commande ci-dessus nettoiera toutes les lettres M et S (indiquant les modifications locales ou la commutation) de la sortie, ainsi que le numéro de révision plus petit dans le cas où svnversion
retourne une plage au lieu d'un seul numéro de révision (voir the docs pour plus d'informations). Si vous ne voulez pas filtrer la sortie, sortir le tuyau et le sed
fait partie de cette commande.
Si vous voulez utiliser svn info
, vous devez utiliser le "récursive" ( -R
) argument pour obtenir les informations de tous les sous-répertoires. Puisque la sortie devient alors une longue liste, vous devrez faire un peu de filtrage pour obtenir le dernier numéro de révision modifié de tous ceux qui est le plus élevé:
svn info -R /path/to/your-projects-local-working-copy/. | awk '/^Last Changed Rev:/ {print $NF}' | sort -n | tail -n 1
ce que cette commande fait est qu'elle prend toutes les lignes qui incluent la chaîne "Last Changed Rev"
, puis supprime tout de chacune de ces lignes sauf le dernier champ (c.-à-d. le numéro de révision), puis trie ces lignes numériquement et supprime tout sauf la dernière ligne, résultant en juste le numéro de révision le plus élevé. Si vous utilisez Windows, je suis sûr que vous pouvez le faire assez facilement dans PowerShell aussi bien, par exemple.
juste pour être clair: les approches ci-dessus vous obtenez le numéro de la dernière révision modifiée récursive de juste le chemin dans le rapport que votre la copie de travail locale représente, pour cette copie de travail locale, sans frapper le serveur. Donc, si quelqu'un a mis à jour quelque chose dans ce chemin sur le serveur de dépôt après votre dernier svn update
, cela ne sera pas reflété dans cette sortie.
si ce que vous voulez est la dernière révision modifiée de ce chemin sur le serveur , vous pouvez faire:
svn info /path/to/your-projects-local-working-copy/.@HEAD | awk '/^Last Changed Rev:/ {print $NF}'
Dupliquer cette question . Comme je l'ai indiqué, la commande svnversion
est votre ami. Pas besoin d'analyser la sortie, pas besoin de mettre à jour d'abord, fait juste le travail.
Je ne sais pas si vous utilisez MSBuild(Visual Studio) pour construire vos binaires. Mais si vous voulez: il y a une connexion possible entre Subverion et MSBuild à travers MSBuild Missions De La Communauté De Projet
Voici une partie de notre script de construction: notre application (C#) reçoit le numéro de révision svn inclus:
<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
les réponses fournies par @Charles Miller et @Troels Arvin sont correctes - vous pouvez utiliser la sortie du svn update
ou svn info
, mais comme vous le suggérez, ce dernier ne fonctionne que si le dépôt est à jour. Encore une fois, je ne suis pas sûr de quelle valeur un numéro de révision va être pour vous si une partie de votre arborescence des sources est sur une révision différente qu'une autre partie. Il me semble vraiment que vous devriez travailler sur un arbre homogène.
Je vous suggère soit de la mise à jour avant d'exécuter info (ou si vous avez déjà mis à jour votre build, Vous êtes golden) ou en utilisant svn info URL-to-source
.
il existe un programme distribué avec Subversion appelé svnversion qui fait exactement ce que vous voulez faire. C'est comme ça que nous étiquetons nos sites web.
"svn info" vous indiquera le numéro de révision de la copie de travail (voir la ligne "révision"dans la sortie de "svn info"). Votre système de compilation vous permet probablement de placer la partie pertinente de la sortie de "svn info"quelque part où elle sera reflétée dans votre application. Par exemple, vous pouvez spécifier que lors de la construction, un fichier temporaire (non versionné) devrait être créé, contenant la sortie de "svn info"; et vous incluez ensuite ce fichier lors de la compilation.
si vous voulez juste le numéro de révision de la dernière modification qui a été commise, et que vous utilisez Windows sans grep/awk / xargs, voici la commande bare-bones à exécuter (ligne de commande):
X:\trunk>svn info -r COMMITTED | for /F "tokens=2" %r in ('findstr /R "^Revision"') DO @echo %r
67000
svn info -r COMMITTED
vous donnera la dernière modification engagée au répertoire que vous êtes actuellement dans:
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)
la boucle for exécute findstr
pour localiser la partie de révision de la sortie de svn info
. La sortie de ce sera (vous ne le verrez pas):
Revision: 67000
qui divise alors le tokens , et renvoie le 2, pour être echo
ed out:
67000
pour moi la meilleure façon de connaître le dernier numéro de révision du tronc/branche est de l'obtenir à partir de l'URL distante. Il est important de ne pas utiliser le dir de travail parce qu'il peut être désuet. Voici un extrait de lot ( je déteste beaucoup; -)):
@for /f "tokens=4" %%f in ('svn info %SVNURL% ^|find "Last Changed Rev:"') do set lastPathRev=%%f
echo trunk rev no: %lastPathRev%
néanmoins j'ai un problème pour coder ce nombre comme version intermédiaire dans des sources contenant $Rev:$. Le problème est que $Rev:$ contient le fichier REV.no. Donc si trunk rev no est plus grand que le rev no de version file, j'ai besoin de modifier ce fichier "artificiellement" et de le propager pour obtenir la version intermédiaire correcte (=version trunk). C'est un volet de! Est-ce que qqn a une meilleure idée? Merci beaucoup
c'est ridicule mais svn info
ou svnversion
ne prendront pas en considération les sous - répertoires; c'est une fonctionnalité appelée" travail de révision mixte " - Je l'appelle torture. J'avais juste besoin de trouver la dernière 'révision' de la base de données en direct et le chemin piraté ci - dessous a fonctionné pour moi-il pourrait prendre un certain temps à exécuter:
repo_root# find ./ | xargs -l svn info | grep 'Revision: ' | sort
...
Revision: 86
Revision: 86
Revision: 89
Revision: 90
root@fairware:/home/stage_vancity#