Comment déterminez-vous la dernière version SVN nombre enracinée dans un répertoire?

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

  •  09-06-2019
  •  | 
  •  

Question

Je voudrais commencer le marquage mon binaires déployées avec la dernière version SVN nombre.

Cependant, parce que SVN est basé sur un fichier et non pas le répertoire/projet, j'ai besoin de parcourir tout le répertoire et sous-répertoire de fichiers afin de déterminer le plus grand numéro de révision.

À l'aide de svn info sur le root ne fonctionne pas (juste les rapports de la version de ce répertoire, pas les fichiers dans les sous-répertoires):

Je me demandais si il y a un raccourci à l'aide de la svn commande pour le faire.Sinon, quelqu'un peut-il suggérer un script simple qui est réseau efficace (je préfère si il n'a pas frappé le serveur distant à tous)?

Je comprends aussi qu'une autre approche est de garder un version de fichier avec l' svn:keywords.Cela fonctionne (je l'ai déjà utilisé sur d'autres projets), mais je suis fatigué de traiter assurant que le fichier est sale et de traiter avec les 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)
Était-ce utile?

La solution

D'une façon.Lorsque vous regardez le code, dans la dernière ligne de svn de sortie:

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

D'une manière plus directe:

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

Autres conseils

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 va nettoyer toutes les M et les lettres (en indiquant les modifications locales ou switchedness) à partir de la sortie, ainsi que le plus petit numéro de révision dans le cas svnversion renvoie une plage au lieu d'un seul numéro de révision (voir les docs pour plus d'infos).Si vous ne voulez pas filtrer la sortie, sortir le tuyau et le sed une partie de cette commande.

Si vous souhaitez utiliser svn info, vous devez utiliser le "récursive" (-R argument ) pour obtenir les informations de tous les sous-répertoires ainsi.Depuis la sortie devient alors une longue liste, vous aurez besoin de faire quelques filtrage pour obtenir le dernier changement de numéro de révision de l'ensemble de 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 la commande n'est qu'il prend toutes les lignes qui incluent la chaîne "Last Changed Rev", puis supprime tous les éléments de chacune de ces lignes, sauf le dernier champ (c'est à direle numéro de révision), puis trie ces lignes numériquement et supprime tout sauf la dernière ligne, résultant dans juste le meilleur numéro de révision.Si vous êtes sous Windows, je suis sûr que vous pouvez le faire assez facilement en PowerShell ainsi, par exemple.

Juste pour être clair:les approches ci-dessus vous obtenir le récursive dernière modification du numéro de révision de simplement le chemin d'accès dans le repo que votre copie de travail locale représente, pour que la copie de travail locale, sans frapper le serveur.Donc si quelqu'un a mis quelque chose dans ce chemin d'accès sur le serveur de dépôt après votre dernière svn update, il ne sera pas reflétée dans cette sortie.

Si ce que vous voulez, c'est le dernier changement de la révision de ce chemin sur le serveur, vous pouvez le faire:

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

Double de cette question.Comme je l'ai posté il y, la svnversion la commande est votre ami.Pas besoin d'analyser les données en sortie, pas besoin de mettre à jour un premier temps, il fait le travail.

Je ne sais pas si vous utilisez MSBuild(Visual Studio) pour la construction de vos fichiers binaires.Mais si vous voulez bien:il y a un lien possible entre Subverion et MSBuild par MSBuild Communauté Des Tâches De Projet

Voici une partie de notre script de compilation:notre (C#), l'application récupère 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 corrects, vous pouvez utiliser la sortie de la svn update ou svn info, mais comme tu le soupçon, ce dernier ne fonctionne que si le référentiel est à jour.Encore une fois, je ne suis pas sûr de ce que la valeur tout numéro de révision va être à vous si une partie de votre arbre source est sur un autre révision de l'autre partie.Ça sonne pour moi comme vous devez travailler sur un ensemble homogène de l'arbre.Je vous suggère soit de la mise à jour avant d'exécuter info (ou si vous avez déjà mis à jour pour votre construction, vous êtes d'or) ou à l'aide de svn info URL-to-source.

Il y a un programme distribué avec Subversion appelé svnversion qui fait exactement ce que vous voulez faire.C'est la façon dont nous balise de nos sites web.

Si vous souhaitez que le numéro de révision de la dernière modification a été commis, et à l'aide de Windows sans grep/awk/xargs, voici le bare-bones commande à 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 les dernières commis changer le répertoire dans lequel vous êtes actuellement:

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 s'exécute findstr pour localiser la Révision de la partie de la sortie de svn info.La sortie de cette volonté d'être (vous ne pourrez pas voir ceci):

Revision: 67000

Qui se sépare ensuite l' jetons, et renvoie la 2ème, pour être echoed out:

67000

"svn info" va vous montrer le travail de copie du numéro de la révision (voir la "Révision" de la ligne dans la sortie de "svn info").Votre système de génération sans doute vous permet de placer la partie pertinente de "svn info"sortie de quelque part où il sera reflété dans votre application.Par exemple, vous pouvez spécifier que lors de la construction, un temporaire (onu-versionnées) le fichier doit être créé, qui contient la sortie de "svn info";et vous alors inclure ce fichier lors de la compilation.

Pour moi, la meilleure façon de découvrir le dernier numéro de la révision de la branche trunk/est d'obtenir à partir de l'URL distante.Il est important de ne PAS utiliser le travail dir car il peut être obsolète.Voici un extrait avec le lot ( je déteste un peu ;-)):

@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 en dur ce numéro de version intérimaire dans les sources contenant $Rev:$.Le problème est que $Rev:$ contient le fichier rév.pas de.Donc, si le tronc rev n est plus grand que l'rev pas de version de fichier, j'ai besoin de modifier ce fichier "artificiellement" et à s'engager à obtenir la bonne version provisoire (=tronc version).C'est un volet de!Est-ce que qqn a une meilleure idée?Merci beaucoup

C'est ridicule mais svn info ou svnversion l'habitude de prendre en considération les sous-répertoires;c'est une fonctionnalité appelée de travail Mixtes des Révisions " - j'appelle ça de la torture.J'ai juste besoin de trouver les derniers "révision" de la live le code et le piraté dessous a fonctionné pour moi -, il pourrait prendre un certain temps à s'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#
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top