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」ユーザの変更が反映されている。
今日はここまで。
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」ユーザの変更が反映されている。
今日はここまで。