Узнать версию рабочей копии SVN (1.7 или 1.8)
Как узнать версию рабочей копии (SVN 1.7 против 1.8), взглянув на файлы внутри .svn
без использования какого-либо инструмента SVN?
3 ответа
Я сам некоторое время размышлял об этом и нигде не мог найти ответ, даже глядя на базу данных 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
) и DWORD
длиной четыре байта, на данный момент достаточно взглянуть на младший байт - номер байта 64
, Ниже приведен скриншот того, как это выглядит в файле базы данных SQLite рабочей копии Subversion 1.8.0, который содержит 31
за user_version
- как уже упоминалось выше.
Обновление 3: я всегда искал способ выполнять такие "бинарные запросы" с помощью инструмента командной строки, чтобы избежать появления perl или чего-то подобного в проблеме. Оказывается, для этого есть утилита *nix od
(и я даже получил это в моей коллекции портов win32, ура!). od
может получить младший байт user_version
как это:
od -An -j63 -N1 -t dC .svn/wc.db
Это будет снова выводить 31
для Subversion 1.8.0 и так далее.
Если.svn/format существует, то прочитайте число в нем:
Version 7 is SVN 1.3
Version 8 is SVN 1.4
Version 9 is SVN 1.5
Если.svn/format не существует, тогда номер версии находится в первой строке в.svn / records:
Version 10 is SVN 1.6
Version 12 is SVN 1.7
Пока не могу найти документацию по этому вопросу, однако краткий ответ - вы можете. Заглянуть в \.svn\format
файл. Например, номер 12
там означает, что рабочая копия имеет формат SVN 1.8. Я предполагаю, что если это SVN 1.7, то вы увидите 11
там.