2013-10-09 137 views
28

如何在不使用任何SVN工具的情況下查看.svn中的文件來找到工作副本版本(SVN 1.7與1.8)?找出SVN工作副本版本(1.7或1.8)

+1

可能重複[如何確定SVN工作副本佈局版本?](http://stackoverflow.com/questions/1364618/how-do-i-determine-svn-working-copy-layout-version ) –

+1

此問題的更一般的答案已經存在:http://stackoverflow.com/questions/1364618/how-do-i-determine-svn-working-copy-layout-v ersion –

+0

可能重複的* [如何確定SVN工作副本佈局版本?](http://stackoverflow.com/questions/1364618)*。 –

回答

41

我很想知道這一段時間,並且無法在任何地方找到答案,甚至無法通過查看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.8.0的Subversion 1.7.13和3129。不幸的是,似乎沒有與Subversion版本user_version相關的列表,但如果您對格式更改的實際內容感興趣,可以在格式20之後的subversion/libsvn_wc/wc-metadata.sql的源文件中找到它們。

更新1:解決如何檢索user_version值沒有SQLite的可執行文件的問題:你需要閱讀DWORD在數據庫文件偏移60,如SQLite file format specification規定(見「1.2數據庫頭「)。

更新2:爲了進一步闡明如何在一個文本/二進制文件查看器來查看它:由於目前的版本號仍然在一個單字節相當低,並配合(即他們比255小)和DWORD的長度爲4個字節,此時查看最低有效字節即爲字節號64就足夠了。下面是它在Subversion 1.8.0工作副本的SQLite數據庫文件中的樣子的屏幕截圖,其中包含31user_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 

這將再次輸出31 Subversion版本1.8.0等。

-2

到目前爲止找不到相關文檔,但簡短的答案是 - 您可以。查看\.svn\format文件。例如,12表示工作副本是SVN 1.8格式。我假設如果它是SVN 1.7,那麼你會在那裏看到11

+3

-1不是那樣 - 只是用Subversion 1.7.13和1.8.0試過了,它們都在格式文件中輸出了12。 – zb226

+1

這可能是因爲這些版本實際上共享相同的回購格式... – prodigitalson

+1

好的,但這仍然無法區分1.7和1.8 WC - 這是問題所在。在1.8和1.8之間,你不能使用1.7 WC。 – zb226

15

如果的.svn /格式存在,那麼閱讀它的數量:

Version 7 is SVN 1.3 
Version 8 is SVN 1.4 
Version 9 is SVN 1.5 

如果的.svn /格式不存在,則版本號是在的.svn /條目的第一行:

Version 10 is SVN 1.6 
Version 12 is SVN 1.7 
+3

這就是我所嘗試的,但它看起來像我的SVN 1.7和SVN 1.8工作副本都顯示版本12. –

+0

@ThomasS。你確定這兩個工作副本是不同的SVN? – Shafeeque

+0

它們是,格式從1.7更改爲1.8,並且它們互不兼容。 – mliebelt