S-JIS[2008-12-23/2011-09-23] 変更履歴

Subversionインストール・設定

WindowsXP/Windows7にSubversion(SVN)をインストールして設定を行うメモです。


インストール

Subversionのサイトでアーカイブが配布されているが、基本的にソースという形をとっているらしい。
Windows版実行ファイル(のインストーラー形式)はCollabNetのダウンロードページからダウンロードできるが、ユーザー登録が必要。


Subversionのサイトからダウンロードしてインストールすることも出来る。(こちらの方がアーカイブサイズが小さい。Apacheの機能等が入っていない為?)
Subversionのサイトの「Source Code」の文章中の「Source Releases Area」リンクからWindowsを選択すると、Windows版でダウンロードできるアーカイブの一覧が表示される。
ここからSubversion Win32 binaries(svn-win32-1.5.4.zip)をダウンロードすることが出来る。
または「Windows Binaries」からバージョンを選ぶと、インストール形式のファイル(例:Setup-Subversion-1.6.6.msi)をダウンロードすることが出来る。[2011-09-23]

  1. ダウンロードしてきたzipファイルを適当な場所に展開する。(例:C:\svn-win32-1.5.4)
    または、msiファイルを実行する。[2011-09-23]
     
  2. 環境変数PATHに、SVNの実行ファイルの場所を追加する。(C:\svn-win32-1.5.4\bin
    (msiファイルによってインストールした場合、デフォルトでは「C:\Program Files (x86)\Subversion」[2011-09-23]
     
  3. リポジトリーを作成する
    コマンドプロンプトからリポジトリーの作成コマンドを実行。(この例だと、C:\svnがリポジトリーになる)
    > svnadmin create C:\svn
  4. ユーザーを作成する。
    C:\svn\conf\passwdというファイルにユーザー名とパスワード(ベタのテキスト!)を記述する。
    [users]
    hishidama = abc 
  5. ユーザー・パスワードを使用できるようにする。
    C:\svn\conf\svnserve.confの記述を変更する。
    [general]
    anon-access = none			←ユーザー認証しないアクセスはアクセス不可
    auth-access = write		←ユーザー認証したアクセスでは読み書き可能
    password-db = passwd		←passwdファイルを使用してユーザー認証する
    realm = Hishidama Repository	←認証の名称

リポジトリーを移行する方法


接続プロトコルの種類

SVNには、以下のようなURLを指定して接続することになる。[2008-12-27]

プロトコル 概要
file:/// SVNリポジトリーへの直接アクセス(ローカル)
svn:// svnserveへの独自プロトコル経由アクセス
svn+ssh:// svn://+SSH
http:// Apacheを経由したウェブアクセス
https://

接続実験1

SVNのリポジトリーが正常かどうか、試してみる。(SVN1.5.5の場合)

> svn co file:///C:/svn/zzz zzz
svn: URL 'file:///C:/svn/zzz' は存在しません		←モジュール「zzz」は存在しないので、これで良い。

もしリポジトリーの位置自体が間違っていると、以下のようなエラーになる。

> svn co file:///C:/svn/zzz zzz
svn: URL に対し ra_local セッションを開始できません
svn: リポジトリ 'file:///C:/svn/zzz' を開けませんでした

※プロトコル「file」の場合はユーザー認証は必要ないようだ


接続実験2

プロトコル「svn」で接続できるか試してみる。
この場合、SVNサーバーが起動している必要がある。

  1. SVNサーバーを起動する。
    コマンドプロンプトから以下のコマンドを実行する。(このコマンドプロンプトを閉じるか、Ctrl+Cで停止するまでサーバーとして稼動)
    > svnserve -d -r C:\svn
  2. ログイン(ユーザー認証)できるかどうか試してみる。
    (SVNサーバーとは別の)コマンドプロンプトから以下のコマンドを実行してみる。
    > svn co --username hishidama svn://localhost/zzz zzz
    認証領域: <svn://localhost:3690> Hishidama Repository
    'hishidama' のパスワード: ***
    svn: URL 'svn://localhost/zzz' は存在しません		←モジュール「zzz」は存在しないので、これで良い。

もしSVNサーバーが起動していないと、以下のようなエラーが発生する。

> svn co --username hishidama svn://localhost/zzz zzz
svn: ホスト 'localhost' に接続できません: 対象のコンピュータによって拒否されたため、接続できませんでした。

認証のキャッシュ

> svn co --username hishidama svn://localhost/zzz zzz

一度ユーザー認証が成功すると、次回はパスワード入力を求められないようだ。
--no-auth-cacheを付けて実行すると認証のキャッシュはされない。

> svn co --no-auth-cache --username hishidama svn://localhost/zzz zzz

WindowsXPの場合、キャッシュは「C:\Documents and Settings\User\Application Data\Subversion\auth\」にある。[2008-12-27]
(UNIXなら「~/.subversion/auth/」らしい)
この「auth」ディレクトリー(あるいはその中の個別のファイル)を削除すれば、認証のキャッシュが消せる。

C:\Documents and Settings\User\Application Data\Subversion\config」ファイルに以下の設定をすることで、--no-auth-cacheを指定しなくてもキャッシュされなくなる。

[auth]
store-passwords = no

Windowsサービスへの登録

SVNサーバーを毎回コンソールで起動するのは面倒なので、Windowsのサービスとして常駐させることが出来る。

> sc create svnserve binpath= "C:\svn-win32-1.5.4\bin\svnserve.exe --service -r C:\svn" start= auto DisplayName= "Subversion:svnserve"

登録した直後は起動していないので、以下のコマンドやサービス管理ツールで起動させる必要がある。

> sc start svnserve	起動
> sc stop svnserve		停止
> sc query svnserve	状態確認
> sc delete svnserve	削除

Windows7の場合、scコマンドを実行する為のコマンドプロンプトは管理者として実行されている必要がある。[2011-09-23]

> sc create svnserve 〜
[SC] OpenService FAILED 5:

アクセスが拒否されました。

↓“管理者として実行”されているコマンドプロンプト

> sc create svnserve binpath= "C:\Program Files (x86)\Subversion\bin\svnserve.exe --service -r D:\svn" start= auto DisplayName= "Subversion:svnserve"
[SC] CreateService SUCCESS

svnadmin createで作ったリポジトリーの場所と svnserveに指定するディレクトリーは、完全に一致している必要は無い。[2008-12-28]
リポジトリーの場所がsvnserveに指定したディレクトリー配下であれば問題ない。(その外側にはアクセスできない)
svnプロトコルで(svnserveで指定したディレクトリーからの)相対パスを指定することになる。

サービスの作成:

> md C:\svn
> svnadmin create C:\svn\sampleパスワード等の設定ファイルを修正する〜

> sc create svnserve binpath= "C:\svn-win32-1.5.4\bin\svnserve.exe --service -r C:\svn" start= auto DisplayName= "Subversion:svnserve"
> sc start svnserve

サービスの確認:

> sc qc svnserve
[SC] GetServiceConfig SUCCESS

SERVICE_NAME: svnserve
        TYPE               : 10  WIN32_OWN_PROCESS
        START_TYPE         : 2   AUTO_START
        ERROR_CONTROL      : 1   NORMAL
        BINARY_PATH_NAME   : C:\svn-win32-1.5.4\bin\svnserve.exe --service -r C:\svn
        LOAD_ORDER_GROUP   :
        TAG                : 0
        DISPLAY_NAME       : Subversion:svnserve
        DEPENDENCIES       :
        SERVICE_START_NAME : LocalSystem

インポートしてみる:

> cd C:\temp
> md test
> echo zzz > test/zzz.txt
> svn import test svn://localhost/sample/test -m'test import'

こうしておけば、後は「svnadmin create C:\svn\hoge」のように、新しいリポジトリーをどんどん作れる。
この際、サービス(svnserve)は一つだけでよい。
confは各リポジトリーのディレクトリー内に別々に存在する為、コピーしておかないと同じSVNユーザーで接続できないが…)

ただし、環境によっては、import(やEclipseのプロジェクトの共用)等が以下のように失敗するかもしれない。

> svn import test svn://localhost/sample/test -m'test import'
追加しています test\zzz.txt
svn: ファイル 'C:\svn\sample\db\txn-current-lock' を開けません: アクセスが拒否されました。

これは、svnadmin createを実行した(Windows上の)ユーザーと、サービスとして動いているsvnserveのユーザー(デフォルトでは「LocalSystem」になっている)が異なる為だと思われる。
(ユーザーが異なるので、svnadmin createで作られたディレクトリーに対するアクセス権限が無いのではないか。
 サービスでなく、コンソール上でsvnserve -d -r C:\svn」で実行した場合には上記のエラーにはならない)

この場合、サービス管理ツールで、svnserveのサービスに対してプロパティー(ユーザー)を変更してやればよい。

  1. サービス管理ツールを起動する。
  2. 名前「Subversion:svnserve」に対してダブルクリック(又は右クリック→「プロパティ(R)」)でプロパティーダイアログを開く。
  3. 「ログオン」タブを選択する。
  4. 「アカウント(T)」を選択する。(デフォルトは「ローカルシステムアカウント(L)」
    「アカウント」にWindowsのユーザー名(「hishidama」と入れたら「.\hishidama」になった)、「パスワード」にログオンパスワードを入力する。
  5. 「OK」でダイアログを閉じる。
  6. 「Subversion:svnserve」を再起動する。

もしくは、サービス作成時にユーザー名を与えておく。

> sc create svnserve ^
More? binpath= "C:\svn-win32-1.5.4\bin\svnserve.exe --service -r C:\svn" ^
More? start= auto DisplayName= "Subversion:svnserve" ^
More? obj= ".\hishidama" password= password

フックの定義

SVNでは、コミットやロックをする前後に処理を行う機能がある。[2008-12-29]
前処理でチェックを行い、処理の続行を許可したり拒否したり出来る。
リポジトリのフック …フックの種類一覧(ページの下の方)

フックはリポジトリー毎に用意する。
C:\svn\sample\hooks」ディレクトリーの下にフックの実行ファイルを置く。
デフォルトでは各フックのファイル名に拡張子「tmpl」が付いたものが置いてある。これはテンプレートだが、UNIX向け(シェルスクリプト)。
Windowsの場合はexeやcom、bat等の拡張子を付けた実行ファイルにする。

例えばリビジョンのプロパティー(属性)の変更の前処理のフック(pre-revprop-change)の場合、pre-revprop-change.batというファイルを作る。

C:\svn\sample\hooks\pre-revprop-change.bat: (処理を許可する例)

@echo off
echo pre-revprop-change %* >> c:\temp\svn-hook.log
exit 0

前処理フックの場合、戻り値が0だと処理を続行する。
0以外だと後続処理(実際の処理)を行わない。その場合、標準エラーにメッセージを出力すると、SVNコマンド実行時のエラーメッセージとして表示される。

C:\svn\sample\hooks\pre-lock.bat: (処理を拒否する例)

@echo off
echo pre-lock %* >> c:\temp\svn-hook.log

set REPOS=%1
set PATH=%2
set USER=%3
echo %USER%が %REPOS%の %PATH%をロックするのを断固拒否する! 1>&2

exit 99
C:\svnwork\test> svn lock zzz.txt
svn: ロックが pre-lock フックによって妨げられました (終了コード: 99)。出力:
hishidamaが c:\svn\sampleの /trunk/test/zzz.txtをロックするのを断固拒否する!

ところで、pre-lock.batやpre-unlock.batを用意してロック・アンロックを行うと、「Keyboard History Utility」というエラーが発生して困った。
pre-revprop-change.batだと発生しないところがまた不思議だが)

解決策は、cmd.exeAutoRunをやめるか、AutoRundoskeyを使うのをやめるか、フックでバッチファイルを使わない。


参考


技術メモへ戻る
メールの送信先:ひしだま