33

如何在.svn不使用任何 SVN 工具的情况下通过查看内部文件来找出工作副本版本(SVN 1.7 与 1.8)?

4

3 回答 3

47

我自己想知道这个问题有一段时间了,在任何地方都找不到答案,甚至没有通过查看 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 文档,该声明是......

...特定于 SQLite 的 SQL 扩展,用于修改 SQLite 库的操作或查询 SQLite 库以获取内部(非表)数据。

PATH因此,假设你可以做一个合理的最新版本的 SQLite ...

sqlite3 .svn/wc.db "PRAGMA user_version"

...在您的工作副本的根目录中,然后将产生例如29Subversion 1.7.13 和31Subversion 1.8.0。不幸的是,似乎没有user_version与 Subversion 版本相关的列表,但如果您对格式更改的实际内容感兴趣,您可以在subversion/libsvn_wc/wc-metadata.sql格式 20 及以后的源中找到它们的描述。

更新 1:解决如何在user_version没有 SQLite 可执行文件的情况下检索值的问题:您需要读取数据库文件中的DWORD偏移量,如SQLite 文件格式规范中所指定(请参阅“1.2 数据库头”)。60

更新 2:进一步阐明如何在文本/二进制文件查看器中查看它:由于当前版本号仍然很低并且适合单个字节(即它们小于255)并且 aDWORD是四个字节长,这就足够了现在来看看最不重要的字节——也就是字节数6431下面是它在 Subversion 1.8.0 工作副本的 SQLite 数据库文件中的样子的屏幕截图,该文件带有user_version- 如上所述。

文本查看器中的 Subversion 1.8.0 SQLite 数据库

更新 3:我一直在寻找一种使用命令行工具执行此类“二进制查询”的方法,以避免在问题上抛出 perl 等。原来有一个用于调用的 *nix 实用程序od(我什至在我的 win32 端口集合中找到了它,耶!)。od可以得到这样的最低有效字节user_version

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

这将再次31为 Subversion 1.8.0 等输出。

于 2013-10-09T12:40:16.203 回答
17

如果 .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
于 2013-10-09T12:47:01.453 回答
-4

到目前为止找不到关于此的文档,但简短的回答是 - 你可以。窥视\.svn\format文件。例如,12那里的数字表示工作副本是 SVN 1.8 格式。我假设如果它是 SVN 1.7,那么你会11在那里看到。

于 2013-10-09T10:48:41.563 回答