Jak określić najnowszy numer wersji SVN zakorzeniony w katalogu?

Chciałbym rozpocząć oznaczanie moich wdrożonych plików binarnych najnowszym numerem wersji SVN.

Jednakże, ponieważ SVN jest oparty na plikach, a nie na katalogach / projektach, muszę przeskanować wszystkie pliki katalogu i podkatalogu, aby określić najwyższy numer wersji.

Używanie svn info w katalogu głównym nie działa (raportuje tylko wersję tego katalogu, a nie pliki w podkatalogach):

Zastanawiałem się czy jest jakiś skrót używając komendy svn do zrób to. W przeciwnym razie, czy ktoś może zaproponować prosty skrypt, który jest wydajny sieciowo (wolałbym, żeby w ogóle nie trafił na zdalny serwer)?

Rozumiem również, że jednym z alternatywnych sposobów jest przechowywanie Pliku wersji z svn:keywords. To działa (używałem go w innych projektach), ale mam dość zajmowania się upewnianiem się, że plik jest brudny i radzenie sobie z nieuniknionymi konfliktami scalania.

Odpowiedz widzę, że mój problem polega na tym, że nie robię porządnego svn up przed wywołanie svn info w katalogu głównym:

$ svn info
Path: .
...
Last Changed Author: fak
Last Changed Rev: 713
Last Changed Date: 2008-08-29 00:40:53 +0300 (Fri, 29 Aug 2008)

$ svn up
At revision 721.

$ svn info
Path: .
...
Revision: 721
Last Changed Author: reuben
Last Changed Rev: 721
Last Changed Date: 2008-08-31 22:55:22 +0300 (Sun, 31 Aug 2008)
Author: Frank Krueger, 2008-09-11

10 answers

W jedną stronę. Kiedy sprawdzasz kod, spójrz na ostatnią linię wyjścia svn:

$ svn up
...stuff...
Updated to revision 66593.

Bardziej bezpośredni sposób:

$ svn info
Path: .
URL: https://svn.example.com/svn/myproject/trunk
Repository Root: https://svn.example.com/svn/
Repository UUID: d2a7a951-c712-0410-832a-9abccabd3052
Revision: 66593
Node Kind: directory
Schedule: normal
Last Changed Author: bnguyen
Last Changed Rev: 66591
Last Changed Date: 2008-09-11 18:25:27 +1000 (Thu, 11 Sep 2008)
 23
Author: Charles Miller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-11 10:43:00

svnversion wydaje się być najczystszym sposobem na to:

svnversion -c /path/to/your-projects-local-working-copy/. | sed -e 's/[MS]//g' -e 's/^[[:digit:]]*://'

Powyższe polecenie wyczyści wszystkie litery M I S (wskazujące na lokalne modyfikacje lub przełączanie) z wyjścia, a także mniejszy numer wersji w przypadku, gdy svnversion zwróci zakres zamiast tylko jednego numeru wersji(zobacz dokumenty aby uzyskać więcej informacji). Jeśli nie chcesz filtrować wyjścia, wyjmij rurę i sed część tego polecenia.

Jeśli chcesz użyć svn info, musisz użyj argumentu" recursive " (-R), aby pobrać informacje ze wszystkich podkatalogów. Ponieważ wyjście staje się wtedy długą listą, musisz wykonać filtrowanie, aby uzyskać ostatnio zmieniony numer wersji ze wszystkich tych, które są najwyższe:

svn info -R /path/to/your-projects-local-working-copy/. | awk '/^Last Changed Rev:/ {print $NF}' | sort -n | tail -n 1

To, co robi to, że pobiera wszystkie linie zawierające łańcuch "Last Changed Rev", a następnie usuwa wszystko z każdej z tych linii z wyjątkiem ostatniego pola( tj. numeru wersji), następnie sortuje te linie numerycznie i usuwa wszystko oprócz ostatniej linii, co skutkuje tylko najwyższą liczbą wersji. Jeśli używasz systemu Windows, jestem pewien, że możesz to zrobić dość łatwo również w PowerShell, na przykład.

Aby było jasne: powyższe podejście daje rekurencyjny numer ostatniej zmiany tylko ścieżki w repo, którą reprezentuje Twoja lokalna kopia robocza, dla tej lokalnej kopii roboczej, bez uderzania w serwer. Więc jeśli ktoś zaktualizował coś w tej ścieżce do repozytorium serwer po ostatnim svn update, nie będzie odzwierciedlony w tym wyjściu.

Jeśli to, co chcesz, to ostatnia zmiana tej ścieżki na serwerze , możesz zrobić:

svn info /path/to/your-projects-local-working-copy/.@HEAD | awk '/^Last Changed Rev:/ {print $NF}'
 21
Author: hasseg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-08 23:10:52

Duplikat tego pytania . Jak tam napisałem, komenda svnversion jest twoim przyjacielem. Nie trzeba analizować wyjścia, nie trzeba najpierw aktualizować, po prostu wykonuje zadanie.

 7
Author: Sam Stokes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:05

Nie wiem, czy używasz MSBuild(Visual Studio) do budowania swoich binariów. Ale gdybyś: istnieje możliwość połączenia Subverion z MSBuild poprzez MSBuild Community Tasks Project

Oto część naszego skryptu budowania: nasza (C#) aplikacja otrzymuje numer rewizji svn:

  <SvnVersion LocalPath="$(MSBuildProjectDirectory)" ToolPath="installationpath\of\subversion\bin">
     <Output TaskParameter="Revision" PropertyName="Revision" />
  </SvnVersion>
  <Message Text="Version: $(Major).$(Minor).$(Build).$(Revision)"/>
...
    AssemblyVersion="$(Major).$(Minor).$(Build).$(Revision)"
     AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)"

Jan

 2
Author: jan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-11 10:54:47

Odpowiedzi udzielone przez @ Charles Miller i @ Troels Arvin są poprawne - możesz użyć wyjścia svn update lub svn info, ale jak sugerujesz, to ostatnie działa tylko wtedy, gdy repozytorium jest aktualne. Z drugiej strony, nie jestem pewien, jaką wartość jakikolwiek numer wersji będzie dla Ciebie, jeśli część twojego drzewa źródłowego jest na innej wersji niż inna część. Dla mnie to brzmi, jakbyś pracował nad jednorodnym drzewem. Sugerowałbym albo aktualizację przed uruchomieniem info (lub jeśli masz już zaktualizowany dla Twojej kompilacji, jesteś złoty) lub używając svn info URL-to-source.

 2
Author: Blair Conrad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-11 11:00:00

Istnieje program dystrybuowany z Subversion o nazwie svnversion , który robi dokładnie to, co chcesz zrobić. Tak oznaczamy nasze strony internetowe.

 2
Author: David,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-30 14:00:19

"svn info" wyświetli numer wersji roboczej kopii (patrz linia " Revision "w wyjściu z"svn info"). Twój system budowania prawdopodobnie pozwala Ci umieścić odpowiednią część wyjścia "svn info" gdzieś, gdzie będzie ona odzwierciedlona w Twojej aplikacji. Na przykład, możesz określić, że podczas budowania należy utworzyć tymczasowy (nie-wersjonowany) plik, zawierający wyjście z "svn info"; a następnie dołączyć ten plik podczas kompilacji.

 1
Author: Troels Arvin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-11 10:43:47

Jeśli chcesz podać numer rewizji ostatniej zmiany, która została zatwierdzona i używasz systemu Windows bez grep / awk / xargs, oto polecenie do uruchomienia (wiersz poleceń):

X:\trunk>svn info -r COMMITTED | for /F "tokens=2" %r in ('findstr /R "^Revision"') DO @echo %r
67000

svn info -r COMMITTED poda ci ostatnią zmianę w katalogu, w którym aktualnie się znajdujesz:

X:\Trunk>svn info -r COMMITTED
Path: trunk
URL: https://svn.example.com/svn/myproject/trunk
Repository Root: https://svn.example.com/svn/
Repository UUID: d2a7a951-c712-0410-832a-9abccabd3052
Revision: 67400
Node Kind: directory
Last Changed Author: example
Last Changed Rev: 67400
Last Changed Date: 2008-09-11 18:25:27 +1000 (Thu, 11 Sep 2008)

Pętla for uruchamia findstr, aby zlokalizować część Rewizyjną wyjścia z svn info. Wyjście z tego będzie (tego nie zobaczysz):

Revision: 67000

Który następnie dzieli tokeny i zwraca 2nd, aby być echoed out:

67000
 1
Author: KymikoLoco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-02 16:36:28

Dla mnie najlepszym sposobem, aby dowiedzieć się ostatniego numeru wersji trunk / branch, jest pobranie go ze ZDALNEGO ADRESU URL. Ważne jest, aby nie używać działającego katalogu, ponieważ może być przestarzały. Oto fragment z batch ( bardzo nienawidzę; -)):

@for /f "tokens=4" %%f in ('svn info %SVNURL% ^|find "Last Changed Rev:"') do set lastPathRev=%%f

echo trunk rev no: %lastPathRev%

Niemniej jednak mam problem z zakodowaniem tego numeru jako wersji tymczasowej do źródeł zawierających $Rev:$. Problem w tym, że $Rev:$ zawiera plik Rev. no. Więc jeśli trunk Rev no jest większy niż Rev no Pliku wersji, muszę zmodyfikować ten plik "sztucznie" i zatwierdzić go, aby uzyskać poprawną wersję tymczasową (=wersja trunk). To jest szyba! Czy ktoś ma lepszy pomysł? Wielkie dzięki

 1
Author: Maria Ananieva,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-08 23:19:24

To jest śmieszne, ale svn info lub svnversion nie biorą pod uwagę podkatalogów; jest to funkcja zwana roboczą "mieszanymi wersjami" - nazywam ją torturą. Po prostu musiałem znaleźć najnowszą 'rewizję' bazy kodu na żywo i hackowany sposób poniżej zadział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
root@fairware:/home/stage_vancity#
 0
Author: Daniel Sokolowski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-24 20:17:33