Obtenir le dernier numéro de révision dans SVN?


104

En utilisant PHP, Perl ou Python (de préférence PHP), j'ai besoin d'un moyen d'interroger une base de données SVN et de trouver le dernier numéro de révision envoyé à SVN. Je n'ai besoin de rien d'autre que ça. Il doit être non intensif (donc je le fais toutes les 5 minutes en tant que tâche cron; les performances de SVN ne devraient pas être affectées).

SVN se trouve sur mon intranet, mais pas sur mon ordinateur spécifique.

J'ai SVN installé, mais aucune liaison n'est installée pour PHP / Perl / Python. J'utilise Windows XP, mais je préférerais une solution indépendante de la plate-forme qui peut également fonctionner sous Linux. Si vous avez une solution Linux uniquement (ou XP uniquement), cela serait également utile.


2
"svn info --show-item revision" donnera la révision courante vers laquelle le répertoire courant est mis à jour.
GreatAndPowerfulOz

2
$ svn info --show-item revision svn: invalid option: --show-itemUtilisation d'Apache Subversion 1.8.16 (r1740329) compilé le 26 avril 2016. Également essayé avec CollabNet 1.6.11 (r934486) compilé le 6 mars 2014.
IceArdor

En relation avec ces commentaires, consultez svn help infoles options juridiques poursvn info
XavierStuvw

@IceArdor J'utilise SVN v1.9.5 et --show-itemest disponible
icc97

Réponses:


68
<?php
    $url = 'your repository here';
    $output = `svn info $url`;
    echo "<pre>$output</pre>";
?>

Vous pouvez obtenir la sortie en XML comme ceci:

$output = `svn info $url --xml`;

S'il y a une erreur, la sortie sera dirigée vers stderr. Pour capturer stderr dans votre sortie, utilisez ainsi:

$output = `svn info $url 2>&1`;

2
S'il y a une erreur, la sortie sera dirigée vers stderr. Pour capturer stderr dans votre sortie, utilisez ainsi: $ output = svn info $url 2>&1;
Daniel X Moore

3
Merci! J'ai utilisé --xml pour créer mon propre outil C # qui m'aide à générer un attribut AssemblyFileVersion. PS: l'anglais n'est pas ma langue principale et j'ai été intrigué par le mot «ainsi» que je n'avais jamais entendu auparavant. Btw, son origine est plutôt drôle: cf ( en.wiktionary.org/wiki/thusly ); l'avez-vous utilisé intentionnellement (jeu de mots?) ou est-il courant pour vous d'utiliser ainsi au lieu de cela?
odalet

7
svn info $url | grep 'Last Changed Rev' | awk '{ print $4; }'
Cobra_Fast le

7
@Cobra_Fast, vous n'avez pas besoin de pipe, vous pouvez faire svn info --show-item revision $urlou svn info --show-item last-changed-revision $url.
cp.engr

2
@ cp.engr Je crois que ce n'est que depuis SVN v1.9 ou plus - c'est que je l'ai dans la v1.9.5 et il n'existe pas dans la v1.8.6
icc97

131

Si vous souhaitez analyser une copie de travail locale, le meilleur outil est svnversion, qui est fourni avec Subversion et produit une sortie comme 968:1000M. La documentation dit:

Le numéro de version sera un numéro unique si la copie de travail est une seule révision, non modifiée, non commutée et avec une URL qui correspond à l'argument TRAIL_URL. Si la copie de travail est inhabituelle, le numéro de version sera plus complexe:

4123:4168     mixed revision working copy
4168M         modified working copy
4123S         switched working copy
4123:4168MS   mixed revision, modified, switched working copy

2
d'accord, bien mieux que svn info
Richard

32
svnversion est destiné aux copies de travail locales et n'accédera pas au référentiel sur l'intranet comme spécifié dans la question.
Daniel X Moore

5
Pour ceux qui ne sont pas familiers avec svnversion, il fait partie du client de ligne de commande standard et voici la page de manuel: svnbook.red-bean.com/nightly/en/svn.ref.svnversion.re.html .
Michael Sorens

45

svn info -r HEAD

Cela vous donnera le dernier numéro de révision en tête de votre référentiel.

Il y a quelques bons articles de blog sur l'intégration des numéros de subversion dans votre script de construction:


C'est le moyen le plus simple car vous n'avez pas besoin de trouver d'abord l'url du référentiel. Merci!
derFunk

J'ai eu des erreurs en utilisant des guillemets autour de HEAD, donc ça devrait juste êtresvn info -r HEAD
icc97

39

Cela devrait fonctionner dans Bash, à partir d'un répertoire de travail. Je l'ai utilisé dans Windows avec unixutils installé:

svn info |grep Revision: |cut -c11-

Cela fonctionne si vous mettez l'URL du référentiel là où vous avez% *, quoi que vous entendiez par là. Belle syntaxe de coupe, je ne le savais pas avant.
ypnos

1
Remarque: comme il manque -rHEAD, cela retournera la révision de validation pour le fichier ou le répertoire demandé. Il ne s'agit peut-être pas de la dernière révision globale (car d'autres modifications peuvent avoir été validées ailleurs ou dans un sous-arbre).
Mr Fooz

4
De plus, cela ne fonctionne pas pour les versions localisées de SVN (en polonais, ce sera | cut -c9-).
zgoda

2
c'est, btw, la raison pour laquelle je n'aime pas du tout les outils de développement de ligne de commande localisés; aucun avantage, un tas de problèmes. Je supprime généralement les localisations exactement pour cette raison.
gimpf

8
Passer un délimiteur au lieu d'un nombre de caractères fonctionne mieux pour le contenu localisé, par exemple svn info | grep Revision | cut -d " " -f 2retournera la deuxième chaîne après avoir été fractionnée à l'aide d'espaces.
Butifarra

34

Les éléments suivants devraient fonctionner:

svnlook youngest <repo-path>

Il renvoie un seul numéro de révision.


15

Pour vraiment obtenir le dernier numéro de révision ("head revision") sur votre référentiel distant , utilisez ceci:

svn info -r 'HEAD' | grep Revision | egrep -o "[0-9]+"

Sorties par exemple:

35669

12

Une note sur l'obtention du dernier numéro de révision:

Disons que j'ai cd-ed dans un sous-répertoire révisé ( MyProjectDir). Ensuite, si j'appelle svnversion:

$ svnversion .
323:340

... J'obtiens " 323:340", ce qui signifie, je suppose: " vous avez des éléments ici, allant de la révision 323 à 340 ".

 

Ensuite, si j'appelle svn info:

$ svn info
Path: .
URL: svn+ssh://server.com/path/to/MyProject/MyProjectDir
Repository Root: svn+ssh://server.com/path/to/MyProject
Repository UUID: 0000ffff-ffff-...
Revision: 323
Node Kind: directory
Schedule: normal
Last Changed Author: USER
Last Changed Rev: 323
Last Changed Date: 2011-11-09 18:34:34 +0000 (Wed, 09 Nov 2011)

... J'obtiens " 323" comme révision - qui est en fait la révision la plus basse de celles rapportées par svnversion!

 

On peut ensuite utiliser svn infoen mode récursif pour obtenir plus d'informations depuis le répertoire local:

> svn info -R | grep 'Path\|Revision'
Path: .
Revision: 323
Path: file1.txt
Revision: 333
Path: file2.txt
Revision: 327
Path: file3.txt
Revision: 323
Path: subdirA
Revision: 328
Path: subdirA/file1.txt
Revision: 339
Path: subdirA/file1.txt
Revision: 340
Path: file1.txt
Revision: 323
...

... (supprimez le greppour voir plus de détails).

 

Enfin, que faire lorsque nous voulons vérifier quelle est la dernière révision du référentiel en ligne (dans ce cas, @ server.com)? Ensuite, nous émettons à nouveau svn info, mais avec -r HEAD(notez la différence entre l' -Roption de capital précédemment et les minuscules -rmaintenant):

> svn info -r 'HEAD'
USER@server.com's password:
Path: MyProjectDir
URL: svn+ssh://server.com/path/to/MyProject/MyProjectDir
Repository Root: svn+ssh://server.com/path/to/MyProject
Repository UUID: 0000ffff-ffff-...
Revision: 340
Node Kind: directory
Last Changed Author: USER
Last Changed Rev: 340
Last Changed Date: 2011-11-11 01:53:50 +0000 (Fri, 11 Nov 2011)

La chose intéressante est - svn infofait toujours référence au sous-répertoire actuel ( MyProjectDir), cependant, le chemin en ligne est signalé comme MyProjectDir(par opposition au .cas local) - et la révision en ligne rapportée est la plus élevée ( 340- par opposition à la plus basse, 323rapportée localement).


9
  • À partir de Subversion 1.9, vous pouvez utiliser l'option --show-item pour obtenir une valeur de l'un des champs de svn infosortie de la commande. Cette commande affichera uniquement le numéro de révision:

    svn info --show-item=revision <URL-to-repository>
    
  • Obtenez la sortie XML des informations svn à l'aide de l' --xmloption et utilisez PowerShell pour obtenir le numéro de révision. Voici un exemple simple:

    [xml]$svninfo = svn info <REPOSITORY-URL> --xml -r HEAD
    $latestrevnum = $svninfo.info.entry.revision
    $latestrevnum
    
  • À l'aide de VisualSVN Server 3.4 ou plus récent, vous pouvez obtenir le nombre de révisions dans un référentiel en exécutant ces commandes:

    $repo = Get-SvnRepository <REPOSITORY-NAME>

    $repo.Revisions

    Voir Get-SvnRepositoryPowerShell cmdlet référence pour plus d' informations.


7

Je pense que vous cherchez

svn info -r HEAD

Pouvez-vous exécuter cette commande?

Vous devrez probablement également fournir des informations de connexion avec le référentiel.


Je pense que ça doit être svn info -r HEAD
Stephen

-r peut alors facilement être omis.
ypnos

Bon - je n'ai pas spécifié l'option pour le -r - c'était juste pour lui de trouver ce dont il avait besoin et de commencer avec l'aide / le livre.
Tim

4

Quelqu'un d'autre m'a battu pour poster la réponse à propos de svnversion, ce qui est certainement la meilleure solution si vous avez une copie de travail (IIRC, cela ne fonctionne pas avec les URL). J'ajouterai ceci: si vous êtes sur le serveur hébergeant SVN, le meilleur moyen est d'utiliser la svnlookcommande. C'est la commande que vous utilisez lors de l'écriture d'un script hook pour inspecter le référentiel (et même la transaction en cours, dans le cas des hooks pré-commit). Vous pouvez taper svnlook helppour plus de détails. Vous souhaitez probablement utiliser la svnlook youngestcommande. Notez qu'il nécessite un accès direct au répertoire du référentiel, il doit donc être utilisé sur le serveur.


2
nickh@SCLLNHENRY:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svnversion
12354

Ou

nickh@SCLLNHENRY:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svn info --xml |     xmlstarlet sel -t --value-of "//entry/@revision"
12354

Ou

nickh@SCLLNHENRY:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svn info --xml | xmlstarlet sel -t --value-of "//commit/@revision"
12335

2

Vous pouvez utiliser l'une ou l'autre des commandes:

1)
> svn info | awk '/Revision:/ { print $2 }' =>returns the latest version


2)
> svn log -l 1 | grep '^r[0-9]\+' | awk '{print $1}'

svn log -l 1     => returns the latest version commit 
grep '^r[0-9]\+' => greps the r4324 (revision) number
awk '{print $1}' => prints the match found


2

Si vous avez le malheur de devoir le faire à partir d'un fichier batch Windows, voici l'incantation que vous recherchez:

set REV=unknown
for /f "usebackq tokens=1,2 delims=: " %%A in (`svn info`) do if "%%A" == "Revision" set REV=%%B
echo Current SVN revision is %REV%

Cela lance "svn info", itérant à travers chaque ligne de sortie générée. Il utilise un deux-points comme délimiteur entre le premier et le deuxième jeton sur la ligne. Lorsque le premier jeton est "Révision", il définit la variable d'environnement REV sur le deuxième jeton.


1
vous pouvez également utiliser FINDSTR:FOR /F "tokens=2" %%i IN ('svn info ^| FINDSTR Revision:') DO SET revision=%%i
icc97

voir cette autre réponse SO pour la base de ceci
icc97

2

Vous recherchez un appel similaire à l'appel en ligne de commande

svn info URL

Il semble que cela soit possible en utilisant la bibliothèque pysvn, et il existe une recette qui devrait vous aider à démarrer. Je ne sais pas s'il existe quelque chose de similaire pour PHP.

Si vous avez besoin d'appeler vous-même le binaire SVN, assurez-vous d'utiliser le --xmlparamètre pour obtenir le résultat au format XML. Cela devrait être plus facile à analyser que la sortie de la ligne de commande.


J'utilise subprocess.check_outputen python pour éviter encore un autre appel de bibliothèque. Si vous ne faites que vérifier les numéros de révision / extraire les dernières copies, il est plus simple d'utiliser simplement svn depuis la ligne de commande via subprocess. Maintenant, si vous effectuez des enregistrements et des fusions automatiques ...
Droogans

2

Vous pouvez utiliser le format de sortie XML, par exemple:

  svn info --xml | grep 'revision' | head -1 | grep -Eo "[0-9]+" | xargs expr -1 +

Exemple: utilisation du numéro de révision

working=`svn info --xml | grep 'revision' | head -1 | grep -Eo "[0-9]+" | xargs expr -1 +`
svn diff -r $working:HEAD --summarize --xml

2

Vous pouvez essayer la commande ci-dessous:

svn info -r 'HEAD' | grep Revision: | awk -F' ' '{print $2}'

1

Just svn infoin BASH vous donnera tous les détails

RESULT:
Path: .
URL: 
Repository Root: 
Repository UUID: 
Revision: 54
Node Kind: directory
Schedule: normal
Last Changed Author: 
Last Changed Rev: 54
Last Changed Date: 

Vous obtiendrez la RÉVISION de ce


1

Le moyen le plus simple et le plus propre de le faire (en fait svn 1.9, sorti en 2015) consiste à utiliser:

svn info --show-item revision [--no-newline] [SVNURL/SVNPATH] 

La sortie est le numéro de la dernière révision (joungest) pour le SVNURL, ou le numéro de la révision actuelle de la copie de travail de SVNPATH. Le --no-newlineest facultatif, indique de svnne pas émettre de nouvelle ligne cosmétique ( \n) après la valeur, si vous avez besoin d'une sortie minimale (uniquement le numéro de révision).

Voir: https://subversion.apache.org/docs/release-notes/1.9.html#svn-info-item


1
J'ai essayé svn 1.9.3, et la commande ici est svn info --show-item, au lieu de--show item
elopio

0

Les solutions publiées ne gèrent pas le cas lorsque des externes sont utilisés.

Si j'ai une URL ou une copie de travail avec l' svn:externalsensemble de propriétés, les externes peuvent changer et donc la dernière révision du serveur subversion changera. Mais la dernière révision de la copie de travail ou de l'URL ne rapportera le numéro de révision que lorsque la propriété svn: externals a été modifiée ou tout élément situé plus bas dans le chemin de l'URL, ce qui est le comportement attendu.

Vous obtenez donc la svn:externalspropriété et parcourez les URL et choisissez la révision des hauteurs ou interrogez l'URL de base sur le serveur de subversion. La version signalée à partir de l'URL de base contiendra la dernière révision pour TOUT sur le serveur.

Donc, si vous utilisez des externes, il est préférable d'utiliser svn info BASE_URLBASE_URLest l'URL racine de tous les chemins sur le serveur subversion.


0

Cela n'obtiendra que le numéro de révision de la dernière révision modifiée:

<?php
$REV="";
$repo = ""; #url or directory
$REV = svn info $repo --show-item last-changed-revision;
?>

J'espère que ça aide.


0

$ svn log | head -10 sur n'importe quel répertoire contenant un .svndossier


0

svn infoou svnversionne prendra pas en considération les sous-répertoires, pour trouver la dernière `` révision '' de la base de code en direct de la manière piratée ci-dessous a fonctionné pour moi - cela peut 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
$

0

Ceci peut être obtenu en utilisant la bibliothèque "SVN" :

import svn.remote

file_path = "enter your filepath"

svn_inf = svn.remote.RemoteClient(file_path)

head_revision = ([x for x in svn_inf.log_default(revision_to = 'HEAD')] [-1]).revision

Le head_revision doit contenir le dernier numéro de révision du fichier


-1

On dirait qu'il y a une entrée dans la FAQ officielle à ce sujet . Le code source est en C mais le même principe s'applique, comme indiqué ici dans cet article de liste de diffusion .


C'est un excellent outil / réponse, mais je ne pense pas qu'il ait besoin de beaucoup - je l'ai compris uniquement pour avoir besoin de la dernière révision, donc peut-être qu'il peut commencer une construction si sa révision actuelle est différente de la précédente depuis sa dernière vérification. Peut-être ai-je mal compris.
Tim

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.