Otrzymujesz numer ostatniej wersji w SVN?

104

Używając PHP, Perl lub Python (najlepiej PHP), potrzebuję sposobu, aby zapytać o bazę danych SVN i znaleźć numer ostatniej wersji przesłany do SVN. Nie potrzebuję niczego innego. To musi być mało intensywne (więc robię to co 5 minut jako zadanie cron; nie powinno to wpływać na wydajność SVN).

SVN znajduje się w moim intranecie, ale nie na moim komputerze.

Mam zainstalowany SVN, ale nie mam zainstalowanych powiązań dla PHP / Perl / Python. Używam systemu Windows XP, ale wolałbym rozwiązanie niezależne od platformy, które może również działać w systemie Linux. Jeśli masz rozwiązanie tylko dla systemu Linux (lub tylko XP), byłoby to również pomocne.

Coltin
źródło
2
"svn info --show-item revision" poda bieżącą wersję, do której aktualizowany jest bieżący katalog.
GreatAndPowerfulOz
2
$ svn info --show-item revision svn: invalid option: --show-itemUżywanie Apache Subversion 1.8.16 (r1740329) skompilowane 26 kwietnia 2016 r. Próbowano również z CollabNet 1.6.11 (r934486) skompilowane 6 marca 2014 r.
IceArdor
W związku z tymi komentarzami zapoznaj się svn help infoz opcjami prawnymi dotyczącymisvn info
XavierStuvw,
@IceArdor Używam SVN v1.9.5 i --show-itemjest dostępny
icc97

Odpowiedzi:

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

Możesz uzyskać dane wyjściowe w XML w następujący sposób:

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

Jeśli wystąpi błąd, wyjście zostanie skierowane na stderr. Aby uchwycić stderr w swoim wyjściu, użyj w ten sposób:

$output = `svn info $url 2>&1`;
Daniel X Moore
źródło
2
Jeśli wystąpi błąd, wyjście zostanie skierowane na stderr. Aby przechwycić stderr w swoim wyjściu, użyj w ten sposób: $ output = svn info $url 2>&1;
Daniel X Moore
3
Dzięki! Użyłem --xml do zbudowania własnego narzędzia C #, które pomaga mi w generowaniu atrybutu AssemblyFileVersion. PS: Angielski nie jest moim głównym językiem i zdziwiło mnie słowo „w ten sposób”, którego nigdy wcześniej nie słyszałem. Przy okazji, jego pochodzenie jest dość zabawne: por. ( En.wiktionary.org/wiki/thusly ); czy użyłeś go celowo (kalambur?), czy też często używasz go w ten sposób zamiast w ten sposób?
odalet
7
svn info $url | grep 'Last Changed Rev' | awk '{ print $4; }'
Cobra_Fast
7
@Cobra_Fast, nie potrzebujesz potoku, możesz zrobić svn info --show-item revision $urllub svn info --show-item last-changed-revision $url.
cp.engr
2
@ cp.engr Wydaje mi się, że to tylko od czasu SVN w wersji 1.9 lub nowszej - to znaczy mam go w wersji 1.9.5 i nie ma go w wersji 1.8.6
icc97
131

Jeśli chcesz przeanalizować lokalną kopię roboczą, najlepszym narzędziem jest svnversion, które jest dostarczane z Subversion i generuje dane wyjściowe podobne do 968:1000M. Dokumentacja mówi:

Numer wersji będzie pojedynczym numerem, jeśli kopia robocza jest wersją pojedynczą, niezmodyfikowaną, niezmienioną iz adresem URL zgodnym z argumentem TRAIL_URL. Jeśli kopia robocza jest nietypowa, numer wersji będzie bardziej złożony:

4123:4168     mixed revision working copy
4168M         modified working copy
4123S         switched working copy
4123:4168MS   mixed revision, modified, switched working copy
sth
źródło
2
zgodził się, znacznie lepiej niż informacje svn
Richard
32
svnversion jest przeznaczony dla lokalnych kopii roboczych i nie ma dostępu do repozytorium w intranecie, jak określono w pytaniu.
Daniel X Moore
5
Dla tych, którzy nie są zaznajomieni z svnversion, jest to część standardowego klienta wiersza poleceń, a oto strona podręcznika: svnbook.red-bean.com/nightly/en/svn.ref.svnversion.re.html .
Michael Sorens
45

svn info -r HEAD

W ten sposób otrzymasz najnowszy numer wersji na początku repozytorium.

Jest kilka fajnych postów na blogu na temat integracji numerów subversion ze skryptem kompilacji:

Nick Haddad
źródło
To najprostszy sposób, ponieważ nie musisz najpierw sprawdzać adresu URL repozytorium. Dzięki!
derFunk
Otrzymałem błędy przy użyciu cudzysłowów wokół HEAD, więc powinno byćsvn info -r HEAD
icc97
39

To powinno działać w Bash, z katalogu roboczego. Użyłem go w systemie Windows z zainstalowanymi unixutils :

svn info |grep Revision: |cut -c11-
Blorgbeard wyszedł
źródło
Działa, jeśli umieścisz adres URL repozytorium w miejscu, w którym masz% *, cokolwiek przez to rozumiesz. Niezła składnia cut, wcześniej tego nie znałam.
ypnos
1
Uwaga: ponieważ brakuje tej opcji -rHEAD, to zwróci wersję zatwierdzenia dla żądanego pliku lub katalogu. Może to nie być ostatnia ogólna zmiana (ponieważ inne zmiany mogły zostać wprowadzone w innym miejscu lub w poddrzewie).
Mr Fooz
4
Nie działa to również w przypadku zlokalizowanych wersji SVN (w języku polskim powinno to być | cut -c9-).
zgoda
2
to jest powód, dla którego zdecydowanie nie lubię zlokalizowanych narzędzi programistycznych wiersza poleceń; zero korzyści, mnóstwo problemów. Zwykle usuwam lokalizacje właśnie z tego powodu.
gimpf
8
Przekazanie separatora zamiast liczby znaków działa najlepiej w przypadku zlokalizowanej treści, na przykład svn info | grep Revision | cut -d " " -f 2zwróci drugi ciąg po podzieleniu go spacjami.
Butifarra
34

Powinno działać:

svnlook youngest <repo-path>

Zwraca pojedynczy numer wersji.

Magentus
źródło
15

Aby naprawdę uzyskać numer najnowszej wersji („wersja główna”) w zdalnym repozytorium, użyj tego:

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

Wyjścia na przykład:

35669
derFunk
źródło
12

Uwaga dotycząca uzyskania najnowszego numeru wersji:

Powiedz, że cd-ed w skorygowanym podkatalogu ( MyProjectDir). Następnie, jeśli zadzwonię svnversion:

$ svnversion .
323:340

... Otrzymuję „ 323:340”, co chyba oznacza: „ masz tutaj pozycje od wersji 323 do 340 ”.

 

Następnie, jeśli zadzwonię 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)

... otrzymuję 323jako wersję „ ” - która jest w rzeczywistości najniższą wersją zgłoszonych przez svnversion!

 

Następnie możemy użyć svn infow trybie rekurencyjnym, aby uzyskać więcej informacji z katalogu lokalnego:

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

... (usuń, grepaby zobaczyć więcej szczegółów).

 

Wreszcie, co zrobić, gdy chcemy sprawdzić, jaka jest ostatnia wersja repozytorium online (w tym przypadku @ server.com)? Następnie ponownie wydajemy svn info, ale z -r HEAD(zwróć uwagę na różnicę między -Ropcją kapitałową poprzednio a małymi literami -rteraz):

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

Interesujące jest to, że - svn infonadal odnosi się do bieżącego podkatalogu ( MyProjectDir), jednak ścieżka online jest zgłaszana jako MyProjectDir(w przeciwieństwie do .przypadku lokalnego) - a zgłoszona wersja online jest najwyższa ( 340- w przeciwieństwie do najniższej, 323zgłoszonej lokalnie).

sdaau
źródło
9
  • Począwszy od Subversion 1.9, możesz użyć opcji --show-item, aby uzyskać wartość jednego z pól wyniku svn infopolecenia. To polecenie wyświetli tylko numer wersji:

    svn info --show-item=revision <URL-to-repository>
    
  • Uzyskaj dane wyjściowe w formacie XML w formacie svn za pomocą --xmlopcji i użyj programu PowerShell, aby uzyskać numer wersji. Oto prosty przykład:

    [xml]$svninfo = svn info <REPOSITORY-URL> --xml -r HEAD
    $latestrevnum = $svninfo.info.entry.revision
    $latestrevnum
    
  • Korzystając z VisualSVN Server 3.4 lub nowszego, możesz uzyskać liczbę wersji w repozytorium, uruchamiając następujące polecenia:

    $repo = Get-SvnRepository <REPOSITORY-NAME>

    $repo.Revisions

    Aby uzyskać więcej informacji, zobacz informacje dotyczące Get-SvnRepositorypoleceń cmdlet programu PowerShell .

bahrep
źródło
7

Myślę, że szukasz

svn info -r HEAD

Czy możesz połączyć się z tym poleceniem?

Prawdopodobnie będziesz musiał również podać dane logowania do repozytorium.

Tim
źródło
Myślę, że to musi być svn info -r HEAD
Stephen
-r można wtedy łatwo pominąć.
ypnos
Dobrze - nie określiłem opcji -r - to było po prostu dla niego, aby znaleźć to, czego potrzebuje i zacząć korzystać z pomocy / książki.
Tim
4

Ktoś inny pokonał mnie w zamieszczeniu odpowiedzi na temat svnversion, co jest zdecydowanie najlepszym rozwiązaniem, jeśli masz kopię roboczą (IIRC, nie działa z adresami URL). Dodam jeszcze: jeśli jesteś na serwerze obsługującym SVN, najlepszym sposobem jest użycie svnlookpolecenia. To jest polecenie, którego używasz podczas pisania skryptu przechwytującego, aby sprawdzić repozytorium (a nawet bieżącą transakcję, w przypadku punktów zaczepienia przed zatwierdzeniem). Możesz wpisać svnlook helpszczegóły. Prawdopodobnie chcesz użyć svnlook youngestpolecenia. Zauważ, że wymaga bezpośredniego dostępu do katalogu repozytorium, więc musi być używany na serwerze.

rmeador
źródło
2
nickh@SCLLNHENRY:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svnversion
12354

Lub

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

Lub

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

Możesz użyć jednego z poleceń:

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
źródło
2

Jeśli chcesz naprawdę krótki:

svn info ^/

Notacja daszek jest skrótem dla „URL katalogu głównego repozytorium”.

Sanghyun Lee
źródło
2

Jeśli masz nieszczęście, że musisz to zrobić z pliku wsadowego systemu Windows, oto inkantacja, której szukasz:

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%

To uruchamia "svn info", iterując przez każdą linię wygenerowanego wyjścia. Używa dwukropka jako separatora między pierwszym a drugim znacznikiem w wierszu. Gdy pierwszy token to „Wersja”, ustawia zmienną środowiskową REV na drugi token.

yoyo
źródło
1
możesz również użyć FINDSTR:FOR /F "tokens=2" %%i IN ('svn info ^| FINDSTR Revision:') DO SET revision=%%i
icc97
zobacz tę drugą odpowiedź SO jako podstawę tego
icc97
2

Szukasz połączenia podobnego do wywołania wiersza poleceń

svn info URL

Wygląda na to, że jest to możliwe przy użyciu biblioteki pysvn i jest przepis który powinien pomóc Ci zacząć. Nie jestem pewien, czy jest coś podobnego dla PHP.

Jeśli musisz samodzielnie wywołać plik binarny SVN, upewnij się, że używasz --xmlparametru, aby uzyskać wynik w formacie XML. Powinno to być łatwiejsze do przeanalizowania niż dane wyjściowe wiersza polecenia.

Sander Rijken
źródło
Używam subprocess.check_outputw Pythonie, aby uniknąć kolejnego wywołania biblioteki. Jeśli tylko sprawdzasz numery wersji / ściągasz najnowsze kopie, prostsze jest użycie svn z wiersza poleceń za pośrednictwem subprocess. Teraz, jeśli robisz automatyczne zameldowania i
łączysz
2

Możesz użyć formatu wyjściowego XML, na przykład:

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

Przykład: używając numeru wersji

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

Możesz wypróbować poniższe polecenie:

svn info -r 'HEAD' | grep Revision: | awk -F' ' '{print $2}'
mrajiv
źródło
1

Tylko svn infow BASH podasz wszystkie szczegóły

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

Otrzymasz z tego REWIZJĘ

D_D
źródło
1

Najprostszym i najczystszym sposobem na to (właściwie svn 1.9, wydany 2015) jest użycie:

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

Dane wyjściowe to numer ostatniej wersji (najmłodszej) dla SVNURL lub numer bieżącej wersji kopii roboczej SVNPATH. --no-newlineJest opcjonalny, nakazuje svn, aby nie emitować nowej linii kosmetycznej ( \n) po wartości, jeśli trzeba wyjście minimalna (tylko numer wersji).

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

F.Igor
źródło
1
Próbowałem na svn 1.9.3, a tutaj polecenie jest svn info --show-itemzamiast--show item
elopio
0

Opublikowane rozwiązania nie obsługują przypadku, gdy używane są zewnętrzne.

Jeśli mam adres URL lub kopię roboczą z rozszerzeniem svn:externals ustawioną właściwością, elementy zewnętrzne mogą się zmienić, a zatem ostatnia wersja serwera subversion ulegnie zmianie. Jednak najnowsza wersja kopii roboczej lub adresu URL poda numer wersji tylko wtedy, gdy właściwość svn: externals uległa zmianie lub jakikolwiek element niżej w ścieżce adresu URL, co jest oczekiwanym zachowaniem.

Więc albo dostajesz svn:externals właściwość i iterujesz po adresach URL i wybierasz wersję wysokości lub odpytujesz podstawowy adres URL z serwera subversion. Wersja raportowana z podstawowego adresu URL będzie zawierała najnowszą wersję WSZYSTKIEGO na serwerze.

Tak więc, jeśli używasz zewnętrznych, najlepiej jest użyć svn info BASE_URLgdzie BASE_URLjest głównym adresem URL dla wszystkich ścieżek na serwerze subversion.

Nacięcie
źródło
0

Otrzymasz tylko numer wersji ostatniej zmienionej wersji:

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

Mam nadzieję, że to pomoże.

Kram
źródło
0

$ svn log | head -10 w dowolnym katalogu, w którym znajduje się .svnfolder

kip2
źródło
0

svn infolub svnversionnie weźmie pod uwagę podkatalogów, aby znaleźć najnowszą `` wersję '' aktualnej bazy kodów, zhakowany sposób poniżej działał dla mnie - uruchomienie może trochę potrwać:

repo_root$ find ./ | xargs -l svn info  | grep 'Revision: ' | sort
...
Revision: 86
Revision: 86
Revision: 89
Revision: 90
$
Daniela Sokołowskiego
źródło
0

Można to uzyskać za pomocą biblioteki „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 powinien zawierać najnowszy numer wersji pliku

Naga Ravi Teja Lella
źródło
-1

Wygląda na to, że w oficjalnym FAQ jest wpis na ten temat . Kod źródłowy jest w C, ale obowiązuje ta sama zasada, jak opisano tutaj w tym poście na liście mailingowej .

matowe b
źródło
To świetne narzędzie / odpowiedź, ale nie sądzę, żeby potrzebował aż tak dużo - zrozumiałem, że potrzebuję tylko najnowszej wersji, więc może może rozpocząć kompilację, jeśli jego bieżąca wersja różni się od poprzedniej od czasu ostatniego sprawdzenia. Może źle zrozumiałem.
Tim
-1

Aktualizacja: Subversion 1.9 będzie obsługiwać nowe polecenie „svn youngest”, które wyświetla tylko najnowszy numer wersji. Różnica w stosunku do „svnlook youngest” polega na tym, że „svn youngest” działa również zdalnie.

http://subversion.tigris.org/issues/show_bug.cgi?id=4299

Markus Kuhn
źródło