如何在.svn
不使用任何 SVN 工具的情况下通过查看内部文件来找出工作副本版本(SVN 1.7 与 1.8)?
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 文档,该声明是......
...特定于 SQLite 的 SQL 扩展,用于修改 SQLite 库的操作或查询 SQLite 库以获取内部(非表)数据。
PATH
因此,假设你可以做一个合理的最新版本的 SQLite ...
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
偏移量,如SQLite 文件格式规范中所指定(请参阅“1.2 数据库头”)。60
更新 2:进一步阐明如何在文本/二进制文件查看器中查看它:由于当前版本号仍然很低并且适合单个字节(即它们小于255
)并且 aDWORD
是四个字节长,这就足够了现在来看看最不重要的字节——也就是字节数64
。31
下面是它在 Subversion 1.8.0 工作副本的 SQLite 数据库文件中的样子的屏幕截图,该文件带有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/entries 的第一行:
Version 10 is SVN 1.6
Version 12 is SVN 1.7
到目前为止找不到关于此的文档,但简短的回答是 - 你可以。窥视\.svn\format
文件。例如,12
那里的数字表示工作副本是 SVN 1.8 格式。我假设如果它是 SVN 1.7,那么你会11
在那里看到。