Subversion の基礎勉強 〜Subversion によるバージョン管理を使う〜

はじめに

ようこそ、バージョン管理システム「Subversion」の基礎勉強です。バージョン管理システムの歴史は古く汎用機の時代からプログラムのソースコード管理に利用されてきました。現在はオープンソースで多くのバージョン管理システムがあり、Subversion や CVS のように集中管理型(クライアント・サーバ型)や、Git / Mercurial / Bazzar などの分散型と呼ばれるバージョン管理システムがあります。

「Subversion の基礎勉強」では、Windows 7 のコマンドプロンプトで Subversion の基本的なコマンドを自分のマシンで動作させます。 Subversion はこのチュートリアルで説明している以外にも多くの機能を備えたパワフルなバージョン管理システムです。使いこなすためには文章を読むだけではなく実際に試すことがとても重要です。

このドキュメントにならってコマンドを実行することで、基本的な Subversion のコマンドと使い方を学習することができます。

レッスン 1. インストール

最初に Subversion が利用できるように環境を作ります。 Apache Subversion のサイトからインストール用のバイナリ(インストーラー)をダウンロードします。こちら のページ下部に移動して Win32Svn(32-bit client, server and bindings, MSI and ZIPs)をダウンロードしてください。 2013/05/21 現在、[Setup-Subversion-1.7.9.msi]がダウンロードされました。

ダウンロードしたインストールファイルをクリックしてウィザードに従って「次へ」をクリックすればインストールは完了します。

レッスン 2. 動作確認

インストールが完了したら動作の確認をしてみましょう。 Subversion は CUI ツールのためコマンドラインから利用します。コマンドプロンプトを起動してください。 コマンドプロントから svn を入力します。(Subversion のコマンドはすべて [svn] となります。)

C:\>svn
使用方法を知りたいときは 'svn help' と打ってください。

C:\>
C:\>svn help
使用方法: svn <サブコマンド> [<オプション>] [<引数>]
...
C:\>

動作しているようです。これでインストールと動作確認は完了です。 次から早速 Subversion をつかったバージョン管理を行います。

Note: 通常、インストーラーからインストールするだけでコマンドプロンプトから svn コマンドが利用できるようになります。利用できない場合はご利用のPCの環境変数に「C:Program FilesSubversionbin」を追加しなければ行けないかもしれません。Subversion のインストールしたパスです。

レッスン 3. リポジトリ用のディレクトリを作成

これで Subversion が利用できるようになりました。まだ開発に入ることはできません。 Subversion でバージョン管理を行うためにリポジトリを作成します。

リポジトリ: Subversion で管理されるソースコードやファイルを格納する場所のことです。この格納場所を作成しなければ開発に進むことはできません。通常リポジトリの作成作業は最初の1回だけで良いです。

それでは、作成します。今回は以下の構成にします。 リポジトリ用: c:workrepos

C:\>mkdir work

C:\>cd work

C:\work>mkdir repos

repos フォルダはプロジェクト毎のリポジトリを格納するフォルダとして利用します。 リポジトリを作成します。

C:\work>svnadmin create c:\work\repos\project1

警告

project1 で利用するリポジトリを作成します。通常、リポジトリの作成は最初の1回だけです。

/bootcamp/wp-content/themes/_btcp/images/subversion-03.jpg

レッスン 4. 最初のインポート

Subversion で開発を進める場合の作法として、[trunk][tags][branches]フォルダをリポジトリに追加します。また、新規ファイル [readme.txt] を作成してインポートします。今回はインポートするフォルダとファイルを自分で用意しますが、既存のソースコードを利用しても良いです。また、tmp フォルダの配下にインポート対象のフォルダやファイルを作成しましたがリポジトリ登録後、この tmp フォルダは削除する予定です。

C:\work>mkdir tmp

C:\work>mkdir tmp\trunk     #Subversionの作法で作成するフォルダ

C:\work>mkdir tmp\tags      #Subversionの作法で作成するフォルダ

C:\work>mkdir tmp\branches  #Subversionの作法で作成するフォルダ

C:\work>echo "Sample Project readme file" > tmp\trunk\readme.txt

次に、インポート用コマンドを実行し、先ほど作成したリポジトリにインポートします。

C:\work\tmp>svn import file:///c:/work/repos/project1 -m "initial commit."    # -m はコメントを意味します。
追加しています              tags
追加しています              trunk
追加しています              trunk\readme.txt
追加しています              branches

Committed revision 1.

これで、リポジトリにインポートすることができました。Windows で注意する点は、インポート時にリポジトリのパスを指定するとき「 file:///c:/work/repos/project1」URL表記になっている点です。パスを間違えると以下のようなエラーになることがありますので注意してください。

C:\work\tmp>svn import c:\work\repos\project1 -m "initial commit."
svn: E205000: より詳しく知りたいときは 'svn help' を試してみてください
svn: E205000: 'C:/work/repos/project1' は不正な URL です

インポートに利用した、tmp フォルダは削除しておきます。すでにリポジトリに登録されているため削除しても問題ありません。

C:\work>cd tmp

C:\work\tmp>cd ..

C:\work>del tmp
C:\work\tmp\*、よろしいですか (Y/N)? yes

レッスン 5. チェックアウト

チェックアウトは、リポジトリに登録されたソースコードを開発環境(自分の環境)にもってくることで開発作業を進めます。自分の環境にコピーを取得(今後、作業コピーといいます)するためのコマンドをチェックアウトと言います。

それでは、実際にプロジェクト用のフォルダに移動して作業コピーをチェックアウトします。

C:\work>

C:\work>svn checkout file:///c:/work/repos/project1
A    project1\trunk                  #A はファイルが追加されたことを意味します。
A    project1\trunk\readme.txt
A    project1\branches
A    project1\tags
リビジョン 1 をチェックアウトしました。

レッスン 6. 作業ディレクトリで作業開始

チェックアウトが完了しました。これからこのチェックアウトされた作業コピーフォルダで開発を進めていくことになります。 c:workproject1 を見てみます。

C:\work\project1 のディレクトリ
2013/05/21  17:52    <DIR>          .
2013/05/21  17:52    <DIR>          ..
2013/05/21  17:52    <DIR>          branches                          # リポジトリから取得
2013/05/21  17:52    <DIR>          tags                              # リポジトリから取得
2013/05/21  17:52    <DIR>          trunk                             # リポジトリから取得

C:\work\project1>dir trunk

C:\work\project1\trunk のディレクトリ
2013/05/21  17:52    <DIR>          .
2013/05/21  17:52    <DIR>          ..
2013/05/21  17:52                31 readme.txt                        # リポジトリから取得

C:\work\project1>type trunk\readme.txt                                # インポートしたファイルの中身が確認できます
"Sample Project readme file"

レッスン 7. 新しいファイルを作成・追加

リポジトリから作業コピーを取得しました。次にファイルを追加してみます。 使い慣れたエディタを使って、以下のファイルを作成します。 [tutorial.html]を作成します。


<html>
 <body>

 <h1>Subversion チュートリアル</h1>
 <ol>
  <li>リポジトリ作成</li>
  <li>作業コピー作成</li>
  <li>開発作業</li>
  <li>コミット</li>
 </ol>

 </body>
</html>

コマンドプロンプトからリポジトリにファイルを追加するコマンドを実行します。

C:\work\project1\trunk>svn status     # status でリポジトリと作業コピーの状態を確認します。? はリポジトリ管理外。
?       tutorial.html

これで、作業コピーで新しく追加ファイル「tutorial.html」をリポジトリにコミットして追加しました。 他のメンバーがリポジトリから作業コピーをチェックアウトした場合、tutorial.html が追加された状態でチェックアウトされます。

警告

コミットとは、作業コピーの変更した内容をリポジトリに送ります。コミットして初めてリポジトリに反映されます。

/bootcamp/wp-content/themes/_btcp/images/subversion-07.jpg

レッスン 8. 新しいディレクトリを作成・追加

ディレクトリの追加やディレクトリに含まれるファイル群の追加をやっていきます。 やり方はファイルの追加と同じです。
フォルダA,BとBフォルダに2つのテキストファイルを作成します。

C:\work\project1\trunk>mkdir A
C:\work\project1\trunk>mkdir B
C:\work\project1\trunk>echo hello world! > B\hello.txt
C:\work\project1\trunk>echo こんにちは > B\こんにちは.txt

svn status で状態を確認します。

C:\work\project1\trunk>svn status
?       A
?       B

フォルダAとフォルダBをリポジトリに追加するコマンドを実行します。フォルダBにはテキストファイルが含まれていることに注意してください。

C:\work\project1\trunk>svn add A
A         A

C:\work\project1\trunk>svn add B
A         B
A         B\hello.txt
A         B\こんにちは.txt

ファイルを追加したときと同じようにコミットします。「-m」はコミット時のコメントです。後で見て分かりやすいように変更点や修正内容を書くようにするべきです。

C:\work\project1\trunk>svn commit -m "A,Bフォルダを一括登録した"
追加しています              A
追加しています              B
追加しています              B\hello.txt
追加しています              B\こんにちは.txt
ファイルのデータを送信しています ..
Committed revision 3.

レッスン 9. ファイルを更新

それでは、ファイルの中身を編集してバージョン管理システムの特長を見ていきましょう。 テキストエディタで trunk/readme.txt を開きます。 2行追加します。

<li>「-m]はコミット時の更新内容を記述します</li>
<li>バージョン管理システムの更新</li>

ファイルを保存して閉じた後、コマンドプロントに戻ります。 ファイルの状態を確認してください。

C:\work\project1\trunk>svn status
M       tutorial.html

編集したファイルに「M」というマークが付いています。これは作業コピー内のファイルに変更があったことを示しています。 続いてコミットを行います。

C:\work\project1\trunk>svn commit -m "手順を追加した"
送信しています              tutorial.html
ファイルのデータを送信しています .
Committed revision 4.

もう一度同じファイルに以下の行を追加します。

<li>ファイルの更新</li>

今編集しているファイルはリポジトリのファイルより新しい修正が追加されています。コミットする前にその内容を確認しています。

C:\work\project1\trunk>svn diff tutorial.html
Index: tutorial.html
===================================================================
--- tutorial.html       (リビジョン 6)
+++ tutorial.html       (作業コピー)
@@ -9,6 +9,7 @@
   <li>コミット</li>
   <li>「-m]はコミット時の更新内容を記述します</li>
   <li>バージョン管理システムの更新</li>
+  <li>ファイルの更新</li>                   # リポジトリと作業コピーの diff(比較)
  </ol>                                      # 作業コピーのみ「+」追加された行があることを示しています。

  </body>

修正内容を確認したらコミットします。コミットは何度もやっているので同じように svn commit -m “コメント” で実行します。

/bootcamp/wp-content/themes/_btcp/images/subversion-09.jpg

レッスン 10. ファイルを移動

ファイルの移動はエクスプローラーを利用しておこなうとリポジトリと作業コピーの差異が生まれます。これはディレクトリが不完全になることを意味しています。リポジトリと作業コピーは同期されていることが必要です。 例えば、/project1/trunk/tutorial.html をエクスプローラーで /project1 配下に移動した場合、svn status はどうなるか見てみると、

C:\work\project1>svn status
!       trunk\tutorial.html         # アイテムが失われた。ディレクトリが不完全な状態
?       tutorial.html               # リポジトリ管理外のファイルを見つけた

ファイルの移動は以下のように行います。

C:\work\project1>svn move trunk\readme.txt .            # 移動元と移動先(ここでは、/trunk 配下)を指定
A         readme.txt                  # ファイルが追加
D         trunk\readme.txt            # ファイルが削除

この操作もコミットしなければリポジトリに反映されないことに注意してください。

警告

ファイルの移動は svn copy の後に svn delete を実行することと同じです。

レッスン 11. ファイル名を変更

ファイル名の変更もファイルの移動と同じでエクスプローラーではなく、svn rename で変更する必要があります。

C:\work\project1\trunk>svn rename tutorial.html tutorial2.html
A         tutorial2.html             # ファイルが追加
D         tutorial.html              # ファイルが削除

コミットは必要ですので忘れずに実行します。

レッスン 12. ファイルを削除

ファイルの削除を実行します。

C:\work\project1\trunk>svn delete tutorial2.html
D         tutorial2.html

コミットは必要です。

C:\work\project1\trunk>svn commit -m "tutorial2.html を削除"
削除しています              tutorial2.html

Committed revision 10.

ファイルの移動、ファイル名の変更、ファイルの削除はバージョン管理されているファイル群のみ使うことができます。

レッスン 13. 履歴を確認

最後にこれまでの変更履歴を確認してみます。 履歴を確認する方法として、2つのコマンドを覚えておけば良いです。

svn log

ファイルやディレクトリの履歴情報を確認することができます。チュートリアルの trunk フォルダで確認します。

C:\work\project1>cd trunk

C:\work\project1\trunk>svn log
------------------------------------------------------------------------
r4 | syoji | 2013-05-21 18:35:56 +0900 (火, 21 5 2013) | 1 line

手順を追加した
------------------------------------------------------------------------
r3 | syoji | 2013-05-21 18:18:27 +0900 (火, 21 5 2013) | 1 line

A,Bフォルダを一括登録した
------------------------------------------------------------------------
r2 | syoji | 2013-05-21 18:07:33 +0900 (火, 21 5 2013) | 1 line

tutorial 新しいファイル追加した
------------------------------------------------------------------------
r1 | syoji | 2013-05-21 17:05:04 +0900 (火, 21 5 2013) | 1 line

initial commit.
------------------------------------------------------------------------

svn diff

レッスン 9. ファイルの更新で利用しています。ファイルの差分を表示することができます。

最後に

これで Subversion の基本学習用チュートリアルは終了します。 よく使うコマンドを中心に説明していますが、チームでの複数メンバーによる開発や Subversion / TortoiseSVN の高度な機能については説明していません。

このチュートリアルはいったんこれで終了します。 さて、次は何をすればよいでしょうか? バージョン管理のアプリケーションを理解する一番の近道は実際に使ってみることです。 あなたの開発で利用しはじめてください。あなたが所属する会社やチームでバージョン管理を使っていなかったり、別のツールを使っている場合があるかもしれません。そんなときでも、ひとりで Subversion / TortoiseSVN を使うことは可能です。

さらに、ネットには数多くの良質なコンテンツがたくさんあります。Subversion / TortoiseSVN の専門書籍も多く出版されています。ぜひ参照して快適な開発ライフを。

参考資料


社内サーバにリモートリポジトリを作るのも一つですが、「開発にまつわる面倒事」をこの際全部、tracpath(トラックパス)に任せてみませんか?
バージョン管理サービス・プロジェクト管理サービスの「tracpath(トラックパス)」では、
ユーザー5名、リポジトリ数3つまで、永久無料で利用可能です。

さっそく実務でも使って見ましょう。
自らも開発を行う会社が作ったからこそ、開発チームの「作る情熱」を支える、やるべきことに集中出来るサービスになっています。
エンタープライズ利用が前提のASPサービスなので、セキュリティも強固です。