如何在不使用任何SVN工具的情况下查看.svn
内的文件,找到工作副本版本(SVN 1.7与1.8)?
答案 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
- 如上所述。
更新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
。