プログラマ必見! バージョン管理システム『Subversion』のススメ

バージョン管理システムの必要性

CSRのプログラマな皆さん、楽しくプログラミングしてますか?
ソフトウェアを作るのは楽しいですが、ある程度の規模になるとバックアップを取る必要が生じたり、前回いじった箇所のメモや次やるべきことを管理したくなってきます。

「バックアップは変更するたびに開発フォルダ全体を圧縮して・・・」
「変更点はテキストにメモしてバックアップと一緒に・・・」
「やることはTODOをコメントしとくか・・・」

なんてやろうとしてませんか?そんなのはHDDの無駄だし1日の作業の変更点なんかメモしきれない、TODOコメントも優先度を考慮しだすと管理仕切れませんよね。
じゃあどうすりゃいいのさ?

つ Subversion

※追記
LICさんからツッコミをいただきました。ありがとうございます。
ご指摘の通りSubversionとTODO管理は無関係です。
上記の問題点の例は私(formula)が今まで経験したもの例であり、一般的にも問題とされているものだと思います。
誤解を招きそうな書き方だとは思っていましたがTODO管理も重要な項目だと思いましたので、Subversionの紹介ページながらついでにチケットシステムにも触れてみました。
このようなツッコミは大歓迎です。このページを読まれた方で他にツッコミがある場合は遠慮なく突っ込んでください。その場で編集していただいても結構です。
スパム回避のためコメント欄は設置しておりません。ご了承ください。

Subversionとは?

Subversion(以下SVN)とは上記のような問題を解決するバージョン管理システムと呼ばれる部類のソフトです。バージョン管理システムとして有名なのはCVSなどがありますがSubversionはCVSの改良版で便利な機能が満載です。機能例を挙げると、

  • いつどのファイルをどのように変更したかを記録する(差分も表示できる)
  • 変更時にログメッセージを付けられる
  • 変更後に変更前に戻したいと思ったら戻せる

等々、いろいろあります。
SVNは本来複数人での開発を管理するためのソフトですが個人での利用でも非常に便利だと思います(複数人での開発の場合はむしろ必須と言って良い)。
皆さんも積極的に使って良いソフトを作りましょう!

Subversionでの管理の仕方

SVNはサーバ・クライアント型のソフトです。データを一元管理するサーバに複数のクライアントがアクセスします。
SVNでは一つの開発に関わるファイル群をリポジトリという単位で管理します。使い方は次のような流れになります。

準備

  1. まずサーバにプロジェクトのリポジトリを作成します(空のリポジトリ)
  2. クライアントからサーバのリポジトリにインポート(import)します(元となるデータを入れること。ディレクトリを指定し、その下にあるすべてのファイル・ディレクトリが対象になります)。またはすでにサーバにリポジトリが存在する場合はサーバからクライアントにチェックアウト(checkout)します。
  3. これでサーバ側にデータの入ったリポジトリ、クライアント側の手元に作業コピー(作業用にリポジトリからコピーされたデータ。SVNに管理される)が整いました。

利用

  1. クライアントは開発作業を始める前にサーバのリポジトリからデータを手元に更新(update)します。作業コピーは最新のものになります。
  2. クライアントは開発作業を進めます。作業コピーが変更されます。サーバ側のリポジトリは変化なし。
  3. クライアントの開発作業が終了したら今回の変更をサーバのリポジトリにコミット(変更を確定)(commit)します。リポジトリの内容が変更されます。

1〜3を繰り返して開発を進めます。変更点は差分で記録されるので丸ごとバックアップよりHDD効率がよく、いつどこを変更したか等が確実に記録されます。

複数人での開発の場合は1つのファイルを同時に変更してしまう場合もありますが、それぞれの変更箇所が重ならない場合はうまく変更を統合(merge)してくれますし、各ユーザの更新の統計なんかも記録されます。

無料で使えるの?

サーバもクライアントも無料のものがあるのでそれを使いましょう。

まずはサーバです。私は自分のサーバマシンにインストールしましたがそれが困難な場合もあるので今回は外部サーバを使用することにします。
無料でそれなりに自由に使えそうなWebスペースを探したら↓のサイトが見つかりました。

http://www.assembla.com/

暗号化通信は使えませんが1プロジェクトあたり200MBのスペースが無料で使えます。
登録が必要なのでさくっと登録してしまいましょう。

登録例

一応、例をあげておきます。不要な方は読み飛ばしてください。

  1. まずはアカウントを取得します。サイトトップからオレンジ色の『REGISTER NOW』をクリック。
  2. 適当に項目を入力して『Register』をクリック。
  3. 登録したメールアドレスに確認メールが来るのでクリックすると↓の画面に。 アカウントが作成されました。
  4. 次にスペース(プロジェクト)を作成します。ページの下の方にある『CREATE A NEW SPACE』をクリック。
  5. どういうサービスのスペースにするかを選択。SVNは1個目か4個目ですね。1個目はSVN+このサイト独自のサービス、4個目はSVNのみの利用になります。今回はせっかくなので1個目を選んでみました。
  6. スペースの種類を選択。右側のフリーバージョンを選びます。
  7. 「フリーバージョンだと誰からでも見られちゃうよ?」と警告されますがページ下の方の設定で『Non-member access』を『View』にしておけば見られても勝手に編集はされないのでおk。ちなみに『Member access』を『Edit』にすると多人数開発向けになるのかな。以下、その他の欄の説明。
  • 『Space name』: スペース名。VC++でいうソリューション名に相当。作るソフト名等を記入するといいでしょう。(画像は1発取りだったのでマズイ名前をつけてしまってます)
  • 『URL name』: URLに使用するスペースに対応する名前。http://ドメイン/URL name/hogehoge のようになるのでスペース名を小文字にして適当に"_"でつなぐのが無難ですかね。(画像は1発(ry)
  • 『Description』: スペースの説明。検索等で来た人が見るのでちゃんと書きましょう。
  • 『Tags』: タグ。カンマ区切りで複数指定可。空でも大丈夫みたいです。 記入が終わったら内容を確認して『Create the Space』をクリック。

8. スペースが作成され、管理ページに移動します。 SVN以外にもWiki・Tickets・Chatなどいろいろなツールが使えるみたいですね。 とりあえず『Source/SVN』のページに移動しましょう。 『SVN Url』が今回作ったリポジトリのURLになります。
スペースは何個も作れるので作るソフトごと作ってもいいですが、関連したプロジェクトはリポジトリ内にプロジェクトのディレクトリを作成するといいでしょう。

リポジトリにアクセスしてみよう

次にクライアントです。上記のスペースを利用する場合は『Source/SVN』ページから『Browse your code repository』をクリックしてもアクセスできますが、あまり見やすくないし変更も加えにくいのでクライアントソフトをインストールしましょう。

CUI版の例: CollabNet? Subversion Command-Line Client v1.5.4(http://www.collab.net/downloads/subversion/
GUI版の例: TortoiseSVN 1.5.5(http://tortoisesvn.net/downloads

CUI版はNetBeans?やEclipse等の統合開発環境(IDE)に組み込むときに便利です。(NetBeans?CollabNet?のものがEclipseはSubclipseというのが対応しているようです。)
GUI版のTortoiseSVNはWindows限定でエクスプローラを拡張するのでインスト後にPC再起動が必要だったりとちょっと面倒ですがGUIでリポジトリを操作できるので後は楽です。また、エクスプローラから操作するのでIDEがSVNのサポートしていなくても使用できます。

今回はTortoiseSVNをインストールしてみましょう。

  1. 上記のダウンロードページから32bit用のTortoiseSVNのインストーラと日本語言語パックのインストーラをダウンロードします。
  2. TortoiseSVNをインストしたら再起動すると右クリックメニューが拡張されます。
  3. 言語パックをインストし、設定から言語を日本語にすると準備完了です。

ではリポジトリにアクセスしてみましょう。

  1. エクスプローラの右クリックメニューから『TortoiseSVN』→『リポジトリブラウザ』をクリックします。

    #ref(): File not found: "rp_brw.jpg" at page "Subversionのすすめ"

  2. リポジトリのURLを入力して『OK』。サーバに接続され、リポジトリの内容がツリー表示されます。必要に応じてユーザ名とパスワードを入力してください。(しばらくしてもつながらない場合はURLが正しいかどうかを確認してください。)(上記の例とリポジトリ名が違うのは気にしないでください。)

    #ref(): File not found: "009.jpg" at page "Subversionのすすめ"


    ちゃんとアクセスできましたか?と言っても作ったばかりで中身が空なのでよくわかりませんね。 次項から実際にリポジトリを使用してデータを管理してみます。

インポートとチェックアウト

管理したいファイルをまとめてリポジトリに入れるには『インポート』を使用します。
まずは元となるデータを用意します。現在開発中のプロジェクトフォルダ等ですね。今回はVCで新たにHello,Worldプロジェクトを作り、そのフォルダを管理してみます。

プロジェクトフォルダ(.vcprojファイルが入っているフォルダ)の右クリックメニューから『TortoiseSVN』→『インポート』をクリックします。

#ref(): File not found: "010.jpg" at page "Subversionのすすめ"

リポジトリのURLを選択し、ログメッセージを入力します。ログはずっと残るので変更内容がわかるような内容にしてください。

インポートが開始されるとサーバのリポジトリに無いファイルが追加されていきます。『完了』と表示されたら『OK』をクリックしてください。

これで手元のデータでリポジトリが更新できました。リポジトリブラウザで確認してみてください。
ツリーにファイルが追加されていますね。右クリックして『ログを表示』をクリックしてみましょう。今までのリポジトリの変更(1回しかしてませんが)が表示されます。ログメッセージも表示されていますね。

『リビジョン』とはリポジトリのバージョン番号です。これはリポジトリに変更が加えられるたびにインクリメントされます。リビジョンはリポジトリ全体に付けられるので、どのファイルが変更されても全体のリビジョンが更新されます。
つまりリビジョンを指定することでリポジトリの過去の状態にアクセスすることができるのです。
次に手元にリポジトリの作業コピーを作りましょう。インポートしてもそのフォルダは作業コピーになりません。作業コピーを作るにはサーバから『チェックアウト』します。

プロジェクトフォルダ内で右クリックメニューから『チェックアウト』をクリックします。
リポジトリURL・チェックアウトディレクトリ・リビジョンを確認して『OK』をクリック。リポジトリから情報が送られ、チェックアウトディレクトリが作業コピーになります。(作業コピーフォルダ及びその中のファイル・フォルダにはアイコンに印が付きます。)

#ref(): File not found: "011.jpg" at page "Subversionのすすめ"

チェックマークはコミットする必要がないことを示しています。

変更とコミット

では適当に作業コピー内のファイルを変更してみましょう。アイコンのマークが『チェック』から『!』に変化します。『!』はファイルに何か変化があり、まだコミットされていないことを示しています。

#ref(): File not found: "012.jpg" at page "Subversionのすすめ"

『!』が付いているファイルまたはフォルダの右クリックメニューから『TortoiseSVN』→『変更をチェック』をクリックしてみましょう。変更があったファイル一覧が表示されます。
ファイル一覧から変更したファイルをダブルクリックすると差分が表示されます。

#ref(): File not found: "013.jpg" at page "Subversionのすすめ"

変更を確定し、リポジトリを更新するには作業コピーフォルダの右クリックメニューから『SVNコミット』をクリックします。コミットが完了するとアイコンのマークが『チェック』に戻ると思います。
特定のファイルだけをコミットしたい場合はコミットしたいファイルの右クリックメニューからコミットしてください。

別の場所での変更と更新

開発作業は常に同じ場所で行われるとは限りません。家ではデスクトップPCで開発、出先ではノートPCで開発、といったことはよくあることです。また、複数人での開発では同じPCでは同時に開発できませんね。

そんなわけで異なる場所に複数の作業コピーが作られることは自然です。そのような場合には作業コピーに変更を加える前に更新(update)しましょう。更新するとリポジトリのファイルより古いファイルが更新されます。つまり作業コピーを最新の状態にするわけですね。

どこで開発しようと作業前に更新、作業後にコミットすることでどこでも開発可能、しかも変更されたファイルだけ更新されるのでプロジェクト全体をやり取りするより効率的です。

また、複数人開発ではファイルが同時に更新されることもあります。例えばAさんとBさんがそれぞれhoge.cというファイルに変更を加えた場合、Aさんがコミットした後、Bさんがコミットしようとすると衝突が起こります。もちろんBさんが上書きなんてしてしまうとAさんの作業結果が消されてしまいますね。

SVNでは変更ファイルの衝突があった場合、変更箇所が互いに影響しない場合は自動的にマージされます。互いに影響がある場合は競合といい、自分で解消(A,Bどちらの変更を優先するか選択)する必要があります。

その他の事項

TortoiseSVNの詳しい使い方は説明書を読んでください。SVN自体の説明も結構書いてます。

また、最初にTODOに関する話題を少し出しました。SVNのログメッセージを使えばちょっとしたTODOのメモはできますがあまりオススメできません。
1つのTODOは、

  • いつできたTODOか
  • いつまでにしなければならないのか
  • 優先度は?

といった情報が必要です。そのようなTODOを管理するにはチケットシステムを利用すると良いでしょう。
SVN自体にはチケット機能はありませんが上記のサイト(http://www.assembla.com/)等ではチケットシステムを始め、いろいろなサービスが利用できます。

まとめ

ソフトウェア開発では変更点の記録、複数の場所での同期などが問題になります。バージョン管理システムやその他の便利なサービスを利用して効率良くプロジェクトを管理し、一歩進んだソフトウェア開発ができるようになりましょう。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-06-28 (土) 01:50:14 (3591d)