.svn
SVN ツールを使用せずに内部のファイルを調べて、作業コピーのバージョン (SVN 1.7 と 1.8) を確認するにはどうすればよいですか?
3 に答える
私はしばらくこれについて疑問に思っていましたが、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));
(...)
}
SQLiteのドキュメントPRAGMA
によると...
...SQLite に固有の SQL 拡張機能であり、SQLite ライブラリの操作を変更したり、内部 (非テーブル) データについて SQLite ライブラリにクエリを実行したりするために使用されます。
PATH
したがって、あなたができるSQLiteの合理的に最新のバージョンを想定して...
sqlite3 .svn/wc.db "PRAGMA user_version"
...作業コピーのルートに配置すると、たとえば29
Subversion 1.7.13 および31
Subversion 1.8.0 の場合に生成されます。残念ながら、Subversion のバージョンに関連するリストはないようですが、形式の変更が実際にどのようなもので構成されているかに興味がある場合は、形式 20 以降user_version
のソースで説明されているものを見つけることができます。subversion/libsvn_wc/wc-metadata.sql
更新 1: SQLite 実行可能ファイルを使用せずに の値を取得する方法に関する質問への対処: SQLite ファイル形式の仕様で指定されているように、データベース ファイルのat オフセットuser_version
を読み取る必要があります(「1.2 データベース ヘッダー」を参照)。DWORD
60
更新 2:255
テキスト/バイナリ ファイル ビューアーで表示する方法をさらに明確にする: 現在のバージョン番号はまだかなり低く、1 バイトに収まるため (つまり、DWORD
.現時点では、バイト番号である最下位バイトを確認します64
。31
以下は、Subversion 1.8.0 の作業コピーの SQLite データベース ファイルでどのように見えるかを示すスクリーンショットですuser_version
。
更新 3:問題で perl などをスローするのを避けるために、コマンドライン ツールを使用してこのような「バイナリ クエリ」を実行する方法を常に探していました。それを呼び出すための *nix ユーティリティがあることがわかりましたod
(そして、win32 ポートのコレクションにもありました!)。次のようod
に最下位バイトを取得できます。user_version
od -An -j63 -N1 -t dC .svn/wc.db
31
これは、Subversion 1.8.0 などで再び出力されます。
.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
これに関するドキュメントは今のところ見つかりませんが、簡単に言えば、できるということです。\.svn\format
ファイルを覗く。たとえば、数値12
は作業コピーが SVN 1.8 形式であることを意味します。SVN 1.7 であれば、そこに表示されると思います11
。