Как узнать версию рабочей копии (SVN 1.7 vs. 1.8), просмотрев файлы внутри .svn
без использования SVN-инструмента?
Узнайте версию рабочей копии SVN (1,7 или 1,8)
Ответ 1
Мне было интересно об этом некоторое время, и я не мог найти ответ нигде, даже не глядя на базу данных SQLite. Итак, я закончил поиск исходного кода Subversion, где обнаружил, что версия действительно хранится в базе данных, я просто не искал нужного места. Здесь соответствующий фрагмент из 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));
(...)
}
Я даже не знал о выражении PRAGMA
, который, согласно документации SQLite,...
... расширение SQL, специфичное для SQLite, и используется для изменения работы библиотеки SQLite или для запроса библиотеки SQLite для внутренних (не табличных) данных.
Таким образом, предположив, что версия SQLite имеет достаточно современную версию на PATH
, вы можете сделать...
sqlite3 .svn/wc.db "PRAGMA user_version"
... в корне вашей рабочей копии, которая затем будет выдаваться, например, 29
для Subversion 1.7.13 и 31
для Subversion 1.8.0. К сожалению, похоже, что нет версии, сопоставляющей user_version
с версией Subversion, но если вам интересно, в чем состоят собственно изменения формата, вы можете найти их в источниках в subversion/libsvn_wc/wc-metadata.sql
для формата 20 и далее.
Обновление 1: Решение вопроса о том, как получить значение user_version
без исполняемого файла SQLite: вам нужно прочитать DWORD
в смещении 60
в файле базы данных, так как указанном в спецификации формата файла SQLite (см. "1.2 Заголовок базы данных" ).
Обновление 2: Чтобы уточнить, как просмотреть его в средстве просмотра текстовых/двоичных файлов: поскольку текущие номера версий по-прежнему довольно низки и соответствуют одному байту (т.е. они меньше, чем 255
) и a DWORD
имеет длину четыре байта, на данный момент достаточно взглянуть на младший значащий байт - байтовое число 64
. Ниже приведен снимок экрана о том, как он выглядит в файле базы данных SQLite рабочей копии Subversion 1.8.0, который содержит 31
для user_version
- как уже упоминалось выше.
Обновление 3: Я всегда искал способ сделать такие "двоичные запросы" с помощью средства командной строки, чтобы избежать бросания perl или такового в проблему. Вызывает там утилиту * nix для того, что называется od
(и я даже получил ее в своей коллекции портов win32, yay!). od
может получить младший значащий байт user_version
следующим образом:
od -An -j63 -N1 -t dC .svn/wc.db
Это приведет к выводу 31
для Subversion 1.8.0 и т.д.
Ответ 2
Если существует формат .svn/format, тогда прочитайте номер в нем:
Version 7 is SVN 1.3
Version 8 is SVN 1.4
Version 9 is SVN 1.5
Если формат .svn/format не существует, номер версии находится в первой строке в .svn/entries:
Version 10 is SVN 1.6
Version 12 is SVN 1.7
Ответ 3
Невозможно найти документацию по этому поводу, однако короткий ответ - вы можете. Загляните в файл \.svn\format
. Например, число 12
означает, что рабочая копия имеет формат SVN 1.8. Я предполагаю, что если это SVN 1.7, то вы увидите там 11
.