zb2*_*226 45
我自己一直在想这个问题并且无法在任何地方找到答案,甚至没有查看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));
(...)
}
Run Code Online (Sandbox Code Playgroud)
我根本不知道这个PRAGMA声明,根据SQLite文档,它是......
...特定于SQLite的SQL扩展,用于修改SQLite库的操作或查询SQLite库以获取内部(非表)数据.
因此,假设有一个合理的最新SQLite版本就PATH可以了...
sqlite3 .svn/wc.db "PRAGMA user_version"
Run Code Online (Sandbox Code Playgroud)
...在工作副本的根目录中,然后将产生例如29Subversion 1.7.13和31Subversion 1.8.0.不幸的是,似乎没有user_version与Subversion版本相关的列表,但如果您对格式更改实际包含的内容感兴趣,您可以在subversion/libsvn_wc/wc-metadata.sql格式20之后的源代码中找到它们.
更新1:解决如何在user_version没有SQLite可执行文件的情况下检索值的问题:您需要读取数据库文件中的DWORDat偏移量60,如SQLite文件格式规范中所指定的(请参阅"1.2数据库标头").
更新2:进一步阐明如何在文本/二进制文件查看器中查看它:由于当前版本号仍然很低并且适合单个字节(即它们小于255)并且a DWORD是四个字节长,因此足够此时要查看最低有效字节 - 即字节数64.下面是它看起来像在颠覆1.8.0工作副本的SQLite数据库文件,它带有一个屏幕截图31为user_version-如上面已经提到.

更新3:我一直在寻找一种方法来使用命令行工具进行这样的"二进制查询",以避免在问题上抛出perl等.事实证明,有一个*nix实用程序被调用od(我甚至在我的win32端口集合中得到它,是的!).od可以得到user_version像这样的最低有效字节:
od -An -j63 -N1 -t dC .svn/wc.db
Run Code Online (Sandbox Code Playgroud)
这将再次输出31Subversion 1.8.0,依此类推.
Sha*_*que 16
如果存在.svn/format,则读取其中的数字:
Version 7 is SVN 1.3
Version 8 is SVN 1.4
Version 9 is SVN 1.5
Run Code Online (Sandbox Code Playgroud)
如果.svn/format不存在,则版本号位于.svn/entries的第一行:
Version 10 is SVN 1.6
Version 12 is SVN 1.7
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
33932 次 |
| 最近记录: |