Mendapatkan nomor revisi terakhir di SVN?

104

Dengan menggunakan PHP, Perl, atau Python (sebaiknya PHP), saya memerlukan cara untuk meminta database SVN dan mengetahui nomor revisi terakhir yang dikirim ke SVN. Saya tidak butuh apapun selain itu. Ini perlu non-intensif (jadi saya melakukannya setiap 5 menit sebagai tugas cron; kinerja SVN tidak boleh terpengaruh).

SVN terletak di Intranet saya, tetapi tidak di komputer khusus saya.

Saya telah menginstal SVN, tetapi tidak ada binding yang diinstal untuk PHP / Perl / Python. Saya menjalankan Windows XP, tetapi saya lebih memilih solusi yang tidak bergantung platform yang juga dapat bekerja di Linux. Jika Anda memiliki solusi khusus Linux (atau hanya XP), itu juga akan membantu.

Coltin
sumber
2
"svn info --show-item revision" akan memberikan revisi saat ini untuk pembaruan direktori saat ini.
GreatAndPowerfulOz
2
$ svn info --show-item revision svn: invalid option: --show-itemMenggunakan Apache Subversion 1.8.16 (r1740329) yang dikompilasi 26 April 2016. Juga dicoba dengan CollabNet 1.6.11 (r934486) yang dikompilasi 6 Maret 2014.
IceArdor
Sehubungan dengan komentar ini, periksa svn help infoopsi hukum untuksvn info
XavierStuvw
@IceArdor Saya menggunakan SVN v1.9.5 dan --show-itemtersedia
icc97

Jawaban:

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

Anda bisa mendapatkan hasilnya dalam XML seperti ini:

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

Jika terjadi error maka output akan diarahkan ke stderr. Untuk menangkap stderr dalam output Anda, gunakan sebagai berikut:

$output = `svn info $url 2>&1`;
Daniel X Moore
sumber
2
Jika terjadi error maka output akan diarahkan ke stderr. Untuk menangkap stderr dalam output Anda gunakan sebagai berikut: $ output = svn info $url 2>&1;
Daniel X Moore
3
Terima kasih! Saya menggunakan --xml untuk membangun alat C # saya sendiri yang membantu saya menghasilkan atribut AssemblyFileVersion. PS: Bahasa Inggris bukan bahasa utama saya dan saya bingung dengan kata 'soly' yang belum pernah saya dengar sebelumnya. Btw, asalnya agak lucu: cf ( en.wiktionary.org/wiki/thusly ); apakah Anda menggunakannya dengan sengaja (permainan kata?) atau apakah Anda biasa menggunakannya dengan sengaja daripada demikian?
odalet
7
svn info $url | grep 'Last Changed Rev' | awk '{ print $4; }'
Cobra_Fast
7
@Cobra_Fast, Anda tidak perlu menyalurkan, Anda dapat melakukan svn info --show-item revision $urlatau svn info --show-item last-changed-revision $url.
cp.engr
2
@ cp.engr Saya yakin itu hanya sejak SVN v1.9 atau lebih - saya memilikinya di v1.9.5 dan tidak ada di v1.8.6
icc97
131

Jika Anda ingin menganalisis copy pekerjaan lokal, alat terbaik adalah svnversion, yang disertakan dengan Subversion dan menghasilkan keluaran seperti 968:1000M. Dokumentasinya mengatakan:

Nomor versi akan menjadi nomor tunggal jika copy pekerjaan adalah revisi tunggal, tidak diubah, tidak dialihkan dan dengan URL yang cocok dengan argumen TRAIL_URL. Jika copy pekerjaan tidak biasa, nomor versi akan menjadi lebih kompleks:

4123:4168     mixed revision working copy
4168M         modified working copy
4123S         switched working copy
4123:4168MS   mixed revision, modified, switched working copy
sth
sumber
2
setuju, jauh lebih baik daripada info svn
Richard
32
svnversion adalah untuk copy pekerjaan lokal, dan tidak akan mengakses repositori di intranet seperti yang ditentukan dalam pertanyaan.
Daniel X Moore
5
Bagi mereka yang tidak terbiasa dengan svnversion, ini adalah bagian dari klien baris perintah standar dan berikut adalah halaman manualnya : svnbook.red-bean.com/nightly/en/svn.ref.svnversion.re.html .
Michael Sorens
45

svn info -r HEAD

Ini akan memberi Anda nomor revisi terbaru di bagian atas repositori Anda.

Ada beberapa posting blog yang bagus tentang mengintegrasikan nomor subversi ke dalam skrip build Anda:

Nick Haddad
sumber
Ini adalah cara termudah karena Anda tidak perlu mencari tahu url repositori terlebih dahulu. Terima kasih!
derFunk
Saya mendapat kesalahan menggunakan tanda kutip di sekitar HEAD, jadi seharusnyasvn info -r HEAD
icc97
39

Ini harus bekerja di Bash, dari direktori kerja. Saya telah menggunakannya di Windows dengan unixutils diinstal:

svn info |grep Revision: |cut -c11-
Blorgbeard keluar
sumber
Ini berfungsi jika Anda meletakkan URL repositori di mana Anda memiliki% *, apa pun yang Anda maksud dengan itu. Sintaks yang bagus dari potongan, tidak mengetahuinya sebelumnya.
ypnos
1
Catatan: karena ini kekurangan -rHEAD, ini akan mengembalikan revisi komit untuk file atau direktori yang diminta. Ini mungkin bukan revisi keseluruhan terbaru (karena perubahan lain mungkin telah dilakukan di tempat lain atau dalam subpohon).
Tuan Fooz
4
Selain itu, ini tidak berfungsi untuk versi SVN yang dilokalkan (dalam bahasa Polandia ini menjadi | cut -c9-).
zgoda
2
itulah, btw, alasan mengapa saya sangat tidak menyukai alat pengembang baris perintah yang dilokalkan; keuntungan nol, banyak masalah. Saya biasanya menghapus pelokalan karena alasan ini.
gimpf
8
Meneruskan pembatas dan bukan jumlah karakter berfungsi paling baik untuk konten yang dilokalkan, misalnya svn info | grep Revision | cut -d " " -f 2akan mengembalikan string kedua setelah dipisahkan menggunakan spasi.
Butifarra
34

Berikut ini seharusnya bekerja:

svnlook youngest <repo-path>

Ini mengembalikan satu nomor revisi.

Magentus
sumber
15

Untuk benar-benar mendapatkan nomor revisi ("revisi kepala") terbaru pada penyimpanan jarak jauh Anda , gunakan ini:

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

Keluaran misalnya:

35669
derFunk
sumber
12

Catatan tentang mendapatkan nomor revisi terbaru:

Katakanlah saya sudah cd-ed di subdirektori direvisi ( MyProjectDir). Kemudian, jika saya menelepon svnversion:

$ svnversion .
323:340

... Saya mendapatkan " 323:340", yang menurut saya berarti: " Anda memiliki item di sini, mulai dari revisi 323 hingga 340 ".

 

Kemudian, jika saya menelepon 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)

... Saya mendapatkan " 323" sebagai revisi - yang sebenarnya merupakan revisi terendah dari yang dilaporkan oleh svnversion!

 

Kita kemudian dapat menggunakan svn infomode rekursif untuk mendapatkan lebih banyak informasi dari direktori lokal:

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

... (hapus grepuntuk melihat lebih detil).

 

Terakhir, apa yang harus dilakukan ketika kita ingin memeriksa apa yang merupakan revisi terbaru dari repositori online (dalam hal ini, @ server.com)? Kemudian kami kembali menerbitkan svn info, tetapi dengan -r HEAD(perhatikan perbedaan antara -Ropsi modal sebelumnya, dan huruf kecil -rsekarang):

> svn info -r 'HEAD'
[email protected]'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)

Hal yang menarik adalah - svn infomasih mengacu pada subdirektori saat ini ( MyProjectDir), namun, jalur online dilaporkan sebagai MyProjectDir(sebagai lawan .untuk kasus lokal) - dan revisi online yang dilaporkan adalah yang tertinggi ( 340- dibandingkan dengan yang terendah, 323dilaporkan lokal).

sdaau
sumber
9
  • Dimulai dengan Subversion 1.9 Anda dapat menggunakan opsi --show-item untuk mendapatkan nilai dari salah satu bidang svn infokeluaran perintah. Perintah ini hanya akan menampilkan nomor revisi:

    svn info --show-item=revision <URL-to-repository>
    
  • Dapatkan output XML dari info svn menggunakan --xmlopsi dan gunakan PowerShell untuk mendapatkan nomor revisi. Berikut ini contoh sederhananya:

    [xml]$svninfo = svn info <REPOSITORY-URL> --xml -r HEAD
    $latestrevnum = $svninfo.info.entry.revision
    $latestrevnum
    
  • Menggunakan VisualSVN Server 3.4 atau yang lebih baru, Anda bisa mendapatkan jumlah revisi dalam repositori dengan menjalankan perintah berikut:

    $repo = Get-SvnRepository <REPOSITORY-NAME>

    $repo.Revisions

    Lihat Get-SvnRepositoryReferensi cmdlet PowerShell untuk informasi lebih lanjut.

bahrep
sumber
7

Saya pikir Anda sedang mencari

svn info -r HEAD

Bisakah Anda melakukan shell untuk perintah itu?

Anda mungkin perlu memberikan kredensial login dengan repositori juga.

Tim
sumber
Saya pikir itu perlu info svn -r KEPALA
Stephen
-r bisa dengan mudah dihilangkan.
ypnos
Benar - Saya tidak menentukan opsi untuk -r - ini hanya agar dia menemukan apa yang dia butuhkan dan memulai dengan bantuan / buku.
Tim
4

Seseorang mengalahkan saya untuk memposting jawaban tentang svnversion, yang pasti merupakan solusi terbaik jika Anda memiliki salinan yang berfungsi (IIRC, itu tidak berfungsi dengan URL). Saya akan menambahkan ini: jika Anda menggunakan server yang menghosting SVN, cara terbaik adalah menggunakan svnlookperintah. Ini adalah perintah yang Anda gunakan saat menulis skrip hook untuk memeriksa repositori (dan bahkan transaksi saat ini, dalam kasus hook pra-komit). Anda dapat mengetik svnlook helpuntuk detailnya. Anda mungkin ingin menggunakan svnlook youngestperintah tersebut. Perhatikan bahwa ini membutuhkan akses langsung ke direktori repo, jadi itu harus digunakan di server.

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

Atau

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

Atau

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

Anda dapat menggunakan salah satu perintah:

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
Angelin Nadar
sumber
2

Jika Anda ingin yang sangat pendek:

svn info ^/

The notasi tanda sisipan adalah singkatan untuk "URL direktori root repositori".

Sanghyun Lee
sumber
2

Jika Anda tidak beruntung karena harus melakukan ini dari file batch Windows, berikut adalah mantra yang Anda cari:

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%

Ini menjalankan "svn info", melakukan iterasi melalui setiap baris keluaran yang dihasilkan. Ini menggunakan titik dua sebagai pemisah antara token pertama dan kedua di baris. Saat token pertama adalah "Revisi", variabel lingkungan REV disetel ke token kedua.

yoyo
sumber
1
Anda juga dapat menggunakan FINDSTR:FOR /F "tokens=2" %%i IN ('svn info ^| FINDSTR Revision:') DO SET revision=%%i
icc97
lihat jawaban SO lainnya ini untuk dasar ini
icc97
2

Anda mencari panggilan yang mirip dengan panggilan baris perintah

svn info URL

Tampaknya hal ini dapat dilakukan dengan menggunakan perpustakaan pysvn, dan ada resep yang dapat membantu Anda memulai. Saya tidak yakin apakah ada yang serupa untuk PHP.

Jika Anda perlu memanggil sendiri biner SVN, pastikan untuk menggunakan --xmlparameter untuk mendapatkan hasilnya sebagai XML. Itu seharusnya lebih mudah diurai daripada keluaran baris perintah.

Sander Rijken
sumber
Saya menggunakan subprocess.check_outputpython untuk menghindari panggilan perpustakaan lain. Jika Anda hanya memeriksa nomor revisi / menarik salinan terbaru, lebih mudah menggunakan svn dari baris perintah melalui subprocess. Sekarang, jika Anda melakukan check-in dan penggabungan otomatis ...
Droogans
2

Anda dapat menggunakan format XML out, misalnya:

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

Contoh: menggunakan nomor revisi

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

Anda dapat mencoba perintah di bawah ini:

svn info -r 'HEAD' | grep Revision: | awk -F' ' '{print $2}'
mrajiv.dll
sumber
1

Hanya svn infodi BASH akan memberi Anda semua detail

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

Anda akan mendapatkan REVISI dari ini

DD
sumber
1

Cara termudah dan bersih untuk melakukannya (sebenarnya svn 1.9, dirilis 2015) adalah menggunakan:

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

Outputnya adalah jumlah file revisi terakhir (paling muda) untuk SVNURL, atau nomor revisi saat ini dari copy pekerjaan SVNPATH. Ini --no-newlineopsional, menginstruksikan svnuntuk tidak mengeluarkan baris baru kosmetik ( \n) setelah nilai, jika Anda memerlukan keluaran minimal (hanya nomor revisi).

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

F. Igor
sumber
1
Saya mencoba svn 1.9.3, dan perintah di sini adalah svn info --show-item, alih-alih--show item
elopio
0

Solusi yang diposting tidak menangani kasus saat eksternal digunakan.

Jika saya memiliki URL atau copy pekerjaan dengan svn:externalsset properti, eksternal dapat berubah dan dengan demikian revisi terbaru server subversi akan berubah. Tapi revisi terbaru dari copy pekerjaan atau URL hanya akan melaporkan nomor revisi ketika properti svn: externals diubah atau item lebih rendah di jalur URL, yang merupakan perilaku yang diharapkan.

Jadi Anda juga mendapatkan svn:externals properti dan mengulang URL dan memilih revisi ketinggian atau menanyakan URL dasar dari server subversi. Versi yang dilaporkan dari URL dasar akan berisi revisi terbaru untuk SEMUANYA di server.

Jadi, jika Anda menggunakan eksternal, sebaiknya gunakan svn info BASE_URLwhere BASE_URLadalah URL root untuk semua jalur di server subversi.

Nick
sumber
0

Ini hanya akan mendapatkan nomor revisi dari revisi terakhir yang diubah:

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

Saya harap ini membantu.

Kram
sumber
0

$ svn log | head -10 di direktori mana pun yang memiliki .svnfolder

kip2
sumber
0

svn infoatau svnversiontidak akan mempertimbangkan subdirektori, untuk menemukan 'revisi' terbaru dari basis kode langsung, cara hack di bawah ini berhasil bagi saya - mungkin perlu beberapa saat untuk menjalankan:

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

Ini dapat diperoleh dengan menggunakan pustaka "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 harus berisi nomor revisi terbaru dari file tersebut

Naga Ravi Teja Lella
sumber
-1

Sepertinya ada entri di FAQ resmi untuk ini . Kode sumber ada di C tetapi prinsip yang sama berlaku, seperti yang dijelaskan di sini dalam posting milis ini .

matt b
sumber
Ini adalah alat / jawaban yang hebat, tapi menurut saya dia tidak terlalu membutuhkan - saya mengerti itu hanya membutuhkan revisi terbaru jadi mungkin dia bisa memulai membangun jika revisinya saat ini berbeda dari yang sebelumnya sejak dia terakhir memeriksanya. Mungkin saya salah paham.
Tim