It's raining cats and dogs.

無駄なことなんてないはず

subversionをコマンドで使う練習その3

今回は「競合(コンフリクト)」することにする。
「foo」というアカウントを作り、リポジトリからファイルをチェックアウトする。

foo$ cd /home/foo/work
foo$ svn co file:///home/hoge/svn-repos/hoge_prj/trunk hoge_prj
A  hoge_prj/names.txt
A  hoge_prj/address.txt
リビジョン 2 をチェックアウトしました。

無事チェックアウトされたようだ。
で、「hoge」ユーザが「address.txt」を編集する。

hoge$ cat /home/hoge/work/hoge_prj/address.txt
tokyo
kanagawa
chiba
saitama
gunma     ←ここを追加
tochigi   ←ここを追加

で、変更点をコミットしてみる。

hoge$ svn commit -m "add address"
送信しています              address.txt
ファイルのデータを送信中です.
リビジョン 3 をコミットしました。

更新がされたようだ。
次は「foo」ユーザで状況をみてみる

foo$ svn status --show-updates
       *        2   address.txt
状態の背景となるリビジョン:      3

となった。「foo」からリポジトリをみると
「address.txt」がローカルではリビジョン2だが、リポジトリはリビジョン3になっていることがわかる。
ちなみに「*」はファイルが存在することをしめす。
「foo」ユーザからみて、ローカルの「address.txt」がリポジトリの「address.txt」とどう違うか確認する。

foo$ svn diff -rHEAD address.txt
Index: address.txt
===================================================================
--- address.txt (リビジョン 3)
+++ address.txt (作業コピー)
@@ -2,5 +2,3 @@
 kanagawa
 chiba
 saitama
-gunma
-tochigi

となる。「−」が付いている行が、ローカルにはないが、リポジトリの「address.txt」には
追加されているのがわかる。
「-rHEAD」オプションをつけると、リポジトリ内の最新のリビジョンのファイルとローカルのファイルを比較するが
このオプションをつけない場合は、ローカルのファイルをチェックアウトしたときのリビジョン、すなわちこの場合は
リポジトリ内のリビジョン2のファイルとローカルのファイルを比較する。

ローカルのファイルを最新のリビジョンのファイルに更新する。

foo$ svn update
U  address.txt
リビジョン 3 に更新しました。

更新された。「U」は更新されたことをしめす。


次は同時にファイルを更新する。まずは「hoge」ユーザが以下のように修正する。

hoge$ cat address.txt
TOKYO     ←ここを大文字にする。
kanagawa
chiba
saitama
gunma
tochigi

続いて、「foo」ユーザが更新する。

foo$ cat address.txt
tokyo
kanagawa
chiba
saitama
gunma
tochigi
shizuoka   ←ここを追加

で、「hoge」ユーザが先にコミットする。

hoge$ svn commit -m "tokyo is BIG"
送信しています              address.txt
ファイルのデータを送信中です.
リビジョン 4 をコミットしました。

続いて「foo」ユーザがコミットする。

foo$ svn commit -m "add shizuoka"
送信しています              address.txt
svn: コミットに失敗しました (詳しい理由は以下のとおりです):
svn: Out of date: '/hoge_prj/trunk/address.txt' in transaction '5'

失敗した。「hoge」が先のコミットしたので、まぁ当然。
なので、まず、「hoge」の変更内容を「foo」のほうに適用する。

foo$ svn update
G  address.txt
リビジョン 4 に更新しました。

更新されたので、「foo」ユーザの「address.txt」を確認してみる。

foo$ cat address.txt
TOKYO      ←「hoge」の変更内容が追加されている。
kanagawa
chiba
saitama
gunma
tochigi
shizuoka   ←「foo」が追加した内容は残ったまま

「hoge」の変更内容が追加されたが「foo」の追加した内容は残ったままだ。
うまくマージできたみたい。
でも、ここで注意しなければいけないのが、「foo」の追加した内容は
まだリポジトリには反映されていないので、忘れずリポジトリに反映させておく。

foo$ svn commit -m "add shizuoka"
送信しています              address.txt
ファイルのデータを送信中です.
リビジョン 5 をコミットしました。

更新された。
忘れないように「hoge」ユーザのローカルも最新のリビジョンにしておく。

hoge$ svn status --show-updates
       *        4   address.txt
状態の背景となるリビジョン:      5

hoge$ svn update
U  address.txt
リビジョン 5 に更新しました。

ファイルを確認しておく。

hoge$ cat address.txt
TOKYO
kanagawa
chiba
saitama
gunma
tochigi
shizuoka    ←「foo」ユーザの変更が反映されている。

今日はここまで。