Comment déterminez-vous la dernière version SVN nombre enracinée dans un répertoire?
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
de commande pour ce 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 de fichier d'une version avec le 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)
Vous devez vous connecter pour publier un commentaire.
D'une seule manière. Lorsque vous regardez le code, dans la dernière ligne de svn de sortie:
D'une manière plus directe:
svnversion
semble être la façon la plus propre de le faire: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'info). Si vous ne voulez pas filtrer la sortie, sortir le tuyau et lesed
partie de la 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 du numéro de révision de l'ensemble de ceux qui est le plus élevé: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 à dire le 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:
Double de cette question. Comme je l'ai posté là, le
svnversion
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.svnversion -c
donnera le numéro de révision de la dernière modification de ce chemin.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:
Jan
Les réponses fournies par @Charles Miller et @Troels Arvin sont corrects, vous pouvez utiliser la sortie de la
svn update
ousvn info
, mais comme vous 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 voulez juste 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):
svn info -r COMMITTED
vous donnera les dernières commis changer le répertoire dans lequel vous êtes actuellement:La boucle for s'exécute
findstr
pour localiser la Révision de la partie de la sortie desvn info
. La sortie de cette volonté d'être (vous ne pourrez pas voir ceci):Qui se sépare ensuite la jetons, et renvoie le 2ème, pour être
echo
ed out:"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 ensuite 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 ;-)):
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. no. 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
ousvnversion
ne prendra pas en compte 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: