2013-10-09 13 views
28

Jak mogę znaleźć wersję roboczą kopii (SVN 1.7 vs. 1.8), przeglądając pliki wewnątrz .svn bez użycia jakiegokolwiek narzędzia SVN?Znajdź wersję roboczą kopii roboczej SVN (1.7 lub 1.8)

+1

możliwy duplikat [Jak określić wersję roboczą kopii roboczej SVN?] (Http://stackoverflow.com/questions/1364618/how-do-i-determine-svn-working-copy-layout-version) –

+1

Istnieje ogólniejsza odpowiedź na to pytanie: http://stackoverflow.com/questions/1364618/how-do-i-determine-svn-working-copy-layout-v ersion –

+0

Możliwy duplikat * [Jak określić wersję layoutu kopii roboczej SVN?] (http://stackoverflow.com/questions/1364618) *. –

Odpowiedz

41

Przez pewien czas zastanawiałem się nad tym i nie mogłem znaleźć nigdzie odpowiedzi, nawet patrząc na bazę danych SQLite. Więc skończyło się na zaglądaniu do kodu źródłowego Subversion, gdzie znalazłem, że wersja jest rzeczywiście przechowywana w bazie danych, po prostu nie szukałem we właściwym miejscu. Oto odnośny fragment z subversion/libsvn_subr/sqlite.c:

svn_error_t * 
svn_sqlite__read_schema_version(int *version, 
           svn_sqlite__db_t *db, 
           apr_pool_t *scratch_pool) 
{ 
    (...) 
    SVN_ERR(prepare_statement(&stmt, db, "PRAGMA user_version;", scratch_pool)); 
    (...) 
} 

nie byłem nawet świadomy rachunku PRAGMA, która, zgodnie z SQLite documentation jest ...

... rozszerzeniem SQL specyficzne dla SQLite i używane do modyfikowania działania biblioteki SQLite lub do przeszukiwania biblioteki SQLite dla wewnętrznych (nie-tabelowych) danych.

Zatem przyjmując wersję przystępnej up-to-date z SQLite na PATH można zrobić ...

sqlite3 .svn/wc.db "PRAGMA user_version" 

... w korzeniu kopii roboczej, która następnie wydajność na przykład 29 dla Subversion 1.7.13 i 31 dla Subversion 1.8.0. Niestety, wydaje się, że nie ma żadnej listy korelującej z user_version z wersją Subversion, ale jeśli interesuje Cię to, z czego faktycznie składają się zmiany formatu, możesz je znaleźć w źródłach w subversion/libsvn_wc/wc-metadata.sql dla formatu 20 i późniejszych.

Aktualizacja 1: Zwracając się pytanie, jak pobrać wartość user_version bez SQLite wykonywalnego: Trzeba czytać DWORD na przesunięcie 60 w pliku bazy danych, jak określono w SQLite file format specification (patrz „1.2 Database Nagłówek").

Aktualizacja 2: Aby wyjaśnić dalej, jak by go zobaczyć w text/widza binarnego pliku: Ponieważ aktualne numery wersji są wciąż dość niskie i zmieścić się w jednym bajcie (czyli są one mniejsze niż 255) oraz DWORD ma długość czterech bajtów, wystarcza w tej chwili sprawdzić najmniej znaczący bajt - który jest bajtem o numerze 64. Poniżej znajduje się zrzut ekranu pokazujący, jak to wygląda w pliku bazy danych SQLite kopii roboczej Subversion 1.8.0, który przenosi 31 dla user_version - jak już wspomniano powyżej.

Subversion 1.8.0 SQLite database in Text viewer

Update 3: Ja zawsze szuka sposobu, aby zrobić takie „kwerend binarne” z narzędzia wiersza polecenia, aby uniknąć rzucania Perl lub takich na problem. Turns out there's a *nix utility for that called od (a nawet dostałem go w mojej kolekcji portów win32, yay!).od można dostać najmniej znaczący bajt user_version tak:

od -An -j63 -N1 -t dC .svn/wc.db 

To znowu wyjście 31 dla Subversion 1.8.0 i tak dalej.

-2

Nie można znaleźć dokumentacji na ten temat, jednak krótka odpowiedź brzmi - możesz. Zajrzyj do pliku \.svn\format. Na przykład numer 12 oznacza, że ​​kopia robocza ma format SVN 1.8. Zakładam, że jeśli jest to SVN 1.7, to zobaczysz tam 11.

+3

-1 Nie, to nie to - po prostu wypróbowałem go z Subversion 1.7.13 vs 1.8.0 i oba wyprowadzają '12' w pliku' format'. – zb226

+1

Może to wynikać z tego, że te wersje mają ten sam format repo ... – prodigitalson

+1

OK, ale to nadal nie pomaga odróżnić 1,7 od 1,8 WC - o to właśnie chodziło pytanie. Nie można operować na 1.7 WC z 1.8 i na odwrót. – zb226

15

Jeśli .svn/format istnieje, a następnie odczytać numer w nim:

Version 7 is SVN 1.3 
Version 8 is SVN 1.4 
Version 9 is SVN 1.5 

Jeśli .svn/format nie istnieje następnie numer wersji jest na pierwszej linii w .svn/wpisów:

Version 10 is SVN 1.6 
Version 12 is SVN 1.7 
+3

Próbowałem tego, ale wygląda na to, że moje kopie robocze SVN 1.7 i SVN 1.8 pokazują wersję 12. –

+0

@ThomasS. czy jesteś pewien, że obie kopie robocze są różne? – Shafeeque

+0

Są one, format został zmieniony z 1,7 na 1,8 i są one wzajemnie niezgodne. – mliebelt

Powiązane problemy