2009年2月21日土曜日

【Subversion】Subversionのディレクトリ構造

ソースを読むまえに、実際にSubversionを動かして、各種ファイルの挙動や役割を確認した。

----------------------------
リポジトリの内部構造のまとめ
----------------------------


大枠のディレクトリ構造
----------------------

$ ls -laR
total 16
drwxr-xr-x 9 aka staff 306 2 17 14:17 .
drwxr-xr-x 5 aka staff 170 2 17 15:21 ..
-rw-r--r-- 1 aka staff 229 2 17 14:17 README.txt ; これはおきまりの説明ファイル。無内容。
drwxr-xr-x 5 aka staff 170 2 17 14:17 conf ; 接続(ra)関係の設定情報達が入っている。
drwxr-xr-x 2 aka staff 68 2 17 14:17 dav ; mod_dav_svn用ディレクトリ
drwxr-sr-x 10 aka staff 340 2 17 22:29 db ; リポジトリ本体ここにバージョン管理している情報がある。BDBかFSFSかで異なるのはこのディレクトリの中身のみ。
-r--r--r-- 1 aka staff 2 2 17 14:17 format ; ひとつの整数値。リポジトリレイアウトのバージョン番号。現在は5。これはリポジトリの方式のバージョン番号であり通常のリポジトリ運用では不変である。
drwxr-xr-x 11 aka staff 374 2 17 14:17 hooks ; フックスクリプトの設置場所(テンプレートおよびインストールしたもの)
drwxr-xr-x 4 aka staff 136 2 17 14:17 locks ; ロック管理のためのディレクトリただし1.2.xより上のバージョンでは使用していない。

./conf:
total 24
drwxr-xr-x 5 aka staff 170 2 17 14:17 .
drwxr-xr-x 9 aka staff 306 2 17 14:17 ..
-rw-r--r-- 1 aka staff 684 2 17 14:17 authz
-rw-r--r-- 1 aka staff 309 2 17 14:17 passwd
-rw-r--r-- 1 aka staff 1457 2 17 14:17 svnserve.conf

./dav:
total 0
drwxr-xr-x 2 aka staff 68 2 17 14:17 .
drwxr-xr-x 9 aka staff 306 2 17 14:17 ..

./db:
total 32
drwxr-sr-x 10 aka staff 340 2 17 22:29 .
drwxr-xr-x 9 aka staff 306 2 17 14:17 ..
-rw-r--r-- 1 aka staff 6 2 17 22:29 current ; 3つの整数が並んでいる。"6 5 1"など。頭は最新のリビジョンのようだ。
-r--r--r-- 1 aka staff 2 2 17 14:17 format ; 整数値がひとつ。"2"など。これは不変だ。FSFSのリポジトリ構造のバージョンか?
-rw-r--r-- 1 aka staff 5 2 17 14:17 fs-type ; ファイルシステムタイプ。"fsfs"など。
drwxr-xr-x 9 aka staff 306 2 17 22:29 revprops ; リビジョンに対するプロパティ達。(リビジョン管理されている)
drwxr-xr-x 11 aka staff 374 2 17 22:29 revs ; リビジョンの内容そのもの達。(リビジョン管理されている)
drwxr-xr-x 2 aka staff 68 2 17 22:29 transactions ; トランザクション処理において使われるのか??
-rw-r--r-- 1 aka staff 37 2 17 14:17 uuid ; UUIDがひとつ。不変。どうやらリポジトリの/に対するUUIDのようだ。
-rw-r--r-- 1 aka staff 0 2 17 14:17 write-lock ; 書き込みロックのための何かなのだろう。

./db/revprops:
total 56
drwxr-xr-x 9 aka staff 306 2 17 22:29 .
drwxr-sr-x 10 aka staff 340 2 17 22:29 ..
-rw-r--r-- 1 aka staff 50 2 17 14:17 0
-rw-r--r-- 1 aka staff 110 2 17 15:15 1
-rw-r--r-- 1 aka staff 105 2 17 19:03 2
-rw-r--r-- 1 aka staff 108 2 17 19:30 3
-rw-r--r-- 1 aka staff 109 2 17 19:47 4
-rw-r--r-- 1 aka staff 123 2 17 22:21 5
-rw-r--r-- 1 aka staff 111 2 17 22:29 6

./db/revs:
total 3288
drwxr-xr-x 11 aka staff 374 2 17 22:29 .
drwxr-sr-x 10 aka staff 340 2 17 22:29 ..
-rw-r--r-- 1 aka staff 115 2 17 14:17 0
-rw-r--r-- 1 aka staff 385 2 17 15:15 1
-rw-r--r-- 1 aka staff 418 2 17 19:03 2
-rw-r--r-- 1 aka staff 427 2 17 19:30 3
-rw-r--r-- 1 aka staff 317 2 17 19:47 4
-rw-r--r-- 1 aka staff 1648983 2 17 22:21 5
-rw-r--r-- 1 aka staff 733 2 17 22:29 6

./db/transactions:
total 0
drwxr-xr-x 2 aka staff 68 2 17 22:29 .
drwxr-sr-x 10 aka staff 340 2 17 22:29 ..

./hooks:
total 72
drwxr-xr-x 11 aka staff 374 2 17 14:17 .
drwxr-xr-x 9 aka staff 306 2 17 14:17 ..
-rw-r--r-- 1 aka staff 2015 2 17 14:17 post-commit.tmpl
-rw-r--r-- 1 aka staff 1638 2 17 14:17 post-lock.tmpl
-rw-r--r-- 1 aka staff 2255 2 17 14:17 post-revprop-change.tmpl
-rw-r--r-- 1 aka staff 1567 2 17 14:17 post-unlock.tmpl
-rw-r--r-- 1 aka staff 2934 2 17 14:17 pre-commit.tmpl
-rw-r--r-- 1 aka staff 2038 2 17 14:17 pre-lock.tmpl
-rw-r--r-- 1 aka staff 2764 2 17 14:17 pre-revprop-change.tmpl
-rw-r--r-- 1 aka staff 1979 2 17 14:17 pre-unlock.tmpl
-rw-r--r-- 1 aka staff 2137 2 17 14:17 start-commit.tmpl

./locks:
total 16
drwxr-xr-x 4 aka staff 136 2 17 14:17 .
drwxr-xr-x 9 aka staff 306 2 17 14:17 ..
-rw-r--r-- 1 aka staff 139 2 17 14:17 db-logs.lock
-rw-r--r-- 1 aka staff 139 2 17 14:17 db.lock
$



revsの構造
----------

まず、ファイル名が番号になっているがそれはrevision
番号であり、そのファイルに記載されいていることがそ
のrevisionを構成するのに必要な基本情報である。

基本情報、というのは、まずそのリビジョンを構成する
のに必要なすべてのディレクトリとファイルの配置に関
する情報は含まれている。これは一見冗長なように思え
るが、svn coするときは、常に配置に関する全ての情報
を渡してworking directoryを構成しなければならない
ので、そんなに無駄ではない。

つづいて、配置されるファイルの中身に関してもこのファ
イルの中に記載されている。その記述方法は次のとおり。

まず、新規ファイルなら中身はすべてここに格納される。
既存ファイルの修正ならば、修正が少なければ、既存ファ
イルに対する差分情報だけ記載される。ただし、差分元
がどのリビジョンなのかのidが一緒に記載される。
修正が多い場合は、新規ファイルがごとく全て記載され
る。

大枠の構造は次のとおり。

---- ---- ---- ----
DELTA
... (test-pdf の中身)
ENDREP
DELTA
... (test-file2 の中身)
ENDREP

id: 4.0.r5/1648331
type: file
count: 0
text: 5 0 723003 765532 d76ffb583e9cf560c70768ec5124aa69
cpath: /test-pdf
copyroot: 0 /

id: 3.0.r5/1648459
type: file
count: 0
text: 5 723016 925302 1128184 a59d4991a080313dcd6c5bd3d286e291
cpath: /test-file2
copyroot: 0 /

;; ここまでがファイルの中身情報
;; ここからがこのディレクトリの情報。
;; ディレクトリの中に含まれているものがプロパティ的に
;; 表現されている。また、それぞれの実体がidというかリ
;; ビジョンというかで表現されている。

PLAIN
K 8
test-dir
V 12
dir 2.0.r4/0
K 9
test-file
V 14
file 1.0.r3/70
K 10
test-file2
V 19
file 3.0.r5/1648459
K 8
test-pdf
V 19
file 4.0.r5/1648331
END
ENDREP
id: 0.0.r5/1648756
type: dir
pred: 0.0.r4/146
count: 5
text: 5 1648595 148 148 3ca827292b495f4de066b5732524ca7e
cpath: /
copyroot: 0 /
---- ---- ---- ----


ファイルの中身情報は具体的には次のような形式で記載される。

---- ---- ---- ----
DELTA 1 0 34
SVN&...(binary)...&THIS IS THE SAME YES SAME TEST FILE.

ENDREP
---- ---- ---- ----



revpropsの構造
--------------

revprops/配下のファイルのファイル名についてはrevsと
同様である。

中身は次のようにそのリビジョンのメタ情報がプロパティ
の形式で記載されている。

--------
$ cat test-repos.2/db/revprops/1
K 10
svn:author
V 3
aka
K 8
svn:date
V 27
2009-02-17T06:15:31.009624Z
K 7
svn:log
V 16
A first check in
END
$
--------


----------------------------------------
ワーキングディレクトリの内部構造のまとめ
----------------------------------------

大枠のディレクトリ構造
----------------------

$ ls -laR
total 0
drwxr-xr-x 3 aka staff 102 2 17 15:02 .
drwxr-xr-x 12 aka staff 408 2 17 22:28 ..
drwxr-xr-x 4 aka staff 136 2 17 15:14 test-repos

./test-repos:
total 8
drwxr-xr-x 4 aka staff 136 2 17 15:14 .
drwxr-xr-x 3 aka staff 102 2 17 15:02 ..
drwxr-xr-x 8 aka staff 272 2 17 18:57 .svn ; リポジトリの/ディレクトリに関する情報が入っている。
-rw-r--r-- 1 aka staff 22 2 17 15:10 test-file

./test-repos/.svn:
total 16
drwxr-xr-x 8 aka staff 272 2 17 18:57 .
drwxr-xr-x 4 aka staff 136 2 17 15:14 ..
-r--r--r-- 1 aka staff 381 2 17 18:57 entries ; .svnが設置されているディレクトリの内容に関する情報
-r--r--r-- 1 aka staff 2 2 17 15:02 format ; 整数値ひとつ。"8"など。通常の運用においては不変。
drwxr-xr-x 2 aka staff 68 2 17 15:02 prop-base ; このディレクトリのプロパティについてcheck out時の情報。
drwxr-xr-x 2 aka staff 68 2 17 15:02 props ; このディレクトリのプロパティについての情報。
drwxr-xr-x 3 aka staff 102 2 17 15:15 text-base ; このディレクトリの内容(ファイルとかディレクトリとか)に関するcheck out時の情報。
drwxr-xr-x 5 aka staff 170 2 17 18:57 tmp ; svnがローカルでいろいろ変更を加えるときの作業用一時ディレクトリ。

./test-repos/.svn/prop-base:
total 0
drwxr-xr-x 2 aka staff 68 2 17 15:02 .
drwxr-xr-x 8 aka staff 272 2 17 18:57 ..

./test-repos/.svn/props:
total 0
drwxr-xr-x 2 aka staff 68 2 17 15:02 .
drwxr-xr-x 8 aka staff 272 2 17 18:57 ..

./test-repos/.svn/text-base:
total 8
drwxr-xr-x 3 aka staff 102 2 17 15:15 .
drwxr-xr-x 8 aka staff 272 2 17 18:57 ..
-r--r--r-- 1 aka staff 22 2 17 15:10 test-file.svn-base ; coしたときのファイルそのもの。

./test-repos/.svn/tmp:
total 0
drwxr-xr-x 5 aka staff 170 2 17 18:57 .
drwxr-xr-x 8 aka staff 272 2 17 18:57 ..
drwxr-xr-x 2 aka staff 68 2 17 15:02 prop-base
drwxr-xr-x 2 aka staff 68 2 17 15:02 props
drwxr-xr-x 2 aka staff 68 2 17 15:15 text-base

./test-repos/.svn/tmp/prop-base:
total 0
drwxr-xr-x 2 aka staff 68 2 17 15:02 .
drwxr-xr-x 5 aka staff 170 2 17 18:57 ..

./test-repos/.svn/tmp/props:
total 0
drwxr-xr-x 2 aka staff 68 2 17 15:02 .
drwxr-xr-x 5 aka staff 170 2 17 18:57 ..

./test-repos/.svn/tmp/text-base:
total 0
drwxr-xr-x 2 aka staff 68 2 17 15:15 .
drwxr-xr-x 5 aka staff 170 2 17 18:57 ..
$


entriesの構造
-------------


---- ---- ---- ----
8 ; おそらく.svnのformatの8。
; 空行
dir ; 固定。.svnがいるdirectoryに関する記述開始。
1 ; Working Directoriesにもってきたときの、このdirectoryのリビジョン
file:///Users/aka/scratch/subversion/test/repos/test-repos; リポジトリ上のURI
file:///Users/aka/scratch/subversion/test/repos/test-repos; リポジトリ上のURI
; 空行 ↑なぜ同じものが二行あるのかわからない。
; 空行
; 空行
2009-02-17T06:15:31.009624Z ; 作成日付け?
1 ; 作成時のリビジョン
aka ; 作成ユーザ
; 空行
; 空行
svn:special svn:externals svn:needs-lock ; なんだろ?
; 空行
; 空行
; 空行
; 空行
; 空行
; 空行
; 空行
; 空行
; 空行
; 空行
; 空行
2c7b609e-ce01-4a14-978c-b57bba64d288 ; このdirectoryのUUID
^L ; エントリのdelimiter
test-dir ; エントリの名前
dir ; エントリの種別
; 空行
; 空行
; 空行
add ; WD上でsvn addされた場合はここに目印が入る。
; エントリのdelimiter
test-file; エントリの名前
file ; エントリの種別
3 ; このWDにもってきたときのリビジョン
; 空行
; 空行
; 空行
2009-02-17T10:29:34.000000Z ; なんの日付?
6230f0c4f2f42c6471c6c747e7b29b57 ; ハッシュのようだ
2009-02-17T10:30:14.853118Z ; リビジョン3のコミット時刻
3 ; なんのリビジョン?
aka ; コミットユーザ
^L ; エントリのdelimiter
---- ---- ---- ----



ファイル名文字コード問題
------------------------

ファイル名は次の箇所にあらわれる。

リポジトリ
db/revs/n ; ファイルの中の文字列として

ワーキングディレクトリ
test-file ; ファイルシステム上に。
.svn/entries ; ファイルの中の文字列として。
.svn/text-base/test-file.svn-base ; ファイルシステム上に。

おそらくOSXで不具合がでているのは、このentriesの中
の文字列としての文字コードとtest-fileや
test-file.svn-baseとかをsvnが取り扱うときの文字コー
ドで差異が発生しているのが原因なのだろう。


こつこつ。

0 件のコメント: