サンプル集  >  other  >  subversion
subversion
2008/06/09

subversion を使ってみます。

◆環境
OS Windows XP Professional Version 2002 Service Pack 3
subversion 1.4.5 (r25188) Aug 22 2007, 20:49:04

リポジトリの作成 (svmadmin create)

まずはリポジトリ用のディレクトリを作成します。 今回は、「C:\svntest\repos」を作成しました。

>mkdir c:\svntest\repos

>

リポジトリを初期化します。

>svnadmin create c:\svntest\repos

>

コマンドを実行しても特にメッセージも出ませんでしたが、リポジトリディレクトリを見たら色々できていました。

SVNTEST
└─repos
    │  format
    │  README.txt
    ├─conf
    │      authz
    │      passwd
    │      svnserve.conf
    ├─dav
    ├─db
    │  │  current
    │  │  format
    │  │  fs-type
    │  │  uuid
    │  │  write-lock
    │  ├─revprops
    │  │      0
    │  ├─revs
    │  │      0
    │  └─transactions
    ├─hooks
    │      post-commit.tmpl
    │      post-lock.tmpl
    │      post-revprop-change.tmpl
    │      post-unlock.tmpl
    │      pre-commit.tmpl
    │      pre-lock.tmpl
    │      pre-revprop-change.tmpl
    │      pre-unlock.tmpl
    │      start-commit.tmpl
    └─locks
            db-logs.lock
            db.lock

リポジトリに格納 (svm import)

まずはリポジトリに格納するファイルを作ります。

今回は c:\svntest 配下に MyProject というフォルダを作り、その中に readme.txt を作りました。 これをリポジトリに格納してみます。

>cd svntest

svntest>mkdir MyProject

svntest>cd MyProject

svntest\MyProject>echo hello subversion!! > readme.txt

svntest\MyProject>type readme.txt
hello subversion!!

リポジトリへの格納は svn import を使います。

svntest\MyProject>svn import file:///c:/svntest/repos/MyProject -m "fir
st import."
追加しています              readme.txt

リビジョン 1 をコミットしました。

リポジトリに追加されたようです。

リポジトリから取得 (svn checkout)

リポジトリに格納したファイルを取得してみます。

svntest 配下に aaa というフォルダを作成します。

svntest\MyProject>cd ..

svntest>mkdir aaa

svntest>cd aaa

svntest\aaa>

リポジトリからの取得は svn checkout を使います。

svntest\aaa>svn checkout file:///c:/svntest/repos/MyProject MyProject
A    MyProject\readme.txt
リビジョン 1 をチェックアウトしました。

svntest\aaa>dir /A
2009/02/04  16:00    <DIR>          .
2009/02/04  16:00    <DIR>          ..
2009/02/04  16:00    <DIR>          MyProject
               0 個のファイル                   0 バイト
               3 個のディレクトリ  65,123,459,072 バイトの空き領域

svntest\aaa>cd MyProject

svntest\aaa\MyProject>dir /A
2009/02/04  16:00    <DIR>          .
2009/02/04  16:00    <DIR>          ..
2009/02/04  16:00    <DIR>          .svn
2009/02/04  16:00                20 readme.txt
               1 個のファイル                  20 バイト
               3 個のディレクトリ  65,123,459,072 バイトの空き領域

無事チェックアウトできました。 隠し属性で「.svn」というディレクトリが追加されています。

変更点の比較 (svn diff)

チェックアウトしたファイルを変更し、リポジトリのものと比較します。

まずは、チェックアウトしたファイルを変更します。 「help!!」という文字をファイルに追記してみます。

svntest\aaa\MyProject>echo help!! >> readme.txt

変更内容の比較には svn diff を使います。

svntest\aaa\MyProject>svn diff
Index: readme.txt
===================================================================
--- readme.txt  (リビジョン 1)
+++ readme.txt  (作業コピー)
@@ -1 +1,2 @@
 hello subversion!!
+help!!

「help!!」の行の先頭に「+」と付いています。 行が追加されたという印でしょうか。

試しに、1行目を「hello svn!!」に変更して比較してみます。

svntest\aaa\MyProject>svn diff
Index: readme.txt
===================================================================
--- readme.txt  (リビジョン 1)
+++ readme.txt  (作業コピー)
@@ -1 +1,2 @@
-hello subversion!!
+hello svn!!
+help!!

「hello subversion!!」の行の先頭に「-」が、「hello svn!!」の行の先頭に「+」が付いています。 今、ローカルにあるファイルは「hello svn!!」です。 svn diff の出力結果の最初の方の行に「+++ readme.txt (作業コピー)」と表示されています。 ローカル=作業コピーで、それを表す記号が先頭の「+」という事でしょうか。

「hello svn!!」の行を削除して比較してみます。

svntest\aaa\MyProject>svn diff
Index: readme.txt
===================================================================
--- readme.txt  (リビジョン 1)
+++ readme.txt  (作業コピー)
@@ -1 +1 @@
-hello subversion!!
+help!!

「hello subversion!!」の行の先頭には「-」が付いています。

リポジトリにあるものの先頭には「-」が、ローカルにあるものの先頭には「+」が付くようです。

コミット (svn commit)

変更結果をリポジトリに反映(コミット)します。 svn commit を使います。

svntest\aaa\MyProject>svn commit -m "change message."
送信しています              readme.txt
ファイルのデータを送信しています .
リビジョン 2 をコミットしました。

無事コミットされたようです。 差分が無いか svn diff で比較してみます。

svntest\aaa\MyProject>svn diff

svntest\aaa\MyProject>

何も表示されませんでした。

ステータスの確認 (svn status)

今の状態を確認したい場合、svn status を使います。

svntest\aaa\MyProject>svn status

svntest\aaa\MyProject>

何も表示されませんでした。 何も変更していないので、何も表示されなくて良いと思います。

ファイルの追加

新しくファイルを作ります。

svntest\aaa\MyProject>echo hello!! > hello.txt

ステータスを確認します。

svntest\aaa\MyProject>svn status
?      hello.txt

新しいファイルが表示されました。 行の先頭には Subversionが知らないことを表す「?」が表示されています。

Subversion への追加は svn add を使います。

svntest\aaa\MyProject>svn add hello.txt
A         hello.txt

追加されたのでしょうか。 ステータスを見てみます。

svntest\aaa\MyProject>svn status
A      hello.txt

行の先頭の「?」が「A」に変わっていました。 この状態は「追加はしたけどまだコミットしていない」という状態です。 変更点の比較もしてみます。

svntest\aaa\MyProject>svn diff
Index: hello.txt
===================================================================
--- hello.txt   (リビジョン 0)
+++ hello.txt   (リビジョン 0)
@@ -0,0 +1 @@
+hello!!

「---」の行も「+++」の行もリビジョン 0 となっています。

コミットします。

svntest\aaa\MyProject>svn commit -m "add hello.txt."
追加しています              hello.txt
ファイルのデータを送信しています .
リビジョン 3 をコミットしました。

無事コミットできたようです。 状況を確認してみます。

svntest\aaa\MyProject>svn status

svntest\aaa\MyProject>

何も表示されなかったので、何も変更点は無いようです。

ファイル名の変更

ファイル名の変更には svn move を使います。 先程作った「hello.txt」を「aisatu.txt」という名前に変えてみます。

svntest\aaa\MyProject>svn move hello.txt aisatu.txt
A         aisatu.txt
D         hello.txt

aisatu.txt の先頭に追加を表す「A」が、hello.txt の先頭に「D」が表示されました。 状態を確認します。

svntest\aaa\MyProject>svn status
D      hello.txt
A  +   aisatu.txt

コミットします。

svntest\aaa\MyProject>svn commit -m "hello.txt -> aisatu.txt"
追加しています              aisatu.txt
削除しています              hello.txt

リビジョン 4 をコミットしました。

問題なくコミットできたようですが、一応状態を確認します。

svntest\aaa\MyProject>svn status

svntest\aaa\MyProject>

問題なさそうです。

ログの参照

ログを見る場合、svn log を使います。

最初に作成した readme.txt のログを見てみます。

svntest\aaa\MyProject>svn log readme.txt
----------------------------------------------------------------------
r2 | ymlib  | 2009-02-04 16:10:55 +0900 (水, 04 2 2009) | 1 line

change message.
----------------------------------------------------------------------
r1 | ymlib  | 2009-02-04 15:55:40 +0900 (水, 04 2 2009) | 1 line

first import.
----------------------------------------------------------------------

aisatu.txt のログを見てみます。


svntest\aaa\MyProject>svn log aisatu.txt
----------------------------------------------------------------------
r4 | ymlib  | 2009-02-04 16:22:37 +0900 (水, 04 2 2009) | 1 line

hello.txt -> aisatu.txt
----------------------------------------------------------------------
r3 | ymlib  | 2009-02-04 16:18:45 +0900 (水, 04 2 2009) | 1 line

add hello.txt.
----------------------------------------------------------------------

このログだけだと、元のファイルが hello.txt だったという事は分りません。 元々あった hello.txt のログはどうなっているでしょうか。 作成、変名とかが出ると良いのですが・・・

svntest\aaa\MyProject>svn log hello.txt
svn: 'hello.txt' はバージョン管理下におかれていません

「バージョン管理下におかれていない」と言われました。

ちなみに --limit オプションを付けると、指定した行数だけログを出力できます。

svntest\aaa\MyProject>svn log readme.txt --limit 1
----------------------------------------------------------------------
r2 | ymlib  | 2009-02-04 16:10:55 +0900 (水, 04 2 2009) | 1 line

change message.
----------------------------------------------------------------------

タグの作成 (svn copy)

タグの作成には、svn copy を使います。

svntest\aaa\MyProject>svn copy -m "tag 2.0" file:///c:/svntest/repos/My
Project file:///c:/svntest/repos/MyProject2

リビジョン 5 をコミットしました。

svntest\aaa\MyProject>

コピーといってもファイルが複写されるわけではなく、UNIXのハードリンクっぽい感じらしいです。

ブランチの作成 (svn copy)

ブランチも、リポジトリを copy することとほぼ同じです。(コマンドもまったく同じです???)

svntest\aaa\MyProject>svn copy -m "branch 3" file:///c:/svntest/repos/M
yProject file:///c:/svntest/repos/MyProject3

リビジョン 6 をコミットしました。

svntest\aaa\MyProject>

リポジトリの一覧 (svn ls)

作成したタグがリポジトリのディレクトリにあるかと思い見てみました。

SVNTEST\REPOS
├─conf
├─dav
├─db
│  ├─revprops
│  ├─revs
│  └─transactions
├─hooks
└─locks

MyProject2 とかのディレクトリが作成されているかと思ったのですが、それらしいものはありませんでした。

リポジトリの一覧の参照には svn ls を使います。

svntest\aaa\MyProject>svn ls file:///c:/svntest/repos
MyProject/
MyProject2/
MyProject3/

マージ (svn merge)

2つのリポジトリをマージしてみます。

まずは MyProject の aisatu.txt を更新します。

svntest\aaa\MyProject>echo konnitiwa!! > aisatu.txt

状況を確認します。

svntest\aaa\MyProject>svn status
M      aisatu.txt

aisatu.txt の先頭に「M」と出ています。 コミットします。

svntest\aaa\MyProject>svn commit -m "change."
送信しています              aisatu.txt
ファイルのデータを送信しています .
リビジョン 7 をコミットしました。

一応状態を確認します。

svntest\aaa\MyProject>svn status

svntest\aaa\MyProject>

bbb というフォルダを作り MyProject3 をチェックアウトします。

svntest\aaa\MyProject>cd ..\..

svntest>mkdir bbb

svntest>cd bbb

svntest\bbb>svn checkout file:///c:/svntest/repos/MyProject3
A    MyProject3\aisatu.txt
A    MyProject3\readme.txt
リビジョン 7 をチェックアウトしました。

チェックアウトした aisatu.txt を確認します。

svntest\bbb>cd MyProject3

svntest\bbb\MyProject3>type aisatu.txt
hello!!

MyProject3 からチェックアウトしたので、MyProject の修正は入っていません。 (当然ですが。)

MyProject3 に MyProject をマージします。 マージには svn merge を使用します。

svntest\bbb\MyProject3>svn merge -r 6:HEAD file:///c:/svntest/repos/MyP
roject
U    aisatu.txt

マージしたファイルの内容を確認します。

svntest\bbb\MyProject3>svn status
M      aisatu.txt

svntest\bbb\MyProject3>type aisatu.txt
konnitiwa!!

svntest\bbb\MyProject3>

状態は「M」になっていました。 内容は MyProject で更新した konnitiwa!! になりました。

コミットしてマージ結果を確定させます。

svntest\bbb\MyProject3>svn commit -m "merge MyProject"
送信しています              aisatu.txt
ファイルのデータを送信しています .
リビジョン 8 をコミットしました。

svntest\bbb\MyProject3>

指定したリビジョンの内容を表示 (svn cat)

任意のリビジョンの内容を表示するには svn cat を使います。

svntest\bbb\MyProject3>svn cat -r8 aisatu.txt
konnitiwa!!

svntest\bbb\MyProject3>svn cat -r6 aisatu.txt
hello!!

svntest\bbb\MyProject3>svn cat -r4 aisatu.txt
hello!!

指定したリビジョンを取得 (svn update)

先程マージした aisatu.txt をマージ前に戻してみます。

まずは、aisatu.txt のログを見ます。

svntest\bbb\MyProject3>svn log aisatu.txt
----------------------------------------------------------------------
r8 | ymlib  | 2009-02-04 16:56:57 +0900 (水, 04 2 2009) | 1 line

merge MyProject
----------------------------------------------------------------------
r6 | ymlib  | 2009-02-04 16:38:05 +0900 (水, 04 2 2009) | 1 line

branch 3
----------------------------------------------------------------------
r4 | ymlib  | 2009-02-04 16:22:37 +0900 (水, 04 2 2009) | 1 line

hello.txt -> aisatu.txt
----------------------------------------------------------------------
r3 | ymlib  | 2009-02-04 16:18:45 +0900 (水, 04 2 2009) | 1 line

add hello.txt.
----------------------------------------------------------------------

r6 (リビジョン6) がマージ前のものなので、それに戻します。 リビジョンを指定して更新するには svn update を使います。

svntest\bbb\MyProject3>svn update -r6 aisatu.txt
U    aisatu.txt
リビジョン 6 に更新しました。

リビジョン 6 を取得できたようです。 内容と状態を確認します。

svntest\bbb\MyProject3>type aisatu.txt
hello!!

svntest\bbb\MyProject3>svn status

svntest\bbb\MyProject3>

状態は「M」になるかと思っていたのですが、何も表示されませんでした。

ログを確認します。

svntest\bbb\MyProject3>svn log aisatu.txt
----------------------------------------------------------------------
r6 | ymlib  | 2009-02-04 16:38:05 +0900 (水, 04 2 2009) | 1 line

branch 3
----------------------------------------------------------------------
r4 | ymlib  | 2009-02-04 16:22:37 +0900 (水, 04 2 2009) | 1 line

hello.txt -> aisatu.txt
----------------------------------------------------------------------
r3 | ymlib  | 2009-02-04 16:18:45 +0900 (水, 04 2 2009) | 1 line

add hello.txt.
----------------------------------------------------------------------

r8 が無くなっています! svn update で古いリビジョンを取得すると、それ以降のものは消えるようです。

試しに r3 に戻してみます。

svntest\bbb\MyProject3>svn update -r3 aisatu.txt
D    aisatu.txt
リビジョン 3 に更新しました。

先頭に「D」と出ています。 ファイルを確認すると aisatu.txt が無くなっていました!

元々 aisatu.txt は hello.txt の名前を変えたもので、最初に追加した時点では hello.txt という名前でした。 r3 の時点では hello.txt という名前で、aisatu.txt は無かったため削除されたのだと思います。 ただ、それなら hello.txt が出来れば良かったのですが・・・

とりあえず aisatu.txt を復活させたいので svn checkout で取得し直します。

svntest\bbb\MyProject3>svn checkout file:///c:/svntest/repos/MyProject/
aisatu.txt
svn: URL 'file:///c:/svntest/repos/MyProject/aisatu.txt' が参照している
のはファイルです。ディレクトリではありません

ファイル名を指定してチェックアウトできるかなぁと勘でやってみましたがエラーになりました。

仕方が無いので MyProject3 をチェックアウトし直しました。

svntest\bbb\MyProject3>cd ..

svntest\bbb>svn checkout file:///c:/svntest/repos/MyProject3
A    MyProject3\aisatu.txt
リビジョン 8 をチェックアウトしました。

▲ PageTop  ■ Home


Copyright (C) 2013 ymlib.com