Ottenere l'ultimo numero di revisione in SVN?


104

Utilizzando PHP, Perl o Python (preferibilmente PHP), ho bisogno di un modo per interrogare un database SVN e scoprire l'ultimo numero di revisione inviato a SVN. Non ho bisogno di nient'altro che quello. Deve essere non intensivo (quindi lo faccio ogni 5 minuti come cron job; le prestazioni di SVN non dovrebbero essere influenzate).

SVN si trova sulla mia Intranet, ma non sul mio computer specifico.

Ho SVN installato, ma nessun binding installato per PHP / Perl / Python. Utilizzo Windows XP, ma preferirei una soluzione indipendente dalla piattaforma che possa funzionare anche in Linux. Anche se disponi di una soluzione solo Linux (o solo XP), sarebbe utile.


2
"svn info --show-item revision" darà la revisione corrente a cui viene aggiornata la directory corrente.
GreatAndPowerfulOz

2
$ svn info --show-item revision svn: invalid option: --show-itemUtilizzo di Apache Subversion 1.8.16 (r1740329) compilato il 26 aprile 2016. Provato anche con CollabNet 1.6.11 (r934486) compilato il 6 marzo 2014.
IceArdor

In relazione a questi commenti, controlla svn help infole opzioni legali persvn info
XavierStuvw

@IceArdor Sto usando SVN v1.9.5 ed --show-itemè disponibile
ICC97

Risposte:


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

Puoi ottenere l'output in XML in questo modo:

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

Se si verifica un errore, l'output verrà indirizzato a stderr. Per catturare stderr nel tuo output usa così:

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

2
Se si verifica un errore, l'output verrà indirizzato a stderr. Per catturare stderr nel tuo output usa così: $ output = svn info $url 2>&1;
Daniel X Moore,

3
Grazie! Ho usato --xml per creare il mio strumento C # che mi aiuta a generare un attributo AssemblyFileVersion. PS: l'inglese non è la mia lingua principale e sono rimasto perplesso dalla parola "così" che non avevo mai sentito prima. A proposito, la sua origine è piuttosto divertente: cf ( en.wiktionary.org/wiki/thusly ); l'hai usato intenzionalmente (gioco di parole?) o è normale che tu lo usi così invece che così?
odalet

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

7
@Cobra_Fast, non hai bisogno di pipe, puoi fare svn info --show-item revision $urlo svn info --show-item last-changed-revision $url.
cp.engr

2
@ cp.engr Credo che sia solo da SVN v1.9 o giù di lì - cioè ce l'ho in v1.9.5 e non esiste in v1.8.6
icc97

131

Se vuoi analizzare una copia di lavoro locale, lo strumento migliore è svnversion, che viene fornito con Subversion e produce output come 968:1000M. La documentazione dice:

Il numero di versione sarà un numero singolo se la copia di lavoro è una revisione singola, non modificata, non cambiata e con un URL che corrisponde all'argomento TRAIL_URL. Se la copia di lavoro è insolita, il numero di versione sarà più complesso:

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

2
d'accordo, molto meglio di svn info
Riccardo

32
svnversion è per le copie di lavoro locali e non accederà al repository sulla intranet come specificato nella domanda.
Daniel X Moore,

5
Per chi non ha familiarità con svnversion, fa parte del client della riga di comando standard ed ecco la pagina di manuale: svnbook.red-bean.com/nightly/en/svn.ref.svnversion.re.html .
Michael Sorens

45

svn info -r HEAD

Questo ti darà l'ultimo numero di revisione all'inizio del tuo repository.

Ci sono alcuni bei post sul blog sull'integrazione dei numeri di sovversione nel tuo script di build:


Questo è il modo più semplice in quanto non devi prima scoprire l'URL del repository. Grazie!
derFunk

Ho ricevuto errori usando le virgolette intorno a HEAD, quindi dovrebbe esseresvn info -r HEAD
icc97

39

Questo dovrebbe funzionare in Bash, da una directory di lavoro. L'ho usato in Windows con unixutils installato:

svn info |grep Revision: |cut -c11-

Funziona se metti l'URL del repository dove hai% *, qualunque cosa tu intenda con questo. Bella sintassi di taglio, non lo sapevo prima.
ypnos

1
Nota: poiché manca -rHEAD, restituirà la revisione del commit per il file o la directory richiesti. Questa potrebbe non essere l'ultima revisione complessiva (perché altre modifiche potrebbero essere state apportate altrove o in una sottostruttura).
Mr Fooz

4
Inoltre, questo non funziona per le versioni localizzate di SVN (in polacco sarà | cut -c9-).
zgoda

2
cioè, a proposito, il motivo per cui non mi piacciono gli strumenti di sviluppo da riga di comando localizzati; zero vantaggio, un mucchio di problemi. Di solito rimuovo le localizzazioni proprio per questo motivo.
gimpf

8
Il passaggio di un delimitatore invece del conteggio dei caratteri funziona meglio per il contenuto localizzato, ad esempio svn info | grep Revision | cut -d " " -f 2restituirà la seconda stringa dopo che è stata divisa utilizzando gli spazi.
Butifarra

34

Quanto segue dovrebbe funzionare:

svnlook youngest <repo-path>

Restituisce un unico numero di revisione.


15

Per ottenere davvero l'ultimo numero di revisione ("revisione principale") sul tuo repository remoto , usa questo:

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

Uscite ad esempio:

35669

12

Una nota su come ottenere l'ultimo numero di revisione:

Diciamo che ho cd-ed in una sottodirectory revisionata ( MyProjectDir). Quindi, se chiamo svnversion:

$ svnversion .
323:340

... ottengo " 323:340", che immagino significhi: " hai elementi qui, che vanno dalla revisione 323 alla 340 ".

 

Quindi, se chiamo 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)

... ottengo " 323" come revisione - che in realtà è la revisione più bassa tra quelle riportate da svnversion!

 

Possiamo quindi utilizzare svn infoin modalità ricorsiva per ottenere maggiori informazioni dalla directory locale:

> 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
...

... (rimuovere il grepper vedere maggiori dettagli).

 

Infine, cosa fare quando vogliamo verificare qual è l'ultima revisione del repository online (in questo caso, @ server.com)? Quindi emettiamo di nuovo svn info, ma con -r HEAD(nota la differenza tra l' -Ropzione maiuscola in precedenza e minuscola -rora):

> 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 cosa interessante è che - svn infofa ancora riferimento alla sottodirectory corrente ( MyProjectDir), tuttavia, il percorso online è riportato come MyProjectDir(al contrario .del caso locale) - e la revisione online riportata è la più alta ( 340- al contrario di quella più bassa, 323riportata localmente).


9
  • A partire da Subversion 1.9 puoi usare l'opzione --show-item per ottenere un valore di uno dei campi svn infodell'output del comando. Questo comando visualizzerà solo il numero di revisione:

    svn info --show-item=revision <URL-to-repository>
    
  • Ottieni l'output XML delle informazioni svn usando l' --xmlopzione e usa PowerShell per ottenere il numero di revisione. Qui c'è un semplice esempio:

    [xml]$svninfo = svn info <REPOSITORY-URL> --xml -r HEAD
    $latestrevnum = $svninfo.info.entry.revision
    $latestrevnum
    
  • Utilizzando VisualSVN Server 3.4 o più recente, è possibile ottenere il numero di revisioni in un repository eseguendo questi comandi:

    $repo = Get-SvnRepository <REPOSITORY-NAME>

    $repo.Revisions

    Per ulteriori informazioni, vedere Informazioni di Get-SvnRepositoryriferimento sui cmdlet di PowerShell .


7

Penso che tu stia cercando

svn info -r HEAD

Puoi shell a quel comando?

Probabilmente dovrai fornire anche le credenziali di accesso al repository.


Penso che debba essere svn info -r HEAD
Stephen

-r può essere facilmente ommited allora.
ypnos

Giusto - non ho specificato l'opzione per -r - questo era solo per lui per trovare ciò di cui aveva bisogno e iniziare con l'aiuto / libro.
Tim

4

Qualcun altro mi ha battuto per pubblicare la risposta svnversion, che è sicuramente la soluzione migliore se hai una copia funzionante (IIRC, non funziona con gli URL). Aggiungo questo: se sei sul server che ospita SVN, il modo migliore è usare il svnlookcomando. Questo è il comando che usi quando scrivi uno script hook per ispezionare il repository (e anche la transazione corrente, nel caso di hook pre-commit). Puoi digitare svnlook helpper i dettagli. Probabilmente vorrai usare il svnlook youngestcomando. Notare che richiede l'accesso diretto alla directory repo, quindi deve essere utilizzato sul server.


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

O

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

O

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

2

Puoi usare entrambi i comandi:

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

Se hai la sfortuna di dover eseguire questa operazione da un file batch di Windows, ecco l'incantesimo che stai cercando:

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%

Questo esegue "svn info", iterando su ogni riga dell'output generato. Utilizza i due punti come delimitatore tra il primo e il secondo token sulla riga. Quando il primo token è "Revision", imposta la variabile d'ambiente REV sul secondo token.


1
puoi usare anche FINDSTR:FOR /F "tokens=2" %%i IN ('svn info ^| FINDSTR Revision:') DO SET revision=%%i
icc97

vedi quest'altra risposta SO per la base di questo
ICC97

2

Stai cercando una chiamata simile alla chiamata della riga di comando

svn info URL

Sembra che questo sia possibile usando la libreria pysvn e c'è una ricetta che dovrebbe aiutarti a iniziare. Non sono sicuro che ci sia qualcosa di simile per PHP.

Se è necessario ricorrere alla chiamata del binario SVN da soli, assicurarsi di utilizzare il --xmlparametro per ottenere il risultato come XML. Dovrebbe essere più facile da analizzare rispetto all'output della riga di comando.


Uso subprocess.check_outputin Python per evitare l'ennesima chiamata alla libreria. Se stai solo controllando i numeri di revisione / tirando giù le ultime copie, è più semplice usare svn dalla riga di comando tramite subprocess. Ora, se stai facendo check-in automatici e
unioni

2

È possibile utilizzare il formato XML out, ad esempio:

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

Esempio: utilizzo del numero di revisione

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

2

Puoi provare il comando seguente:

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

1

Solo svn infoin BASH ti fornirà tutti i dettagli

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

Otterrai la REVISIONE da questo


1

Il modo più semplice e pulito per farlo (in realtà svn 1.9, rilasciato 2015) è utilizzare:

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

L'output è il numero dell'ultima revisione (la più recente) per SVNURL o il numero della revisione corrente della copia di lavoro di SVNPATH. Il --no-newlineè facoltativo, l'istruzione svndi non emettere un ritorno a capo cosmetici ( \n) dopo il valore, se avete bisogno di uscita minima (solo il numero di revisione).

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


1
Ho provato su svn 1.9.3 e il comando qui è svn info --show-item, invece di--show item
elopio

0

Le soluzioni pubblicate non gestiscono il caso quando vengono utilizzati gli esterni.

Se ho un URL o una copia funzionante con la svn:externalsproprietà impostata, gli esterni potrebbero cambiare e quindi cambierà l'ultima revisione del server subversion. Ma l'ultima revisione della copia di lavoro o dell'URL riporterà solo il numero di revisione quando la proprietà svn: externals è stata modificata o qualsiasi elemento inferiore nel percorso dell'URL, che è il comportamento previsto.

Quindi si ottiene la svn:externalsproprietà e si itera sugli URL e si seleziona la revisione delle altezze o si interroga l'URL di base dal server di subversion. La versione riportata dall'URL di base conterrà l'ultima revisione per TUTTO sul server.

Quindi, se stai usando degli esterni, è meglio usare svn info BASE_URLdov'è BASE_URLl'URL di root per tutti i percorsi sul server subversion.


0

Questo otterrà solo il numero di revisione dell'ultima revisione modificata:

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

Spero che aiuti.


0

$ svn log | head -10 su qualsiasi directory che abbia una .svncartella


0

svn infoo svnversionnon prenderò in considerazione le sottodirectory, per trovare l'ultima 'revisione' della base di codice live il modo hackerato di seguito ha funzionato per me - potrebbe volerci del tempo per eseguire:

repo_root$ find ./ | xargs -l svn info  | grep 'Revision: ' | sort
...
Revision: 86
Revision: 86
Revision: 89
Revision: 90
$

0

Questo può essere ottenuto utilizzando la libreria "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

Head_revision dovrebbe contenere l'ultimo numero di revisione del file


-1

Sembra che ci sia una voce nelle FAQ ufficiali per questo . Il codice sorgente è in C ma si applica lo stesso principio, come delineato qui in questo post della mailing list .


Questo è un ottimo strumento / risposta, ma non penso che abbia bisogno di così tanto - l'ho capito solo per aver bisogno dell'ultima revisione, quindi forse può iniziare una build se la sua revisione attuale è diversa da una precedente dall'ultima volta che ha controllato. Forse ho capito male.
Tim,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.