SVN'deki son revizyon numarasını alıyor musunuz?


104

PHP, Perl veya Python (tercihen PHP) kullanarak, bir SVN veritabanını sorgulamanın ve SVN'ye gönderilen son revizyon numarasını bulmanın bir yoluna ihtiyacım var. Bundan başka hiçbir şeye ihtiyacım yok. Yoğun olmaması gerekir (bu yüzden cron işi olarak her 5 dakikada bir yapıyorum; SVN'nin performansı etkilenmemeli).

SVN intranet'imde bulunuyor, ancak bilgisayarımda değil.

SVN yükledim, ancak PHP / Perl / Python için hiçbir bağlama kurulu değil. Windows XP kullanıyorum, ancak Linux'ta da çalışabilen, platformdan bağımsız bir çözümü tercih ederim. Yalnızca Linux (veya yalnızca XP) bir çözümünüz varsa, bu da yardımcı olacaktır.


2
"svn info --show-item revision" güncel dizinin güncellenmiş olduğu mevcut revizyonu verecektir.
GreatAndPowerfulOz

2
$ svn info --show-item revision svn: invalid option: --show-itemApache Subversion 1.8.16 (r1740329) kullanılarak 26 Nisan 2016'da derlendi. Ayrıca CollabNet 1.6.11 (r934486) ile denendi 6 Mart 2014'te derlendi.
IceArdor

Bu yorumlarla bağlantılı olarak,svn help infosvn info
XavierStuvw

@IceArdor SVN v1.9.5 kullanıyorum ve --show-itemşu an mevcut
icc97

Yanıtlar:


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

Çıktıyı XML olarak şu şekilde alabilirsiniz:

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

Bir hata varsa, çıkış stderr'e yönlendirilecektir. Çıktınızda stderr yakalamak için şu şekilde kullanın:

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

2
Bir hata varsa, çıkış stderr'e yönlendirilecektir. Çıktınızda stderr yakalamak için şunu kullanın: $ output = svn info $url 2>&1;
Daniel X Moore

3
Teşekkürler! AssemblyFileVersion özniteliğini oluşturmama yardımcı olan kendi C # aracımı oluşturmak için --xml kullandım. Not: İngilizce benim birincil dilim değil ve daha önce hiç duymadığım 'bu yüzden' kelimesi beni şaşırttı. Btw, kökeni oldukça komik: cf ( en.wiktionary.org/wiki/thusly ); kasıtlı olarak mı kullandınız (pun?) yoksa bunun yerine bu şekilde kullanmanız yaygın mı?
odalet

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

7
@Cobra_Fast, sen boru gerekmez, yapabileceğiniz svn info --show-item revision $urlya svn info --show-item last-changed-revision $url.
cp.engr

2
@ cp.engr Bunun sadece SVN v1.9'dan beri olduğuna inanıyorum - bu v1.9.5'te var ve v1.8.6'da yok
icc97

131

Yerel bir çalışma kopyasını analiz etmek istiyorsanız, en iyi araç svnversionSubversion ile gelen ve 968:1000M. Belgeler şunu söylüyor:

Çalışma kopyası tek bir revizyonsa, değiştirilmemişse, değiştirilmemişse ve TRAIL_URL bağımsız değişkeniyle eşleşen bir URL'ye sahipse sürüm numarası tek bir sayı olacaktır. Çalışma kopyası olağandışı ise, sürüm numarası daha karmaşık olacaktır:

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

2
kabul etti, svn bilgisinden çok daha iyi
Richard,

32
svnversion yerel çalışma kopyaları içindir ve soruda belirtildiği gibi intranet üzerindeki depoya erişmez.
Daniel X Moore

5
Svnversion'a aşina olmayanlar için, standart komut satırı istemcisinin bir parçasıdır ve işte kılavuz sayfası: svnbook.red-bean.com/nightly/en/svn.ref.svnversion.re.html .
Michael Sorens


39

Bu, bir çalışma dizininden Bash'de çalışmalıdır. Windows'ta unixutils yüklü olarak kullandım:

svn info |grep Revision: |cut -c11-

Depo URL'sini% * ifadesine sahip olduğunuz yere koyarsanız, bununla ne demek isterseniz çalışır. Güzel sözdizimi, daha önce bilmiyordum.
ypnos

1
Not: -rHEAD'den yoksun olduğundan, bu istenen dosya veya dizin için commit revizyonunu döndürecektir. Bu, en son genel revizyon olmayabilir (çünkü diğer değişiklikler başka bir yerde veya bir alt ağaçta yapılmış olabilir).
Mr Fooz

4
Ayrıca, bu SVN'nin yerelleştirilmiş sürümleri için çalışmaz (Lehçe'de bu | cut -c9- olacaktır).
zgoda

2
bu, btw, yerelleştirilmiş komut satırı geliştirici araçlarından kesinlikle hoşlanmamamın nedeni; sıfır avantaj, bir sürü sorun. Genellikle tam da bu nedenle yerelleştirmeleri kaldırırım.
gimpf

8
Bir karakter sayısı yerine bir sınırlayıcı iletmek yerelleştirilmiş içerik için en iyi sonucu verir; örneğin svn info | grep Revision | cut -d " " -f 2, boşluklar kullanılarak bölündükten sonra ikinci dizeyi döndürür.
Butifarra 01

34

Aşağıdakiler çalışmalıdır:

svnlook youngest <repo-path>

Tek bir revizyon numarası döndürür.


15

Uzak deponuzda en son revizyon ("baş revizyon") numarasını gerçekten almak için şunu kullanın:

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

Örneğin çıktılar:

35669

12

En son revizyon numarasını alma hakkında bir not:

Diyelim ki cdrevize edilmiş bir alt dizinde ( MyProjectDir). Sonra ararsam svnversion:

$ svnversion .
323:340

... " 323:340" karşılığını alıyorum, sanırım bu şu anlama geliyor: " Burada 323 ile 340 revizyon arasında değişen öğeler var ".

 

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

... 323Revizyon olarak " " alıyorum - bu aslında tarafından rapor edilenler arasında en düşük revizyon svnversion!

 

Daha sonra svn infoyerel dizinden daha fazla bilgi almak için özyinelemeli modda kullanabiliriz :

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

... ( grepdaha fazla ayrıntı görmek için simgesini kaldırın ).

 

Son olarak, çevrimiçi deponun en son revizyonunun ne olduğunu kontrol etmek istediğimizde ne yapmalıyız (bu durumda, @ server.com)? Sonra tekrar yayınlıyoruz svn info, ancak -r HEAD( -Rdaha önce büyük harf seçeneği ile -rşimdi küçük harf arasındaki farka dikkat edin ):

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

- İlginç bir şey svn infohala geçerli alt dizine (atıfta MyProjectDir) Ancak çevrimiçi yol olarak bildirilir MyProjectDir(aksine .yerel durum için) - ve çevrimiçi revizyon olduğunu bildirdi yüksek ( 340- düşük bir karşıt olarak, 323rapor yerel olarak).


9
  • Subversion 1.9 ile başlayarak , komut çıktısının alanlarından birinin değerini almak için --show-item seçeneğini kullanabilirsiniz svn info. Bu komut yalnızca revizyon numarasını gösterecektir:

    svn info --show-item=revision <URL-to-repository>
    
  • Seçeneği kullanarak svn bilgisinin XML çıktısını alın --xmlve revizyon numarasını almak için PowerShell'i kullanın. İşte basit bir örnek:

    [xml]$svninfo = svn info <REPOSITORY-URL> --xml -r HEAD
    $latestrevnum = $svninfo.info.entry.revision
    $latestrevnum
    
  • VisualSVN Server 3.4 veya daha yenisini kullanarak, şu komutları çalıştırarak bir depodaki revizyonların sayısını alabilirsiniz:

    $repo = Get-SvnRepository <REPOSITORY-NAME>

    $repo.Revisions

    Daha fazla bilgi için Get-SvnRepositoryPowerShell cmdlet başvurusuna bakın .


7

Bence arıyorsun

svn info -r HEAD

Bu komuta cevap verebilir misin?

Depo ile birlikte muhtemelen oturum açma kimlik bilgilerini de sağlamanız gerekecektir.


Bence svn info -r HEAD
Stephen

-r daha sonra kolaylıkla ihmal edilebilir.
ypnos

Doğru - -r seçeneğini belirtmedim - bu sadece onun neye ihtiyacı olduğunu bulması ve yardım / kitapla başlaması içindi.
Tim

4

Cevabı yayınlamak için beni yenen biri svnversion, eğer çalışan bir kopyanız varsa kesinlikle en iyi çözümdür (IIRC, URL'lerle çalışmaz). Bunu ekleyeceğim: SVN'yi barındıran sunucu üzerindeyseniz, en iyi yol svnlookkomutu kullanmaktır . Bu, depoyu incelemek için bir kanca komut dosyası yazarken kullandığınız komuttur (ve hatta ön işleme kancaları olması durumunda geçerli işlem). svnlook helpAyrıntılar için yazabilirsiniz . Muhtemelen svnlook youngestkomutu kullanmak istersiniz . Depo dizinine doğrudan erişim gerektirdiğinden, sunucuda kullanılması gerektiğini unutmayın.


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

Veya

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

Veya

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

2

Her iki komutu da kullanabilirsiniz:

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

Bunu bir Windows toplu iş dosyasından yapma talihsizliğiniz varsa, işte aradığınız büyü:

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%

Bu, üretilen çıktının her satırını yineleyerek "svn bilgisini" çalıştırır. Satırdaki birinci ve ikinci belirteç arasında sınırlayıcı olarak iki nokta üst üste kullanır. İlk belirteç "Revizyon" olduğunda, ortam değişkenini REV ikinci simgeye ayarlar.


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

bunun temeli için diğer SO cevabına bakın
icc97

2

Komut satırı çağrısına benzer bir çağrı arıyorsunuz

svn info URL

Görünüşe göre bu, pysvn kitaplığı kullanılarak mümkün ve başlamanıza yardımcı olacak bir tarif var. PHP için benzer bir şey olup olmadığından emin değilim.

SVN ikilisini kendiniz çağırmanız --xmlgerekiyorsa, sonucu XML olarak almak için parametreyi kullandığınızdan emin olun . Bu, komut satırı çıktısından daha kolay ayrıştırılmalıdır.


subprocess.check_outputPython'da başka bir kütüphane çağrısından kaçınmak için kullanıyorum . Yalnızca revizyon numaralarını kontrol ediyorsanız / en son kopyaları aşağı çekiyorsanız, svn'yi komut satırından kullanarak kullanmak daha kolaydır subprocess. Şimdi, otomatik check-in ve birleştirme yapıyorsanız ...
Droogans

2

XML çıkış biçimini kullanabilirsiniz, örneğin:

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

Örnek: revizyon numarasını kullanma

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

2

Aşağıdaki komutu deneyebilirsiniz:

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

1

Sadece svn infoBASH'da size tüm detayları verecek

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

REVİZYONU buradan alacaksınız


1

Bunu yapmanın en basit ve temiz yolu (aslında svn 1.9, 2015'te yayınlandı) şunu kullanmaktır:

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

Çıktı, SVNURL için son revizyonun (en küçük) numarası veya SVNPATH'ın çalışan kopyasının mevcut revizyonunun numarasıdır . --no-newlineİsteğe bağlıdır talimatını svn(kozmetik yeni satır yayacak şekilde değil \nçok az bir çıkış (sadece revizyon numarası) gerekirse, değerden sonra).

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


1
Svn svn info --show-item--show item
1.9.3'ü

0

Gönderilen çözümler, harici ürünler kullanıldığında durumu işlemez.

svn:externalsÖzellik ayarlanmış bir URL'ye veya çalışan bir kopyaya sahipsem, harici olanlar değişebilir ve bu nedenle alt sürüm sunucusunun en son revizyonu değişecektir. Ancak çalışan kopyanın veya URL'nin en son revizyonu, revizyon numarasını yalnızca svn: externals propty değiştiğinde veya URL yolunda daha düşük bir öğe olduğunda, beklenen bir davranış olarak bildirecektir.

Yani ya svn:externalsmülkü alırsınız ve URL'leri yinelersiniz ve yükseklik revizyonunu seçersiniz ya da subversion sunucusundan temel URL'yi sorgularsınız. Temel URL'den bildirilen sürüm, sunucudaki HER ŞEY için en son revizyonu içerecektir.

Bu nedenle, harici kullanıyorsanız , subversion sunucusundaki tüm yollar için kök URL'nin svn info BASE_URLnerede BASE_URLolduğunu kullanmak en iyisidir .


0

Bu yalnızca son değiştirilen revizyonun revizyon numarasını alacaktır:

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

Umarım bu yardımcı olur.


0

$ svn log | head -10 bir .svnklasörü olan dizinde


0

svn infoveya svnversionalt dizinleri dikkate almaz, canlı kod tabanının en son 'revizyonunu' bulmak için, aşağıda hacklenmiş şekilde benim için çalıştı - çalıştırılması biraz zaman alabilir:

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

0

Bu, "SVN" kitaplığı kullanılarak elde edilebilir :

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, dosyanın en son revizyon numarasını içermelidir



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.