4コマでわかるSVNからgitへの移行
SVNからgitに移行してみようかなーと思ってネットで見つけた手順をやってみたのだけれど、自分の知識レベルではそれぞれのコマンドが何を意味しているか理解するのに時間がかかったので、この苦しみをあとで理解できるように簡単にまとめてみた。
コミット時に以下のように怒られる。
svn: Can’t get exclusive lock on file ‘REPO/db/write-lock’: No locks available
Google先生に聞いてみるとリポジトリがNFSにあると同じ現象ができているっぽい。
SubversionのFAQをみるとlockをサポートしているNFSならOKとある。
NFSとかを詳しくは知らないんだけど、Linux.or.jpのNFSクライアントの設定を見てみると、NFSサーバのディスクをマウントする場合、マウントするほうはクライアントとして設定が必要。
Debianの場合、「apt-get install nfs-common」でrpc.statdデーモンとかが動いているらしいが、ファイルロックする場合は、これとセットでrpc.lockdデーモンも必要らしい。そしてこれらはnfslockというのから起動されるらしい。
その他、portmapもいるとかなんとか。
これで解決しない場合は、リポジトリをローカルディスクにおくっきゃないな。
WebDAV transparent write-through proxyでMKACTIVITYとか怒られた
WebDAV transparent write-through proxyの実験中、Slaveでコミットしたときにwrite-throughしてくれない・・・。なーぜーだー。コミットすると以下のエラーが出る。
コミットに失敗しました (詳しい理由は以下のとおりです): サーバが、リクエストへのレスポンスとして予想外の戻り値 (500 Internal Server Error) を送信してきました (リクエスト: MKACTIVITY, URL: ‘/svn/repo01/!svn/act/fe44baef-2017-234b-bb48-d0f067379dc9′)
SVNMasterURIが間違っているときのエラーらしいけど。
SVNParentPathがまずいかと思ったけど、開発者のブログ?では以下のように解説されていた。
I believe you can use SVNParentPath so long as your repository locations on the master and server end with the same basename, and your SVNMasterURI configuration doesn’t carry that basename. I think the proxy code is going to use SVNParentPath + /basename to find the repository on the slave, and SVNMasterURI + /basename to address the repository on the master. (There’s a mailing list post which corroborates this at: http://svn.haxx.se/users/archive-2008-02/0326.shtml)
SVNParentPathの場合、SVNParentPath + リポジトリ名でやってくれるはずとのこと。
Slave側のログには下のようなのが。
[Sun Dec 14 23:02:17 2008] [warn] proxy: No protocol handler was valid for the [...]
Subversion1.5のWebDAV transparent write-through proxy
svnsyncはミラーリングの仕組みなのだが、write-through proxyを使うことで、ApacheにくるSVNリクエストを透過的に転送する。
わかりやすくいうと、svnsyncは同期のためのバックエンドの機能で、write-through proxyはSVNへのリクエストを振り分けを行うフロントエンドのもの。2つの技術を合わせて使うと、分散リポジトリ構成を組める。
svnsyncを使ってリポジトリレプリケーションでも書いたが、svnsyncだと、ミラー側のリポジトリはRアクセスしかだめにしないとだめ。そのために、hooks以下のスクリプトでcommitをはじいたりする処理をいれなければならない。
write-through proxyだと、ミラー側に来たリクエストをマスタ側に転送してくれるのでそういった心配が要らなくなる。Proxyぽく透過的にリクエストを転送してくれるのでwrite-through proxy。
この場合、ネットワーク上に1つのマスタリポジトリがあり、コミット処理はここにえいや!と一元的に管理する。それ以外のミラー側(スレーブ)はRを担当することで、たくさんのスレーブを立てて処理を分散することができる。
参考:
・Subversion 1.5 WebDAV Write-Thru Proxies by 本家
・Subversion 1.5.0 での新機能 (WebDAV Write Through Proxy)
・エンタープライズ環境におけるSubversionの複製アーキテクチャ by japan.internet.com デベロッパーさん
・複数のドメインを運営する (バーチャルホスト) by Linuxで自宅サーバさん
・バーチャルホストによる複数サイトの同時運用 by @ITさん
共通して
ドメイン名はいいけど、それ以降のパスはそろえたほうがいい。リポジトリ名もそろえておいたほうが良し。
mod_proxy使うわけだからリポジトリ名が異なると「Unusable URI: it does not refer to this repository」みたいに怒られると思う。
環境は以下。ApacheのVirtualDomainを使って、1台のPCに2ドメインをひっつけて環境を作った。
Subversion1.5.3
Windows Vista。
Apache 2.2
master
・master.daipresents.com:8888/svn
・C:\fujihara\svn_masterがリポジトリ置場
slave
・slave.daipresents.com:8888/svn
・C:\fujihara\svn_slaveがリポジトリ置場
マスタの設定
通常のSVN設定と同じく下のような感じでhttpd.confを設定しておけばよい。
LoadModule dav_module modules/mod_dav.so LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule rewrite_module modules/mod_rewrite.so LoadModule authz_svn_module modules/mod_authz_svn.so <VirtualHost *:8888> ServerName master.daipresents.com DocumentRoot "C:/fujihara/Apache Software Foundation/Apache2.2/htdocs" ServerAdmin [email protected] [...]
Subversion1.5のバックアップ
Subversionリポジトリのバックアップを参考にバックアップについて考察。なんかよくわからないけどSVN構築をまかされた僕には、このページはとても助かっています。感謝です。
考えること
テーマとしては
信頼性をあげて故障する期間を短くしたい 可用性をあげてユーザから見て壊れにくくしたい 保守性をあげて運用しやすくしたい
そのために考慮するのは
バックアップの対象 バックアップ先 バックアップの頻度 バックアップの手段
ちなみにSVNは第15回 オープンソースのバージョン管理ツールに世代交代の波にあるように、
Subversion は,バイナリ差分アルゴリズムを使ってファイルの差分を表現しており,テキストファイルもバイナリ・ファイルも同じ方法で管理される。よって,CVSよりもバイナリ・ファイルの管理が容易におこなえる。
のだ。cvs2svnスクリプトをつかって、CVSリポジトリと変換したSVNのリポジトリを比較したら、CVSよりもSVNのほうが半分以下の容量になった。(たしか5.5MBが1.5MBだった気が)
バックアップの対象
リポジトリルートとなっているフォルダにあるリポジトリすべてが対象になると思う。
コピーを用いない場合、confやhooksディレクトリはバックアップがとれないので注意。必要であれば、こちらもコピーしないとね。
バックアップ先
ここで書いてもなので、ディスクが違っていればどこでもいいんじゃないかな。
バックアップの頻度
リアルタイムに取るか、1日や1週間に1回取るか。
バックアップの手段
SVNでは以下の3つの方法を検討できる。
ファイルコピー svnadmin hotcopy svnadmin dump/load svnsync
ファイルコピー
いいところ
・簡単
悪いところ
・リポジトリがでかくなるとリアルタイムに取ることができない。
・コピー中にコミットするとリポジトリが壊れた
svnadmin hotcopy
試しているところ。
いいところ
・SVN稼働中に安全にコピーできる
悪いところ
・特になさそう
svnadmin dump/load
いいところ
・最低限のデータエラー検出をしてくれるが、壊れたリポジトリを直す手段がほとんどないのが微妙
・バックアップデータが小さい。1000リビジョンぐらいでサイズは8.33MBのリポジトリが、dumpファイルのサイズは14MB。tar.gzに圧縮すると218KBだった。
わるいところ
・すげー時間がかかる。1万リビジョン1時間ぐらいかかった。loadにも同じぐらい時間がかかるので、障害時復旧に時間がかかってしまう。
・こちらもdump中にコミットしたらリポジトリが壊れた経験がある。
・rootじゃないと実行できない
svnsync
いいところ
・リアルタイムでバックアップ(複製)ができる
・rootでなくても実行できる
わるいことろ
・いまんところないなー
まとめ
リアルタイムの保存であればsvnsync。
複製したリポジトリへの切り替えが簡単なので、SVN1.4以上なら使えそう。
一番良さそうなのはSubversionベストプラクティスにもあるようにhotcopyがよさげ。Googleさんもhotcopy+rsyncらしい。
hot-backup.pyを使えるので導入が楽ちん。
参考: Subversion リポジトリのバックアップ、リストア 【Subversion】ディスククラッシュ subversionのバックアップはhotcopyのがイイ
svnsyncを使ってリポジトリレプリケーション
バックアップとして、もしくはバックアップからの復旧時間が嫌な場合は、リポジトリのミラーリングとしてsvnsyncがSVN1.4から使えるようになっている。
今回はsvnsyncの動作を確認してみる。
環境はWindows Vista、SVN1.5.3。
本当はリモートのリポジトリにミラーリングしたいんだけど、ローカルApacheで我慢。
Apacheは↓みたいな設定でURLを別にしている。SVNのBasic認証もかけてみた。
<Location /svn> DAV svn SVNListParentPath on SVNParentPath C:\fujihara\svn_root AuthType Basic AuthName “Subversion Basic Auth” AuthUserFile C:\fujihara\svn_root\passwd Require valid-user </Location> <Location /svnmirror> DAV svn SVNListParentPath on SVNParentPath C:\fujihara\svn_mirror AuthType Basic AuthName “Subversion Basic Auth” AuthUserFile C:\fujihara\svn_root\passwd Require valid-user </Location>
「http://localhost:8888/svn/repo01」と「http://localhost:8888/svnmirror/repo01m」を同期させる。
ミラー側のリポジトリ設定
まずはミラー先のリポジトリを作成する。
mkdir c:\fujihara\svn_mirror cd c:\fujihara\svn_mirror svnadmin create repo01m
次に「C:\fujihara\svn_mirror\repo01m\hooks」にある「pre-revprop-change.tmpl」を「pre-revprop-change.bat」、「start-commit.tmpl」を「start-commit.bat」にリネーム。Windowsの場合はbatでUnixだとtmpl拡張子を削除かshとかでもいいかも。
バッチファイルの中身を以下に修正。
// pre-revprop-change.bat if “%3″ == “svnsyncuser” exit 0 exit 1 // start-commit.bat if “%2″ == “svnsyncuser” exit 0 exit 1
これをしないと
svnsync: Repository has not been enabled to accept revision propchanges;
ask the administrator to create a pre-revprop-change hook
と怒られる。この記述によって、svnsyncuserからしかアクセスができないようになるので、ミラー側に送られてきたコミットやリビジョンのログメッセージ変更を防ぐ。
次にミラー側のリポジトリを初期化。
ミラー側のリポジトリは空っぽでないと「svnsync: Cannot initialize a repository with [...]
Subversionのシステム構成を考えてみた
全社的にSubversionを使えないか調べているんだけど、その構成に関する資料はとても少ない。
SVN1.5だとエンタープライズ環境におけるSubversionの複製アーキテクチャ by japan.internet.com デベロッパーとかSubversionを見直せ by プログラマの思索さんがとても詳しい。
そこで、Subversionのシステム構成をまとめてみた。いきなり「WebDAV Transparent Write-Through Proxyっすよ!」とMTGで提案するのも何なので、まずは整理。
単一サーバの場合
これは簡単。WindowsならばAll-in-one Tracとか使えばすぐ環境ができる。
昔の職場では、自分のPCに入れて使っていたのでこの構成になる。
いいところ
・シンプル
・小さいプロジェクトとかならこれで十分
悪いところ
・リポジトリが壊れるとバックアップからの復旧になる
複数サーバ・単一リポジトリの場合
NFSとかを使ってディクス共有ができるのであればこういう構成も可能。ただし、リポジトリは結局1つなので、Apacheは冗長になっているけど、リポジトリが壊れたらおしまい。サーバ間でリポジトリを同期しなくていいのが楽で、Apacheの故障であれば有効かもしれないけど、Apacheの冗長化があまり効果を発揮していない気もする。
こんときに注意しないといけないのが、SVNはApacheサーバはAct/Actでいいんだけど、両方にリクエストを渡すのはだめっぽい。どうも複数サーバから単一リポジトリにコミットなどWriteすると、リポジトリが壊れるみたい。
Act/Actにしておいて、片サーバのみにリクエストを投げるようにLBなりで設定しておかなければえらいめにあう。
LBが使えないなら、2つのSVNサーバそれぞれにドメインを割りあって、待機系のSVNサーバからはコミットできないようにしておかないとだめ。
いいところ
・Apacheの停止に強い
・サーバ間のリポジトリ同期が必要ない
悪いところ
・LBがない場合、マスタとスレーブの使い分けが必要
・リポジトリが壊れるとバックアップからの復旧になる
複数サーバ・複数リポジトリの場合(svnsync利用)
複数にリポジトリをとると、サーバ間の同期が気になると思う。
SVNはsvnsyncという機能を持っており、リモートやローカルの別リポジトリと同期し、レプリケーションを作成することができる。
この場合、ミラーリングしているので、障害時にApacheをスイッチできれば、SVNは止まらず利用できる。
ただし、通常利用するマスタSVNはRW。スレーブSVNはRとしておかないと、スレーブにコミットしたときに。同期はマスタ>スレーブの一方通行なので、マスタと同期がとれなくなる。
よって障害時はスレーブをRで運用しなければならない。
これは問題に感じるが、コミットの緊急性よりもチェックアウトの緊急性が高いはずなので、障害復旧まではコミットできないけど、チェックアウトはできるのでいいんじゃね?というポリシーに納得できれば、シェルを書くだけで簡単に組める。
LBが使えたらこの構成で十分そうだし、LBが使えず、ユーザの手間を気にしなくていいなら、2つのSVNサーバに2つのドメインを割り当てて使うのもありかなと。
いいところ
・Apacheの停止に強い
・リポジトリが壊れてもRでアクセスができるため可用性が高い
悪いところ
・LBがない場合、マスタとスレーブの使い分けが必要
WebDAV Transparent Write-Through Proxyを使う場合
SVN1.5の新機能。WebDAV 透過ライトスループロキシというらしい。
複数サーバ・複数リポジトリの場合(svnsync利用)に似ていて、svnsyncを使うのだけれども、ちょっと違うのが、LBなど使わずにDNSラウンドロビンで2サーバを活用する場合に便利そう。
LBが振り分けを判定するのではなく、SVNが判定する仕組みになっている。
スレーブSVNにリクエストが来た場合、コミットとかのWrite処理だったらマスタに透過的にProxyする。こちらもマスタだけがWrite処理というポリシーになっている。
Readだけなら
Gitのような分散リポジトリ構成を組めるので、理想形と言えば理想。Apache2.2系のmod_proxyを使っているらしいので、Apacheのバージョンに注意が必要。
いいところ
・Apacheの停止に強い
・リポジトリが壊れてもRでアクセスができるため可用性が高い
・LBとかいらない
・WriteはマスタだけになるがRは負荷分散できる
[...]
Subversion1.4から1.5への移行チェックポイント
Subversionのバージョンアップで必要になるチェックポイントを覚書。
環境は以下。
Windows XP Subversion 1.5.3 fsfs利用 mod_dav_svnつかってhttpアクセス利用 リポジトリ形式
Subversion 1.5.0 での新機能 (sharding)がすばらしいページで、確認してみると、Subversionのリポジトリ形式は、fsfsの場合、format1?3の種類がある。
format 1は謎 r24575までがformat 2 r24576からがformat 3
format2はSVN1.4、format3は1.5と考えると、1.4のリポジトリは1.5からも使えるので問題なし。ただし、format2の形式はリビジョンが増えてくるとある地点から極端に重くなるので、format3へ変換するのがお勧め。
クライアントのアップデート
移行時に「つかえないじゃない!」を回避するために実験。SVN1.5で動くクライアントがそろっていれば、アップデートを促すだけでいいのかなと。
Subclipse1.4.5 Tortoise1.5.2 Suversive0.7.3
上記クライアントで動作することを確認できた。
困ったこと
Eclipse3.4(Ganymede)にSubversiveを「Help > Software Updates… > Available Software > Ganymede > Collaboration Tools」で「Subversive SVN Team Provider」を入れると以下のエラー発生。
SVN: ’0×00400006: リポジトリー・ロケーションの検証’ operation finished with error: Selected SVN connector library is not available or cannot be loaded. If you selected native JavaHL connector, please check if binaries are available or install and select pure Java Subversion connector from the plug-in connectors update site. If connectors already installed then you can change the selected one at: Window->Preferences->Team->SVN->SVN Client. Selected SVN connector library is not available or [...]
USVN 0.7.2を入れてみた
Subversionの管理を楽にするためと、ユーザやアクセス管理を楽にするために、いいアプリはないものかと調査。そこでUSVNというものがあったので、実際にWindowsに入れてみた。Linuxにも入れたけれど、だいたい同じ手順になるはず。USVNのライセンスはCeCillで、調べてみるとフランス版GPLらしい。
USVN
ブラウザベースのSubversion管理ツール「USVN」 – MOONGIFT
インストール準備
Installドキュメントには以下が記載されている。
Dependencies * PHP 5 (ver >= 5.1.2) * apache2 * mod_dav_svn enable * mod_rewrite enable * proper AllowOverride configuration * subversion * mod_svn enable * mod_authz_svn enable
PHPとApacheは入れるだけ。Apacheのモジュール設定など、httpd.confは以下のようになる。
AllowOverrideはWikiに説明があった。
LoadModule dav_module modules/mod_dav.so LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule rewrite_module modules/mod_rewrite.so LoadModule authz_svn_module modules/mod_authz_svn.so <Location "C:/fujihara/Apache Software Foundation/Apache2.2/htdocs/usvn"> AllowOverride FileInfo Limit </Location>
Vistaでは動かない。。。というかSVNがおかしくてApacheがおちる。。。
つづく(かも)
Ruby1.8.7 SVNからチェックアウトしていらないファイルを削除する
SVNとかCVSからチェックアウトしたファイルのうち、javaとjspファイル以外はいらないので、削除するためのスクリプトをRubyで書いてみた。
クラスとか使ってないです。
今回成長したのは、「logger.debug(“checkout #{dirname}”)」のように変数を文字列内に埋め込めることがわかったことかなー(ちっちゃ!)。
ちょっとずつ成長です。
# SVNからチェックアウト。 # INCLUDEで指定した拡張子以外を削除する。 require ‘logger’ logger = Logger.new(STDOUT) logger.level = Logger::DEBUG $KCODE=’UTF-8′ SEP=”\\” SVN_PATH=”http://localhost/svn” SVN_USER=”fujihara” SVN_PASSWORD=”fujihara” CO_PATH=”D:\\Study\\Ruby\\svn” FIND_PATH=”D:/Study/Ruby/svn” PATH_FILE=”./path.csv” INCLUDE=”java,jsp” logger.debug(“start”) # チェックアウト fr = open(PATH_FILE, “r”) while line = fr.gets line = line.chomp if line == “” next end dirname = line.sub(“/”, “”) dirname = dirname.gsub(“/”, “_”) logger.debug(“checkout #{dirname}”) dist = CO_PATH + SEP + dirname cmd = “mkdir #{dist}” logger.debug(“cmd #{cmd}”) system(cmd) cmd = “svn co #{SVN_PATH}#{line} #{dist} –username #{SVN_USER} –password #{SVN_PASSWORD}” logger.debug(“cmd #{cmd}”) system(cmd) end fr.close # 対象となるファイルを調べる includes = INCLUDE.split(/,/) includearray=[] for extension in includes includearray.push(Dir.glob(“#{FIND_PATH}/**/*#{extension}”)) end # 全ファイルの配列から、対象ファイルのパスを削除 pathes = Dir.glob(“#{FIND_PATH}/**/*”) for includepaths in includearray for [...]
Subversion1.5.2 apacheでのセキュリティ保護
Subversion1.5.2 svnserve.confでのセキュリティ保護と同じく、Apacheを使えばもっと高度な設定ができる。daily dayflowerさんの「Apacheで統合Windows認証を使う」みたいに統合Windows認証でNTLM認証とかを使えば、Windowsにログインするだけで簡単に使えるし。
前提条件としては、c:\svn_repositoryに「repo01」「repo02」とリポジトリが複数あるとする。
多分、svnserve.confはsvnserveを使う場合だけであって、Apacheを使う場合は、httpd.confだけで設定できるってことかな。
どっちの設定が有効になってるかわからなくならないように、svnserve.confを以下のようにコメントアウトしておいた。
[general] #anon-access = none #auth-access = write #password-db = passwd #authz-db = authz htpasswdでのBasic認証
svnserveのpasswdを使っての認証と同じく、Apacheの/bin/htpasswdを使って認証を設定できる。
異なるのがパスワードが暗号化される点。
C:\Program Files\CollabNet Subversion Server\httpd\bin>htpasswd.exe -c -m c:\svn_repository\htpasswd fujihara New password: ******** Re-type new password: ******** Adding password for user fujihara
authzファイルを流用できるようにsvnserveでやったときと同じくユーザを追加。Subversion1.5.2をWindowsに入れると、Apacheも一緒に入ってくれるので(C:\Program Files\CollabNet Subversion Server\httpd)、そのconf/httpd.confを修正。
Dav svnを使うのでmod_dav_svn.soモジュールを有効にしておく。
LoadModule dav_module modules/mod_dav.so LoadModule dav_svn_module modules/mod_dav_svn.so <Location /svn> DAV svn SVNParentPath C:\svn_repository AuthType Basic AuthName “Subversion Basic Auth” AuthUserFile C:\svn_repository\htpasswd Require valid-user </Location>
SVNParentPathにはリポジトリを置いているディレクトリしか指定できない。リポジトリ自体に設定すると、「Can’t open directory ‘C:\svn_repository\repo’: 指定されたパスが見つかりません。 」と怒られる。
Apacheを再起動して、「http://localhost/svn/repo」にアクセスすると認証画面がでる。認証に成功するとリポジトリ内が表示される。「http://localhost/svn/repo」にアクセスすると403になってしまうのでリポジトリ一覧は見れない。
リポジトリ一覧を表示する設定
SVNParentPath 設定するなら SVNListParentPath on も指定を参考にmod_dav_svnの設定でSVNListParentPathをonに設定する。
<Location /svn> SVNListParentPath on DAV svn SVNParentPath C:\svn_repository AuthType Basic AuthName “Subversion Basic Auth” AuthUserFile C:\svn_repository\htpasswd Require [...]
Subversion1.5.2 svnserve.confでのセキュリティ保護
Subversionのセキュリティについて考えてみた。
まず、Subversionのサーバをどうするかで選択肢がわかれる。
svnserve 簡易サーバ。簡単な認証もあるため社内LANならばこれでも問題ない。 svn + ssh SSHで暗号化接続できる。 http Apacheと連携させてhttpで接続する。ブラウザからの確認もでき、Apacheの認証機能をそのまま使える。
まずはsvnserveでのセキュリティを調べてみる。
svnserve
簡易サーバsvnserveの場合は、
svnserve.confによるリポジトリに対するアクセス設定 svnserve.confとpasswdによるリポジトリに対する認証 svnserve.confとauthzによるパスごとのアクセス設定
が可能。svnserveの場合は、どれも再起動せずに設定が反映された。
svnserve.confによるリポジトリに対するアクセス設定
匿名ユーザの場合と、認証済みユーザの場合が設定可能。匿名ユーザは「anon-access」で認証ユーザは「auth-access」となる。値は「none」、「read」、「write」を設定できる。
匿名ユーザのアクセスを制限する場合は、以下のように設定。
[general] anon-access = none svnserve.confとpasswdによるリポジトリに対する認証
認証ユーザの認証はpassword-dbで指定したファイル(ここではpasswd)で設定する。
[general] anon-access = none auth-access = write password-db = passwd
passwdファイルには以下のように設定する。平文なので注意。
[users] fujihara = fujihara dai = dai svnserve.confとauthzによるパスごとのアクセス設定
svnserver.confには以下のように記述する。
[general] anon-access = none auth-access = write password-db = passwd authz-db = authz
authzにパスごとの設定を記述していく。
passwdファイルのメンバーをグループに分ける。
[groups] developers = fujihara,nagasawa manager = fujihara,aragaki
ルートフォルダ直下にはmanagerだけ読み書きができ、それ以外は読み込みだけできるようにする。以下の設定だとnagasawaさんは/all.txtを読むことができても編集できない。
[groups] developers = fujihara,nagasawa manager = fujihara,aragaki [/] @manager = rw * = r
以下の設定だとdeveloperフォルダはmanagerの設定をしていないが、サブフォルダは親フォルダの設定を継承するので、ルートの「@manager=rw」を引き継いでいることになる。よってみんな読み書きできる。
[groups] developers = fujihara,nagasawa manager = fujihara,aragaki [/] @manager = rw * = r [/developer] @developers = rw
以下の設定だと、managerフォルダはmanagerだけがアクセスできる。「* =」だけ書いてしまってもルートの設定を継承してmanagerだけのアクセスになりそうだが、「* =」だけだと全員アクセスできなくなってしまう。
[groups] developers [...]
Subversion1.5.2 リポジトリ構成を考える
リポジトリの単位とリポジトリ内のディレクトリ構成などをまとめてみる。
リポジトリ分割のポイント
リポジトリの単位を考える。SVNは1つのリポジトリを複数に分けるのが簡単なのでまずはリポジトリ1つで問題ない。分割する場合は以下を考慮しなければならない。
サーバの再起動
svnserveの場合、svnserveの-rで「c:\svn_repository」のような、複数リポジトリを置いているフォルダを指定できるので、リポジトリを「svnadmin create c:\svn_repository\repo02」のように追加しても、svnserve自体を再起動しなくてもよい。設定変更もリアルタイムで反映された。
Apacheを使っている場合、Locationで仮想パスを設定するので、リポジトリが増えるたびにApacheの再起動が必要になってくる。
再起動を簡単にできそうであれば、Apacheを使ってリポジトリを分割してもいいとおもうが、できないならば、1つのリポジトリでがんばったほうがいい。
分割して再起動をおさえるためにはsvnserveを使うほうがよさげ。
Apacheを使っている場合、SVNParentPathでリポジトリを置いてあるルートフォルダを指定すれば再起動なしで運用できそう。詳細はSubversion1.5.2 apacheでのセキュリティ保護を参照のこと。
設定ファイルの数
svnserveの場合、複数リポジトリを使えば、複数の設定ファイルが生まれる。これだと設定が集約されない代わりに、各リポジトリごとに設定しやすくなる。
Apacheの場合は、複数リポジトリで1つの設定を行ったり、複数の設定を持ったりどちらでもできる。ただ、複数の設定を持つ場合は、リポジトリを追加するたびに、Locationの設定をしなければならないので、毎回Apache再起動が必要になると思う。
リポジトリ内のディレクトリ構成ポイント
プロジェクト単位で分けるのがよさげ。
/ /fujiharaproject /fujiharaproject/trunk /fujiharaproject/branches /fujiharaproject/tags /daiproject /daiproject/trunk /daiproject/branches /daiproject/tags
大きくなればこれをリポジトリ分割してもよい。
StrutsのSVN構成
apache.orgではどうやってるんだろう?ということでStrutsのSVN構成を調べてみた。Strutsはversion1.xとversion2.xがある。
ルート直下にはapache.orgのプロジェクトがずらりと並んでいる。その中のstruts以下はこんな感じ。
/ /activemq /ant /apr /sturts /sturts/archive /sturts/current /sturts/maven /sturts/sandbox /sturts/site /sturts/struts1 /sturts/struts1/branches /sturts/struts1/tags /sturts/struts1/trunk /sturts/struts2 /sturts/struts2/branches /sturts/struts2/tags /sturts/struts2/trunk
struts直下にはstruts1とstruts2以外にsiteとかmavenとかcurrentとかarchiveがある。多分なんだけど、struts1/trunkにはStrutsフレームワークに関するソースなどが中心おかれ、ドキュメントとかは入れてないのではないかな?
なぜ、そんなことを気にしたかというと、SVNだとバイナリもバージョン管理できるので、がつがつつっこんだりする。ただ、アプリ開発と同じレイヤにドキュメントなどを入れるのはなんか変だ。これを考慮し、Subversion実践入門を参考にまとめると、以下のような感じが理想なのかなと思った。
/archive /archive/oldproject01 /archive/oldproject02 /sandbox /sandbox/fujihara /sandbox/yamada /fujiharaproject /fujiharaproject /fujiharaproject/branches /fujiharaproject/tags /fujiharaproject/trunk/doc /fujiharaproject/trunk/tools /fujiharaproject/trunk/data /fujiharaproject/trunk/db /fujiharaproject/trunk/vendor /fujiharaproject/trunk/src /fujiharaproject/trunk/src/main/java /fujiharaproject/trunk/src/main/resources /fujiharaproject/trunk/src/main/config /fujiharaproject/trunk/src/main/webapp /fujiharaproject/trunk/src/main/webapp/WEB-INF /fujiharaproject/trunk/src/test/java /fujiharaproject/trunk/src/test/resources /fujiharaproject/trunk/src/test/filters /fujiharaproject/trunk/src/site
メンテされないプロジェクトはarchiveに突っ込んでおく。
sandboxは練習用にユーザごとで自由につくればいい。ただし、勝手に初期化したりするのはご了承くださいみたいにする。
docディレクトリにはプロジェクトに関係するドキュメントを置く。
toolsには便利ツールなどをつっこむ。
dataにはcsvファイルデータなどを置ける。
dbにはDBのDDLなどをつっこめばよし。
vendorにはjunitとかのライブラリを置いていく。Mavenを使えばこれはいらないかもね。
srcには最も大事なソースコードを置く。Mavenのディレクトリ構造にしてみた。
docとかはbranchの考え方を持たなくていいかもしれないので、藤原としては、
/fujiharaproject/doc /fujiharaproject/tools /fujiharaproject/data /fujiharaproject/db /fujiharaproject/vendor /fujiharaproject/branches /fujiharaproject/tags [...]
Subversion1.5.2でキーワード展開を使ってみる
キーワード展開とは「$作者」みたいにソースに書いたら、チェックインしたときに「ふじはら」みたいに置き換えてくれる機能。CVSにあったのでSVNにもあるだろう。
鍋の底さんのSubversion Book翻訳のキーワード置換を参考に。
キーワード $LastChangedDate$ 省略すると「$Date$」。最後にコミットされた日時。 $LastChangedRevision$ 省略すると「$Revision$」。最後にコミットされたときにリビジョン。 $LastChangedBy$ 短縮は「$Author$」。最後にコミットしたユーザ。 $HeadURL$ そのファイルのリポジトリのパス。 $Id$ 上記キーワードを全部ひっくるめたようなもの。 使い方
SVNではいきなり使えない。ファイルごとに以下の設定が必要。
# $LastChangedDate$ # $Date$ # $LastChangedRevision$ # $Revision$ # $LastChangedBy$ # $Author$ # $HeadURL$ # $Id$ Test
上のようなfujihara.txtを用意して、以下のコマンドを打つ。
repo01>svn propset svn:keywords “Date Revision Author HeadURL Id” ./fujihara.txt property ‘svn:keywords’ set on ‘fujihara.txt’
TortoiseSVNの場合、ファイルを右クリックすれば属性というものがあるので、svn:keywordをキーに「Date Revision Author HeadURL Id」を与えればOK。
これをコミットすると以下のようになる。
# $LastChangedDate: 2008-09-20 21:19:00 +0900 (土, 20 9 2008) $ # $Date: 2008-09-20 21:19:00 +0900 (土, 20 9 2008) $ # $LastChangedRevision: 13 $ # $Revision: 13 $ # $LastChangedBy: $ # $Author: $ # $HeadURL: svn://localhost/repo01/trunk/fujihara.txt $ # $Id: fujihara.txt 13 2008-09-20 12:19:00Z $ Test 自動でキーワード展開してもらう
Unixなら「~/.subversion」が使われる。Vistaの場合、コマンドプロンプトで以下を打つと設定ファイルの場所がわかる。
C:\Users\svntest>echo %APPDATA% C:\Users\svntest\AppData\Roaming
ディレクトリを見てみると、Subversionというフォルダがあり、設定はconfigファイルになるらしい。ここで以下の設定を行う。
[...]
僕について
Dai Fujihara
A hero can be anyone.
藤原大はマネージャでありアジャイル実践者だ。そして、プロジェクトリーダー、チェンジ・エージェント、アジャイルコーチ、トレーナーでもある。彼はまたRedmine、Jenkinsといった開発を支援するツール環境の整備や、アジャイル開発を活用した創造的なソフトウェア開発の支援を行っている。さらに、趣味は沖縄離島巡りらしい。
ここ最近の人気
開発ツールを使うと「思いやり」が減る(前半) #swat… 910 view(s)
アジャイルコミュニティは超めんどうくさい… 569 view(s)
開発ツールを使うと「思いやり」が減る(後半) #swat… 499 view(s)
3年使ったRedmineの使い方について共有したい10の… 377 view(s)
チームとタワーを創造せよ!マシュマロチャレンジでチームビ… 264 view(s)
Javaで入力チェックに使える正規表現まとめ… 124 view(s)
Redmineプラグイン開発 – 史上最高のチームプラグ… 96 view(s)
LinkStationのようなNASを買ってもバックアッ… 77 view(s)
DAOとかDTOとかVOとかEntityとか… 69 view(s)
HYの「AM11:00」は本当に彼女が亡くなった時の曲な… 61 view(s)
永久保存の本
Jonathan Rasmusson (著), 西村 直人 (翻訳), 角谷 信太郎 (翻訳)
アジャイルサムライ―それはソフトウェアを顧客に届ける猛々しきプロフェッショナルだ。本書では、圧倒的なアジャイルプロジェクトの姿を見せる。2011年爆発的にヒットしたアジャイル開発に情熱を持つエンジニアに届けたい本。
Mike Cohn (著), マイク コーン (著), 安井 力 (翻訳), 角谷 信太郎 (翻訳)
採用した現在のタイトルは、見積りや計画づくりといったプロセスを、アジャイルに進めなければならないと謳っているのだ。見積りと計画づくりがアジャイルでないのに、プロジェクトがアジャイルであるということはありえない。(イントロダクションより)
Venkat Subramaniam (著), Andy Hunt (著), 木下 史彦 (監訳), 角谷 信太郎 (監訳)
アジャイルな習慣とは一体何なのか?本書ではプラクティスを交えながら、その姿勢を読者に問いかけている。世代や役割をこえて色褪せない「アジャイル」に対する良書。Amazonレビュー
メアリー・ポッペンディーク (著), トム・ポッペンディーク (著), 高嶋 優子 (翻訳), 天野 勝 (翻訳), 平鍋 健児 (翻訳)
「トヨタ生産方式」を源流にする「リーン開発」をソフトウエア開発に取り入れるための具体的方法を紹介した本です。本書は、リーンの7大原則を「価値」「ムダ」「スピード」「人」「知識」「品質」「パートナー」に整理し、ソフト開発現場にどうしたら効果的に適用できるかを、多くの実例を交えながら具体的に説明します。
タグ
Agile ant Apache bash Eclipse GlassFish install Java Javascript kobo Linux log4j Management Maven Open Source PHP Pukiwiki Python Redmine Ruby Ruby on Rails Scrum Spring Struts Struts2 Subversion Test Tomcat Trac VBA Web WebDriver WebLogic Windows WordPress 働く 勉強会 嫁(ベータ) 思い出し笑う 我思う 旅する 映画/ドラマ 英語を話す 読むと聞く 過去を語るアーカイブ









