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

时间:2013-10-09 07:09:48

标签: svn

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

3 个答案:

答案 0 :(得分: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));
  (...)
}

我甚至都不知道PRAGMA声明,根据SQLite documentation是......

  

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

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

sqlite3 .svn/wc.db "PRAGMA user_version"

...在您的工作副本的根目录中,然后将产生例如Subversion 1.7.13为29,Subversion 1.8.0为31。遗憾的是,似乎没有将user_version与Subversion版本相关联的列表,但如果您对格式更改实际包含的内容感兴趣,可以在subversion/libsvn_wc/wc-metadata.sql的源代码中找到格式为20的内容起。

更新1:解决如何在没有SQLite可执行文件的情况下检索user_version的值的问题:您需要在偏移DWORD处读取60在数据库文件中,如SQLite file format specification中所指定的(参见“1.2数据库标题”)。

更新2:进一步阐明如何在文本/二进制文件查看器中查看它:由于当前版本号仍然很低并且只适合单个字节(即它们小于255)和DWORD长度为四个字节,此时查看最低有效字节(字节数64)就足够了。下面是Subversion 1.8.0工作副本的SQLite数据库文件中的内容截图,该文件带有31 user_version - 如上所述。

Subversion 1.8.0 SQLite database in Text viewer

更新3:我一直在寻找一种使用命令行工具进行此类“二进制查询”的方法,以避免在问题上抛出perl等。 Turns out there's a *nix utility for that called od(我甚至在我的win32端口集合中得到它,是的!)。 od可以获得user_version的最低有效字节,如下所示:

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

这将再次为Subversion 1.8.0输出31,依此类推。

答案 1 :(得分:16)

如果存在.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

答案 2 :(得分:-3)

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