SVN は Subversion の略です。
Subversion は、フリー/オープンソースのバージョン管理システムです。 Subversion はファイルとディレクトリを経時的に管理します。ファイルのツリーが中央リポジトリに配置されます。リポジトリは、ファイルとディレクトリに加えられたすべての変更を記憶することを除いて、通常のファイル サーバーによく似ています。これにより、古いバージョンのコードを復元したり、コードの変更履歴を調べたりすることができます。
この記事では、いくつかの基本的な SVN コマンドを例を挙げて説明します。
SVN ワーキング コピー
SVN は、バージョン管理されたすべてのデータを保持するリポジトリであり、SVN サーバーとも呼ばれます。作業コピーと呼ばれるバージョン管理されたデータの一部のローカル リフレクションを管理する SVN クライアント プログラム。 SVN クライアントは、ネットワークを介してリポジトリにアクセスできます。複数のユーザーが同時にリポジトリにアクセスできます。
1. SVN チェックアウト – 作業コピーの作成
チェックアウト コマンドは、SVN リポジトリから作業コピーにソースをダウンロードするために使用されます。 SVN サーバーからファイルにアクセスする場合は、チェックアウトを最初に実行する必要があります。
SVN チェックアウトは作業コピーを作成し、そこからコンテンツの編集、削除、または追加を行うことができます。ファイル、ディレクトリ、トランク、またはプロジェクト全体をチェックアウトできます。チェックアウトするには、チェックアウトするコンポーネントの URL を知っている必要があります。
Syntax: $ svn checkout/co URL PATH
- URL はチェックアウトするコンポーネントの URL です
- PATH を省略すると、URL のベース名が宛先として使用されます。複数の URL が指定されている場合、それぞれが PATH のサブディレクトリにチェックアウトされ、サブディレクトリの名前が URL のベース名になります。
次の例では、指定されたターゲット ディレクトリにディレクトリをチェックアウトします。
$ svn co https://www.thegeekstuff.com/project/branches/release/migration/data/cfg /home/sasikala/cfg/ A /home/sasikala/cfg/ftp_user.cfg A /home/sasikala/cfg/inventory.cfg A /home/sasikala/cfg/email_user.cfg A /home/sasikala/cfg/svn-commands Checked out revision 811. $ ls /home/sasikala/cfg . .. .svn email_user.cfg ftp_user.cfg inventory.cfg svn-commands
チェックアウトを行うと、.svn という名前の隠しディレクトリが作成され、リポジトリの詳細が含まれます。
2. SVN コミット – 変更をリポジトリに保存
作業コピーに変更を加えても、SVN サーバーには反映されません。変更を永続的にするには、SVN コミットを行う必要があります。
Syntax: $ svn commit -m "log messages"
-m オプションでファイルを変更する理由を説明してください。
たとえば、私の作業コピーでは、「svn-commands」という名前のファイルには次の内容が含まれています。
$ cat /home/sasikala/cfg/svn-commands checkout commit add delete update status $ ls -l /home/sasikala/cfg/svn-commands -rw-r--r-- 1 root root 41 Apr 16 11:15 svn-commands
このファイルに変更を加えました (たとえば、このファイルを空にするなど)。
$ ls -l svn-commands -rw-r--r-- 1 root root 0 Apr 16 11:20 svn-commands
ここでファイルをコミットして、サーバーで変更を永続的にします。
$ svn commit -m "Making the file empty" svn-commands Sending svn-commands Transmitting file data . Committed revision 813.
この後、作業コピーまたはチェックアウトを更新するたびに、変更がサーバーに表示されます。
3. SVN リスト – ディレクトリ エントリを一覧表示します
svn list は、作業コピーをダウンロードせずに SVN リポジトリのコンテンツを表示したい場合に便利です。
Syntax: $ svn list
次の例では、作業コピーをダウンロードせずに、リポジトリ内の特定の URL で使用可能なすべてのファイルを一覧表示します。 –verbose オプションを指定して svn list コマンドを実行すると、次の情報が表示されます。
- 最後のコミットのリビジョン番号
- 最後のコミットの作成者
- サイズ (バイト単位)
- 最後のコミットの日時
$ svn list --verbose https://www.thegeekstuff.com/project/branches/release/migration/data/bin 16 sasikala 28361 Apr 16 21:11 README.txt 21 sasikala 0 Apr 18 12:22 INSTALL 22 sasikala Apr 18 10:17 src/
4. SVN 追加 – 新しいファイルを SVN リポジトリに追加
新しいファイル (またはディレクトリ) をリポジトリに追加する場合は、SVN add コマンドを使用する必要があります。リポジトリには、SVN コミットを行う場合にのみ、新しく追加されたファイルが含まれます。 「thegeekstuff」という新しいファイルをリポジトリに追加しましょう。
- ローカルの作業コピーにファイルを作成する
$ ls -l /home/sasikala/cfg/thegeekstuff -rw-r--r-- 1 sasikala root 8 Apr 16 11:33 thegeekstuff
svn add filename はファイルを SVN リポジトリに追加します。
$ svn add thegeekstuff A thegeekstuff
コミットするまで、追加されたファイルはリポジトリで利用できません。
$ svn commit -m "Adding a file thegeekstuff" thegeekstuff Adding thegeekstuff Transmitting file data . Committed revision 814.
5. SVN 削除 – リポジトリからファイルを削除
SVN delete コマンドは、作業コピー (またはリポジトリ) からアイテムを削除します。 SVN コミットを行うと、ファイルはリポジトリから削除されます。
Syntax: $ svn delete URL
次に、最近作成された「thegeekstuff」というファイルを削除しましょう。
$ svn delete thegeekstuff D thegeekstuff $ svn commit -m "Removing thegeekstuff file" thegeekstuff Deleting thegeekstuff Committed revision 814.
これで、svn list を実行して、ファイルがリポジトリから削除されたかどうかを確認できます。
6. SVN Diff – 違いを表示
SVN diff は、作業コピーと SVN リポジトリ内のコピーの違いを表示します。 2 つのリビジョンと 2 つのパスなどの違いを見つけることができます。
Syntax: $ svn diff filename $ svn -r R1:R2 diff filename
上記の例では、filename@R1 と filename@R2 を比較しています。
ファイル thegeekstuff の内容は次のようになります。
$ cat /home/sasikala/cfg/thegeekstuff testing
svn diff コマンドを使用して、以下に示すように、geekstuff ファイルの内容を testing から tester に編集しました。
$ svn diff thegeekstuff Index: thegeekstuff =================================================================== --- thegeekstuff (revision 815) +++ thegeekstuff (working copy) @@ -1 +1 @@ -testing +tester
7. SVN ステータス – 作業コピーのステータス
svn status コマンドを使用して、作業コピー内のファイルのステータスを取得します。作業コピーが変更されているか、追加/削除されているか、ファイルがリビジョン管理されていないかなどを表示します。
Syntax: $ svn status PATH
次の例は、私のローカル作業コピーのステータスを示しています。
$ svn status /home/sasikala/cfg M /home/sasikala/cfg/ftp_user.cfg M /home/sasikala/cfg/geekstuff
「M」は、アイテムが変更されたことを表します。 「svn help status」コマンドは、SVN status コマンドで表示されるさまざまな指定子について説明します。
8. SVN ログ – ログ メッセージの表示
この記事の冒頭で説明したように、SVN はファイルとディレクトリに加えられたすべての変更を記憶しています。ファイルまたはディレクトリで行われたすべてのコミットを知るには、SVN ログ コマンドを使用します。
Syntax: $ svn log PATH
以下は、geekstuff ファイルで行われたすべてのコミットを表示します
$ svn log thegeekstuff ------------------------------------------------------------------------ r815 | sasikala | 2011-04-16 05:14:18 -0700 (Sat, 16 Apr 2011) | 1 line Adding a file thegeekstuff ------------------------------------------------------------------------
ファイル thegeekstuff でコミットを 1 つだけ行ったため、詳細を含むログ メッセージは 1 つだけ表示されます。
9. SVN Move – ファイルまたはディレクトリの名前を変更
このコマンドは、あるディレクトリから別のディレクトリにファイルを移動したり、ファイルの名前を変更したりします。ファイルはすぐにローカル サンドボックスに移動されます (コミット後にリポジトリにも移動されます)。
Syntax: $ svn move src dest
次のコマンドは、ファイル「thegeekstuff」の名前を「tgs」に一気に変更します。
$ svn move thegeekstuff tgs A tgs D thegeekstuff $ ls .# .. .svn email_user.cfg ftp_user.cfg inventory.cfg tgs
現在、ファイルはリポジトリではなく、作業コピーでのみ名前が変更されます。変更を永続的にするには、変更をコミットする必要があります。
$ svn commit -m "Renaming thegeekstuff to tgs" tgs Adding tgs Transmitting file data . Committed revision 816.
10. SVN 更新 – 作業コピーを更新します。
svn update コマンドは、変更をリポジトリから作業コピーに取り込みます。リビジョンが指定されていない場合、作業コピーが HEAD リビジョンで最新になります。それ以外の場合は、作業コピーを引数で指定されたリビジョンに同期します。
作業コピーで作業を開始する前に、必ず作業コピーを更新してください。リポジトリで利用可能なすべての変更が作業コピーで利用できるようにします。つまり、最新の変更。
Syntax: $ svn update PATH
他のユーザーが URL https://www.thegeekstuff.com/project/branches/release/migration/data/cfg にファイルを追加/削除した場合、作業コピーを更新するまで、デフォルトでは作業コピーにこれらのファイルはありません。コピーしてください。
$ svn update A new/usercfg A new/webcfg Updated to revision 819.
上記の svn update コマンドの出力で、A はこのファイルが作業コピーに「追加」されたことを表します。