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.
$ svn info --show-item revision
svn: invalid option: --show-item
Uż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.svn help info
z opcjami prawnymi dotyczącymisvn info
--show-item
jest dostępnyOdpowiedzi:
Możesz uzyskać dane wyjściowe w XML w następujący sposób:
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:
źródło
svn info $url 2>&1
;svn info $url | grep 'Last Changed Rev' | awk '{ print $4; }'
svn info --show-item revision $url
lubsvn info --show-item last-changed-revision $url
.Jeśli chcesz przeanalizować lokalną kopię roboczą, najlepszym narzędziem jest
svnversion
, które jest dostarczane z Subversion i generuje dane wyjściowe podobne do968:1000M
. Dokumentacja mówi:źródło
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:
źródło
svn info -r HEAD
To powinno działać w Bash, z katalogu roboczego. Użyłem go w systemie Windows z zainstalowanymi unixutils :
źródło
svn info | grep Revision | cut -d " " -f 2
zwróci drugi ciąg po podzieleniu go spacjami.Powinno działać:
Zwraca pojedynczy numer wersji.
źródło
Aby naprawdę uzyskać numer najnowszej wersji („wersja główna”) w zdalnym repozytorium, użyj tego:
Wyjścia na przykład:
źródło
Uwaga dotycząca uzyskania najnowszego numeru wersji:
Powiedz, że
cd
-ed w skorygowanym podkatalogu (MyProjectDir
). Następnie, jeśli zadzwonięsvnversion
:... Otrzymuję „
323:340
”, co chyba oznacza: „ masz tutaj pozycje od wersji 323 do 340 ”.Następnie, jeśli zadzwonię
svn info
:... otrzymuję
323
jako wersję „ ” - która jest w rzeczywistości najniższą wersją zgłoszonych przezsvnversion
!Następnie możemy użyć
svn info
w trybie rekurencyjnym, aby uzyskać więcej informacji z katalogu lokalnego:... (usuń,
grep
aby 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 wydajemysvn info
, ale z-r HEAD
(zwróć uwagę na różnicę między-R
opcją kapitałową poprzednio a małymi literami-r
teraz):Interesujące jest to, że -
svn info
nadal odnosi się do bieżącego podkatalogu (MyProjectDir
), jednak ścieżka online jest zgłaszana jakoMyProjectDir
(w przeciwieństwie do.
przypadku lokalnego) - a zgłoszona wersja online jest najwyższa (340
- w przeciwieństwie do najniższej,323
zgłoszonej lokalnie).źródło
Począwszy od Subversion 1.9, możesz użyć opcji --show-item, aby uzyskać wartość jednego z pól wyniku
svn info
polecenia. To polecenie wyświetli tylko numer wersji:Uzyskaj dane wyjściowe w formacie XML w formacie svn za pomocą
--xml
opcji i użyj programu PowerShell, aby uzyskać numer wersji. Oto prosty przykład: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-SvnRepository
poleceń cmdlet programu PowerShell .źródło
Myślę, że szukasz
Czy możesz połączyć się z tym poleceniem?
Prawdopodobnie będziesz musiał również podać dane logowania do repozytorium.
źródło
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życiesvnlook
polecenia. 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 help
szczegóły. Prawdopodobnie chcesz użyćsvnlook youngest
polecenia. Zauważ, że wymaga bezpośredniego dostępu do katalogu repozytorium, więc musi być używany na serwerze.źródło
Lub
Lub
źródło
Możesz użyć jednego z poleceń:
źródło
Jeśli chcesz naprawdę krótki:
Notacja daszek jest skrótem dla „URL katalogu głównego repozytorium”.
źródło
Jeśli masz nieszczęście, że musisz to zrobić z pliku wsadowego systemu Windows, oto inkantacja, której szukasz:
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.
źródło
FOR /F "tokens=2" %%i IN ('svn info ^| FINDSTR Revision:') DO SET revision=%%i
Szukasz połączenia podobnego do wywołania wiersza poleceń
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
--xml
parametru, aby uzyskać wynik w formacie XML. Powinno to być łatwiejsze do przeanalizowania niż dane wyjściowe wiersza polecenia.źródło
subprocess.check_output
w 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średnictwemsubprocess
. Teraz, jeśli robisz automatyczne zameldowania iMożesz użyć formatu wyjściowego XML, na przykład:
Przykład: używając numeru wersji
źródło
Możesz wypróbować poniższe polecenie:
źródło
Tylko
svn info
w BASH podasz wszystkie szczegółyOtrzymasz z tego REWIZJĘ
źródło
Najprostszym i najczystszym sposobem na to (właściwie svn 1.9, wydany 2015) jest użycie:
Dane wyjściowe to numer ostatniej wersji (najmłodszej) dla SVNURL lub numer bieżącej wersji kopii roboczej SVNPATH.
--no-newline
Jest opcjonalny, nakazujesvn
, 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
źródło
svn info --show-item
zamiast--show item
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_URL
gdzieBASE_URL
jest głównym adresem URL dla wszystkich ścieżek na serwerze subversion.źródło
Otrzymasz tylko numer wersji ostatniej zmienionej wersji:
Mam nadzieję, że to pomoże.
źródło
$ svn log | head -10
w dowolnym katalogu, w którym znajduje się.svn
folderźródło
svn info
lubsvnversion
nie 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ć:źródło
Można to uzyskać za pomocą biblioteki „SVN” :
Head_revision powinien zawierać najnowszy numer wersji pliku
źródło
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 .
źródło
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
źródło