找出SVN工作副本版本(1.7或1.8)

Tho*_* S. 31 svn

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

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数据库文件,它带有一个屏幕截图31user_version-如上面已经提到.

在Text查看器中Subversion 1.8.0 SQLite数据库

更新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)

  • 这就是我尝试过的,但看起来我的SVN 1.7和SVN 1.8工作副本都显示版本12. (3认同)