Obtendo o número da última revisão no SVN?


104

Usando PHP, Perl ou Python (de preferência PHP), preciso consultar um banco de dados SVN e descobrir o último número de revisão enviado ao SVN. Eu não preciso de nada além disso. Ele precisa ser não intensivo (então eu faço isso a cada 5 minutos como um cron job; o desempenho do SVN não deve ser afetado).

O SVN está localizado na minha intranet, mas não no meu computador específico.

Tenho o SVN instalado, mas não há ligações instaladas para PHP / Perl / Python. Estou executando o Windows XP, mas prefiro uma solução independente de plataforma que também funcione no Linux. Se você tiver uma solução apenas para Linux (ou apenas XP), isso também seria útil.


2
"svn info --show-item revision" fornecerá a revisão atual para a qual o diretório atual é atualizado.
GreatAndPowerfulOz

2
$ svn info --show-item revision svn: invalid option: --show-itemUsando Apache Subversion 1.8.16 (r1740329) compilado em 26 de abril de 2016. Também experimentado com CollabNet 1.6.11 (r934486) compilado em 6 de março de 2014.
IceArdor

Em conexão com esses comentários, verifique svn help infoas opções legais parasvn info
XavierStuvw

@IceArdor Estou usando o SVN v1.9.5 e --show-itemestá disponível
icc97

Respostas:


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

Você pode obter a saída em XML assim:

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

Se houver um erro, a saída será direcionada para stderr. Para capturar stderr em sua saída, use da seguinte maneira:

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

2
Se houver um erro, a saída será direcionada para stderr. Para capturar stderr em sua saída, use da seguinte forma: $ output = svn info $url 2>&1;
Daniel X Moore

3
Obrigado! Usei --xml para construir minha própria ferramenta C # que me ajuda a gerar um atributo AssemblyFileVersion. PS: Inglês não é minha língua principal e fiquei intrigado com a palavra 'assim' que nunca tinha ouvido antes. A propósito, sua origem é bastante engraçada: cf ( en.wiktionary.org/wiki/thusly ); você usou intencionalmente (trocadilho?) ou é comum usar assim em vez de assim?
odalet

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

7
@Cobra_Fast, você não precisa canalizar, você pode fazer svn info --show-item revision $urlou svn info --show-item last-changed-revision $url.
cp.engr

2
@ cp.engr Acredito que isso seja apenas desde o SVN v1.9 ou assim - ou seja, eu o tenho na v1.9.5 e não existe na v1.8.6
icc97

131

Se você deseja analisar uma cópia de trabalho local, a melhor ferramenta é svnversion, que vem com o Subversion e produz saída semelhante 968:1000M. A documentação diz:

O número da versão será um único número se a cópia de trabalho for de revisão única, não modificada, não trocada e com uma URL que corresponda ao argumento TRAIL_URL. Se a cópia de trabalho for incomum, o número da versão será mais complexo:

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

2
concordou, muito melhor do que svn info
Richard

32
svnversion é para cópias de trabalho locais e não acessa o repositório na intranet como especificado na questão.
Daniel X Moore

5
Para aqueles não familiarizados com o svnversion, ele faz parte do cliente de linha de comando padrão e aqui está a página do manual: svnbook.red-bean.com/nightly/en/svn.ref.svnversion.re.html .
Michael Sorens

45

svn info -r HEAD

Isso lhe dará o número da revisão mais recente no cabeçalho do seu repositório.

Existem alguns posts interessantes sobre a integração de números de subversão em seu script de construção:


Esta é a maneira mais simples, pois você não precisa descobrir a url do repositório primeiro. Obrigado!
derFunk de

Recebi erros ao usar aspas no HEAD, então deve sersvn info -r HEAD
icc97

39

Isso deve funcionar no Bash, de um diretório de trabalho. Eu usei no Windows com unixutils instalado:

svn info |grep Revision: |cut -c11-

Funciona se você colocar a URL do repositório onde você tem% *, o que quer que você queira dizer com isso. Bela sintaxe de corte, não sabia antes.
ypnos

1
Nota: já que falta -rHEAD, isso retornará a revisão de commit para o arquivo ou diretório solicitado. Esta pode não ser a revisão geral mais recente (porque outras alterações podem ter sido confirmadas em outro lugar ou em uma subárvore).
Sr. Fooz

4
Além disso, isso não funciona para versões localizadas do SVN (em polonês deve ser | cut -c9-).
zgoda

2
essa é, aliás, a razão pela qual não gosto de ferramentas de desenvolvedor de linha de comando localizadas; vantagem zero, um monte de problemas. Eu geralmente removo as localizações exatamente por esse motivo.
gimpf

8
Passar um delimitador em vez de uma contagem de caracteres funciona melhor para conteúdo localizado, por exemplo svn info | grep Revision | cut -d " " -f 2, retornará a segunda string após ser dividida com espaços.
Butifarra 01 de

34

O seguinte deve funcionar:

svnlook youngest <repo-path>

Ele retorna um único número de revisão.


15

Para realmente obter o número da revisão mais recente ("revisão principal") em seu repositório remoto , use isto:

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

Saídas, por exemplo:

35669

12

Uma nota sobre como obter o número da revisão mais recente:

Digamos que eu cdmodifiquei em um subdiretório revisado ( MyProjectDir). Então, se eu ligar svnversion:

$ svnversion .
323:340

... Recebo " 323:340", que acho que significa: " você tem itens aqui, variando da revisão 323 a 340 ".

 

Então, se eu ligar 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)

... Recebo " 323" como revisão - que na verdade é a revisão mais baixa daquelas relatadas por svnversion!

 

Podemos então usar svn infono modo recursivo para obter mais informações do diretório 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
...

... (remova o greppara ver mais detalhes).

 

Finalmente, o que fazer quando queremos verificar qual é a última revisão do repositório online (neste caso, @ server.com)? Em seguida, emitimos novamente svn info, mas com -r HEAD(observe a diferença entre a -Ropção de maiúsculas anteriormente e as minúsculas -ragora):

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

O interessante é - svn infoainda se refere ao subdiretório atual ( MyProjectDir), no entanto, o caminho online é relatado como MyProjectDir(em oposição ao .caso local) - e a revisão online relatada é a mais alta ( 340- em oposição à mais baixa, 323relatada localmente).


9
  • A partir do Subversion 1.9, você pode usar a opção --show-item para obter o valor de um dos campos de svn infosaída do comando. Este comando exibirá apenas o número da revisão:

    svn info --show-item=revision <URL-to-repository>
    
  • Obtenha a saída XMLed de svn info usando a --xmlopção e use o PowerShell para obter o número de revisão. Aqui está um exemplo simples:

    [xml]$svninfo = svn info <REPOSITORY-URL> --xml -r HEAD
    $latestrevnum = $svninfo.info.entry.revision
    $latestrevnum
    
  • Usando o VisualSVN Server 3.4 ou mais recente, você pode obter o número de revisões em um repositório executando estes comandos:

    $repo = Get-SvnRepository <REPOSITORY-NAME>

    $repo.Revisions

    Consulte a Get-SvnRepositoryreferência de cmdlet do PowerShell para obter mais informações.


7

Eu acho que você está procurando

svn info -r HEAD

Você pode cumprir esse comando?

Provavelmente, você também precisará fornecer credenciais de login com o repositório.


Acho que precisa ser svn info -r HEAD
Stephen

-r pode ser facilmente omitido então.
ypnos

Certo - eu não especifiquei a opção para o -r - isso era apenas para ele encontrar o que ele precisa e começar com o help / book.
Tim

4

Alguém me adiantou para postar a resposta sobre svnversion, que é definitivamente a melhor solução se você tiver uma cópia de trabalho (IIRC, não funciona com URLs). Vou acrescentar o seguinte: se você está no servidor que hospeda o SVN, a melhor maneira é usar o svnlookcomando. Este é o comando que você usa ao escrever um script de gancho para inspecionar o repositório (e até mesmo a transação atual, no caso de ganchos de pré-confirmação). Você pode digitar svnlook helppara obter detalhes. Você provavelmente deseja usar o svnlook youngestcomando. Observe que ele requer acesso direto ao diretório repo, portanto, deve ser usado no servidor.


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

Você pode usar qualquer um dos comandos:

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 você tiver a infelicidade de precisar fazer isso a partir de um arquivo em lote do Windows, aqui está o encantamento que você está procurando:

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%

Isso executa "svn info", iterando em cada linha de saída gerada. Ele usa dois pontos como delimitador entre o primeiro e o segundo token na linha. Quando o primeiro token é "Revisão", ele define a variável de ambiente REV como o segundo token.


1
você também pode usar FINDSTR:FOR /F "tokens=2" %%i IN ('svn info ^| FINDSTR Revision:') DO SET revision=%%i
icc97

veja esta outra resposta do SO para a base disso
icc97

2

Você está procurando uma chamada semelhante à chamada da linha de comando

svn info URL

Parece que isso é possível usando a biblioteca pysvn, e há uma receita que deve ajudá-lo a começar. Não tenho certeza se há algo semelhante para PHP.

Se você precisar recorrer à chamada do binário SVN por conta própria, certifique-se de usar o --xmlparâmetro para obter o resultado como XML. Isso deve ser mais fácil de analisar do que a saída da linha de comando.


Eu uso subprocess.check_outputem python para evitar outra chamada de biblioteca. Se você está apenas verificando os números de revisão / retirando as últimas cópias, é mais simples usar o svn na linha de comando via subprocess. Agora, se você estiver fazendo check-ins automáticos e mesclagens ...
Droogans

2

Você pode usar o formato XML out, por exemplo:

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

Exemplo: usando o número de revisão

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

2

Você pode tentar o comando abaixo:

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

1

svn infono BASH te darei todos os detalhes

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

Você obterá a REVISÃO deste


1

A maneira mais simples e limpa de fazer isso (na verdade, svn 1.9, lançado em 2015) é usando:

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

A saída é o número da última revisão (mais jovem) para o SVNURL, ou o número da revisão atual da cópia de trabalho do SVNPATH. O --no-newlineé opcional, instrui a svnnão emitir uma nova linha cosmética ( \n) após o valor, se você precisar de saída mínima (apenas o número da revisão).

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


1
Tentei o svn 1.9.3 e o comando aqui é svn info --show-item, em vez de--show item
elopio

0

As soluções postadas não resolvem o caso quando externos estão sendo usados.

Se eu tiver uma URL ou uma cópia de trabalho com a svn:externalspropriedade definida, os externos podem mudar e, portanto, a última revisão do servidor subversion mudará. Mas a última revisão da cópia de trabalho ou URL somente relatará o número da revisão quando a propriedade svn: externals foi alterada ou qualquer item abaixo no caminho da URL, o que é o comportamento esperado.

Então você obtém o svn:externals propriedade e itera sobre os URLs e escolhe a revisão das alturas ou consulta a URL base do servidor subversion. A versão relatada a partir do URL base conterá a revisão mais recente de TUDO no servidor.

Portanto, se você estiver usando externos, é melhor usar svn info BASE_URLonde BASE_URLestá a URL raiz para todos os caminhos no servidor subversion.


0

Isso obterá apenas o número de revisão da última revisão alterada:

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

Eu espero que isso ajude.


0

$ svn log | head -10 em qualquer diretório que tenha uma .svnpasta


0

svn infoou svnversionnão levará em consideração os subdiretórios, para encontrar a última 'revisão' da base de código ao vivo que a forma hackeada abaixo funcionou para mim - pode demorar um pouco para executar:

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

0

Isso pode ser obtido usando a biblioteca "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

O head_revision deve conter o número de revisão mais recente do arquivo


-1

Parece que há uma entrada no FAQ oficial para isso . O código-fonte está em C, mas o mesmo princípio se aplica, conforme descrito aqui nesta postagem da lista de discussão .


Esta é uma ótima ferramenta / resposta, mas não acho que ele precise de muito - entendi que só precisava da revisão mais recente, então talvez ele possa iniciar uma construção se sua revisão atual for diferente da anterior desde a última verificação. Talvez eu tenha entendido mal.
Tim

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.