2010年12月21日火曜日

ストレージサーバ - その13 - SVNの使い方

サーバそのもののことではありませんが、
折角なのでSVNの使い方についても書いておきます。
情報が3年前のままですがあしからず。

Windows XP + TortoiseSVN から
hogeサーバの"sandbox"リポジトリへのアクセスについて説明します。
なお、DNSでが引けるなら何もしなくてかまいませんが、
さもなければ、以下の"hoge"はIPアドレスにに読み替えて下さい。
ちなみにlinuxなら /etc/hosts ファイルに

192.168.1.1 hoge

のように追加するだけで名前解決できるようになります。
windowsの場合は、まずはどこか(例えばシステムフォルダ)に
lmhostsというような名前のファイルを作り、
linuxと同じ一行を追加しておきます。
コントロールパネルの[ネットワーク接続]で利用している接続のプロパティを開き、
さらに[インターネットプロトコル(TCP/IP)]のプロパティの[詳細設定]で、
[WINS]タブを開いて[LMHOSTSの参照を有効にする]をチェックインし、
[LMHOSTSのインポート]で先のファイルを読み込ませます。
ただし、すでにインポートされたLMHOSTSファイルがあるなら、
そのファイルに先の一行を追加します。

まず"TortoiseSVN"をインターネットで検索してインストールします。
エクスプローラ上でどこかに新規にフォルダを作成し、
そのフォルダを右クリックして、[SVN checkout]をクリックします。
[Checkout]ダイアログボックスが現れるので、
[Repository]フレーム内の[URL of repository]テキストボックスに
"https://hoge/svn/sandbox" と入力し、[OK]をクリックします。
これで最新のソースコードが取得できました。
セキュリティについての警告が出るかもしれませんが無視して進んでください。
これはSSLのサーバ証明書が権威ある認証局によって保障されていないことを示します。
指定した領域で認証が必要な場合、
ここでユーザIDとパスワードの入力が必要となります。
ユーザIDとパスワードは領域毎に異なる設定が可能ですので
他領域のものと混同しないようご注意ください。
SVNの概念についてここで説明するつもりありませんが、
簡単に言うとソースコードをチェックアウトし、
修正し、その修正をコミットするという流れになります。
また、ウェブブラウザから"https://hoge/svn/sandbox" にアクセスすると
最新版のソースが閲覧できます。
Windows+TortoiseSVNから追加したファイルを
UNIXでチェックアウトする際に実行権限を付加したい場合は、
そのファイルの[プロパティ]ウィンドウの[Subversion]タブで
[属性]ボタンをクリックして現れるウィンドウの[追加]ボタンで
[属性を追加]ダイアログボックスを開き、
[属性名]リストボックスで"svn:executable"を選んで[OK]をクリックします。
それをコミットすればいいです。

Linuxからのアクセスについては
まず、subversionをインストールします。
各ディストリビューションによってやり方はさまざまですので自力で行ってください。
なお、GUI付のクライアントもありますが、
ここではコマンドラインでの操作を説明します。

適当なディレクトリ(例えば自分のホームディレクトリ)に移動します。
そこに適当に空のディレクトリ(例えば"work")を作ります。
"svn checkout https://hoge/svn/sandbox work"を実行します。
ソースが落ちてくるので修正等行います。
なお、Windowsで何も考えずにコミットしたファイルをlinuxでチェックアウトすると
ファイルの実行属性がないので注意してください。
スクリプト等が動作しなくなります。

高度な使い方として
svkを使うとリモートのsvnサーバで管理しているソースコードを
ローカルのsvnサーバ(サービス)へミラー出来ます。
ミラーしておけば、出張等でリモートのsvnサーバにアクセスできない時にも、
自分のPC内でソースコードをバージョン管理しながら開発を進め、
リモートのsvnサーバにアクセス出来るようになったときに、
まとめて反映できるようになります。
また、ソースコードに大きな変更を加える際に、
他の開発者に迷惑をかけないように
ローカルでバージョン管理しながら開発を進めることも出来ます。

Windowsの場合は以下のものが必要です。

SVKの"svk-v2.0.2-MSWin32-x86.exe"
OpenSSLの"Win32OpenSSL-0_9_8g.exe"

もちろんTortoiseSVNは必要ですし、
コンテキストメニュー(マウスの右クリック)の
[Open Command Window Here]からコマンドプロンプトを開ける
PowerToyの"CmdHerePowertoySetup.exe"は入れておくと便利です。
linuxの場合はhttp://search.cpan.org/dist/SVK/からソースをとってくる等、
自分で何とかしてください。

それではローカルミラーの置き場所を作成しましょう。
以下はWindowsでの手順になります。
まずコマンドプロンプトを開きます。
ディレクトリはどこでもかまいませんし、
カレントディレクトリにデータが書き込まれたりすることはありません。
ただし、日本語や空白の含まれていないところで作業するのが無難です。
最初に

# svk depotmap --init

を実行します。

Repository C:/Documents and Settings\<ユーザ名>\.svk\local does not exist, create?(y/n)

のように表示されるので'y'を押します。
なお、svkの関連データはこのディレクトリにしか置かれませんので、
".svk"ディレクトリを消せばすべてをなかったことに出来ます。
次に環境変数 SVN_EDITOR に "notepad" を設定します。
[マイコンピュータ]の[プロパティ]から[詳細設定]タブを開き、
[環境変数]ボタンをクリックします。
[システム環境変数]の[新規]ボタンをクリックし、
[変数名]に"SVN_EDITOR"(ダブルクォーテイションは必要ない)、
[変数値]に"notepad"を入力して[OK]ボタンをクリックします。

次にリモートのSVNサーバで管理されているリポジトリをローカルにミラーします。
以下を実行します。

# svk mirror //mirror/sandbox https://hoge/svn/sandbox

場合によってパスワードの入力を求められますが、最終的に

Mirror initialized. Run svk sync //mirror/sandbox to start mirroring.

と表示されれば、ローカルのSVNサーバの"mirror"ディレクトリに
リポジトリ"sandbox"がミラーされたことになります。
他の複数のリポジトリも同様に"mirror"ディレクトリにミラーするようにします。
ただし、この状態では実体はまだローカルに移っておらず、
続いて同期を行う必要があります。
リポジトリの同期は以下のコマンドで行えます。

# svk sync //mirror/sandbox

結果、以下のようなログが表示されて同期が完了します。

Syncing https://hoge/svn/sandbox
Retrieving log information from 1 to 499
Committed revision 2 from revision 1.
Committed revision 3 from revision 2.
Committed revision 4 from revision 3.
Committed revision 5 from revision 4.
:
Committed revision 500 from revision 499.

ただし、ここから直接TortoiseSVN等でチェックアウトをしてはいけません。
理由がどうこうというより、SVKを利用する場合はそういうものだと覚えてください。
以下を実行してブランチを作成し、
こちらに対してチェックアウト、コミットを行ってください。

# svk copy //mirror/sandbox //sandbox

その際、Windowsの[メモ帳]が開く場合がありますので、
その操作に対するコメント、例えば

<ユーザ名>のローカルへのミラー

などと入力して、上書き保存し、メモ帳を閉じます。

Waiting for editor...
Committed revision 501.

のように表示され、処理が成功しているはずです。
あとは TortoiseSVN 等で

file:///C:/Documents and Settings/<ユーザ名>/.svk/local/sandbox

からチェックアウトし、通常通りコミットを繰り返して開発していきます。

リモートのSVNサーバには多数の開発者が変更を加えていくため、
ローカルにミラーしたリポジトリはどんどん古くなっていきます。
そこで、リポジトリを同期することで、
ローカルのものを最新状態に更新することが出来ます。
差分がたまりすぎると後のマージ作業が大変になるのでマメに行うのが無難です。
以下のコマンドで同期します。

# svk sync //mirror/sandbox
# svk pull //sandbox

その後、TortoiseSVN 等でアップデートしてください。

開発を進めソースコードに変更が加わった際には、
TortoiseSVN 等でコミットします。
これでローカルのリポジトリが更新されます。
これら更新がある程度まとまった際に、
ローカルのリポジトリの変更をリモートのSVNサーバにアップロードする必要があります。
この作業はプッシュと呼ばれており、以下のコマンドで可能です。
プッシュの直前に同期することを強く推奨します。

# svk push --verbatim //sandbox

なお、実行した際にはたくさんのログが表示され自動的に処理が進みますが、ときどき、

Conflict found in <ファイル名>:
e)dit, d)iff, m)erge, s)kip, t)heirs, y)ours, h)elp? [e]

のようなメッセージが出て処理が中断されることがあります。
これは示されたファイルの内容が、
リモートとローカルのリポジトリで大きく異なっており、
自動的に処理が出来なかった場合に表示されます。
このとき 'd' を押してその差分を表示させ、
続いて、'e' を押すとそのファイルがメモ帳で開かれるので、
手動で修正し、上書き保存してメモ帳を閉じます。
ちなみに、異なっている部分が"<<<<"や">>>>"等でマークされているので、
その周りを重点的にチェックします。
最後にもう一度、リポジトリの同期をしておきましょう。

予断ですがsshでトンネルを作って、
そのうえでのリポジトリのミラーも可能です。
sshでのトンネルはcygwinのsshを使う場合は以下のように生成できます。

# ssh -L 443:hoge:443 <sshサーバ>

その上で

# svk mirror //mirror_ssh/sandbox https://localhost/svn/sandbox
# svk sync //mirror_ssh/sandbox
# svk copy //mirror_ssh/sandbox //ssh/sandbox

を実行し、

file:///C:/Documents and Settings/<ユーザ名>/.svk/local/ssh/sandbox

をチェックアウトしてください。
後は直接ミラーする場合と変わりません。
なお、"svk copy"時に

Parent directory //ssh doesn't exist, use -p.

のようなエラーが出た場合は、"-p"オプションをつけて

# svk copy -p //mirror_ssh/sandbox //ssh/sandbox

のようにしてください。

0 件のコメント:

コメントを投稿