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

34

如何通过查看.svn内的文件而不使用任何SVN工具来确定工作副本版本(SVN 1.7与1.8)?


1
可能是重复的问题:如何确定 SVN 工作副本布局版本? - William Leara
1
这个问题的更一般的答案已经存在:https://dev59.com/LHM_5IYBdhLWcg3wdzDz - William Leara
可能是重复的问题,参考 *如何确定 SVN 工作副本布局版本?*。 - Peter Mortensen
1
这不是重复的问题,因为上面链接的问题(三次)并没有涵盖1.7与1.8之间的区别 - 除了一个回答会反向链接到这个问题。 - zb226
3个回答

48

我自己也好奇了一段时间,但无法在任何地方找到答案,甚至在查看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中找到它们的描述。
更新1:回答如何在没有SQLite可执行文件的情况下检索user_version值的问题:您需要在数据库文件的偏移量60处读取一个DWORD,如SQLite文件格式规格说明书中所述(见“1.2数据库头”)。 更新2: 更进一步说明如何在文本/二进制文件查看器中查看它:由于当前版本号仍然相对较低,可以用一个字节(即它们小于255)表示,并且DWORD是四个字节长的,因此目前只需要查看最低有效字节-即第64个字节。下面是在Subversion 1.8.0工作副本的SQLite数据库文件中的截图,其中user_version31 - 如上所述。请保留HTML标签。

Subversion 1.8.0 SQLite database in Text viewer

更新3: 我一直在寻找一种使用命令行工具进行“二进制查询”的方法,以避免使用Perl等语言来解决问题。结果发现有一个*nix实用程序叫做od(我甚至将其收入了我的win32端口集合中,耶!)。od可以像这样获取user_version的最低有效字节:
od -An -j63 -N1 -t dC .svn/wc.db

这将再次输出31,适用于Subversion 1.8.0及以上版本。

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

3
我尝试了这个方法,但是我的 SVN 1.7 和 SVN 1.8 工作副本都显示版本12。 - Thomas S.
@ThomasS. 你确定两个工作副本的 SVN 是不同的吗? - Shafeeque
它们之间的格式已从1.7更改为1.8,它们不兼容。 - mliebelt

-4

目前还找不到相关文档,但简短的答案是——可以。查看\.svn\format文件。例如,其中的数字12表示工作副本是SVN 1.8格式。我认为如果它是SVN 1.7,则会在那里看到11


3
不,那不是这样的 - 刚刚尝试了Subversion 1.7.13与1.8.0,它们在“格式”文件中都输出了“12”。 - zb226
1
好的,但这仍然无法区分1.7和1.8的WC-这就是问题所在。您不能使用1.8操作1.7的WC,反之亦然。 - zb226

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接