如何通过查看.svn
内的文件而不使用任何SVN工具来确定工作副本版本(SVN 1.7与1.8)?
如何通过查看.svn
内的文件而不使用任何SVN工具来确定工作副本版本(SVN 1.7与1.8)?
我自己也好奇了一段时间,但无法在任何地方找到答案,甚至在查看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"
user_version
的SQLite数据库文件,例如Subversion 1.7.13的版本号为29
,Subversion 1.8.0的版本号为31
。不幸的是,似乎没有列表将user_version
与Subversion版本相对应,但如果您想了解格式更改的实际内容,则可以在20版本及以上的subversion/libsvn_wc/wc-metadata.sql
中找到它们的描述。user_version
值的问题:您需要在数据库文件的偏移量60处读取一个DWORD
,如SQLite文件格式规格说明书中所述(见“1.2数据库头”)。
更新2: 更进一步说明如何在文本/二进制文件查看器中查看它:由于当前版本号仍然相对较低,可以用一个字节(即它们小于255
)表示,并且DWORD
是四个字节长的,因此目前只需要查看最低有效字节-即第64
个字节。下面是在Subversion 1.8.0工作副本的SQLite数据库文件中的截图,其中user_version
为31
- 如上所述。请保留HTML标签。
更新3: 我一直在寻找一种使用命令行工具进行“二进制查询”的方法,以避免使用Perl等语言来解决问题。结果发现有一个*nix实用程序叫做od
(我甚至将其收入了我的win32端口集合中,耶!)。od
可以像这样获取user_version
的最低有效字节:od -An -j63 -N1 -t dC .svn/wc.db
31
,适用于Subversion 1.8.0及以上版本。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
。