S-JIS[2008-12-23/2011-09-23] 変更履歴
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]
> svnadmin create C:\svn
[users] hishidama = abc
[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:// |
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」の場合はユーザー認証は必要ないようだ
プロトコル「svn」で接続できるか試してみる。
この場合、SVNサーバーが起動している必要がある。
> svnserve -d -r C:\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
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のサービスに対してプロパティー(ユーザー)を変更してやればよい。
hishidama
」と入れたら「.\hishidama
」になった)、「パスワード」にログオンパスワードを入力する。もしくは、サービス作成時にユーザー名を与えておく。
> 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というファイルを作る。
@echo off echo pre-revprop-change %* >> c:\temp\svn-hook.log exit 0
前処理フックの場合、戻り値が0だと処理を続行する。
0以外だと後続処理(実際の処理)を行わない。その場合、標準エラーにメッセージを出力すると、SVNコマンド実行時のエラーメッセージとして表示される。
@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.exeのAutoRunをやめるか、AutoRunでdoskeyを使うのをやめるか、フックでバッチファイルを使わない。