とゆーコトで

subversion を試しに使ってみたので以下にポイント列挙。

リポジトリの作成

$ svnadmin create /path/to/repositry

rails プロジェクト作成と import

$ rails depot
(出力略)
$ ls
depot
$ svn import depot file:///path/to/repositry/depot -m "initial project"
(出力略)

消して co してみる

$ rm -rf depot
$ svn co file:///path/to/repositry/depot
$ ls
depot
$

conflict の解決とリポジトリからの削除を試す

ディレクトリの登録
~$ mkdir docTest
~/docTest$ cd docTest
~/docTest$ cat > README.txt
This is a pen.
^D
~/docTest$ cat README.txt
This is a pen.
~$ cd ..
~$ svn import docTest file:///path/to/repository/docTest -m "Initial ver."
(出力略) <- ?? revision 2 になっているが??
~$
削除して co
~$ rm -rf docTest
~$ svn co file:///path/to/repository/docTest
(出力略)
~$ ls
docTest
~$ 
conflict な状態を作ってみる
~$ mkdir tmp
~/tmp$ cd tmp
~/tmp$ svn co file:///path/to/repository/docTest
(出力は略)
~/tmp$ ls
docTest
~/tmp$ cd docTest
~/tmp/docTest$ ls
README.txt
~/tmp/docTest$ cat >>README.txt
abcdefghijklmn
^D
~/tmp/docTest$ cat README.txt
This is a pen.
abcdefghijklmn
~/tmp/docTest$ 
もう一つの作業コピーの方でもモディファイ
~/tmp/docTest$ cd
~$ cd docTest
~/docTest$ ls
README.txt
~/docTest$ cat >>README.txt
I'm a ULtraman!
^D
~/docTest$ 
svn up してみると??
~/docTest$ svn update
リビジョン 2 です。
~/docTest$ 
問題なし。で、commit かけてみる。
~/docTest$ svn commit
送信しています              README.txt
ファイルのデータを送信中です.
リビジョン 3 をコミットしました。
~/docTest$ 
もう一つの作業コピーで update すると??
~/docTest$ cd
~$ cd tmp/docTest
~/tmp/docTest$ svn update
C  README.txt
リビジョン 3 に更新しました。
~/tmp/docTest$ ls
README.txt  README.txt.mine  README.txt.r2  README.txt.r3
~/tmp/docTest$
なんだこれは、とゆー事でマニュアル参照

Subversion でバージョン管理
http://www.02.246.ne.jp/~torutk/subversion/intro.html より

例えば、aFileにコンフリクトが発生すると

aFile
コンフリクトが発生した個所にその状況が挿入されたファイル
aFile.mine
作業コピーをupdateする前のファイルは、これにリネームされる
aFile.rXXXX (XXXXはupdate前の作業ファイルのチェックアウトされた時の内容)
update前の作業コピーが紐付けされているリポジトリの内容
aFile.rXXXX (XXXXはupdate後のリポジトリの内容)
updateによって最新となるリポジトリの内容

実際、中身はこんな感じになっている。
~/tmp/docTest$ cat README.txt
This is a pen.
<<<<<<< .mine
abcdefghijklmn
=======
I'm a ULtraman!
>>>>>>> .r3
~/tmp/docTest$ cat README.txt.mine 
This is a pen.
abcdefghijklmn
~/tmp/docTest$ cat README.txt.r2
This is a pen.
~/tmp/docTest$ cat README.txt.r3
This is a pen.
I'm a ULtraman!
~/tmp/docTest$ 
この状態で commit かけれるの??
~/tmp/docTest$ svn commit
svn: コミットに失敗しました (詳しい理由は以下のとおりです):
svn: コミットを中止しています: '~/tmp/docTest/README.txt' がまだ衝突しています
~/tmp/docTest$ 
駄目。< 当たり前

Subversion によるバージョン管理
http://subversion.bluegate.org/doc/book.html
によると解決方法は三つあるとの事。(全て手動による解決)

  1. 「手で」 衝突テキストをマージ。( ファイル中の衝突マーカを調べ編集することによる)
  2. 作業ファイルに、一時ファイルのどれかを上書き。
  3. svn revert を実行して、ローカルでしたすべての変更を捨てる。

このときSubversionは三つの一時ファイルが削除されるまで sandwich.txtのコミットを許可 しません。

とあるように、ファイルを削除すれば無理矢理 commit も可能かも。
自分が修正したものを commit する形で試してみる。

~/tmp/docTest$ cp README.txt.mine README.txt
~/tmp/docTest$ rm README.txt.*
~/tmp/docTest$ ls
README.txt
~/tmp/docTest$ svn commit
送信しています              README.txt
ファイルのデータを送信中です.
リビジョン 4 をコミットしました。
~/tmp/docTest$ 

cvs よりゃ確かに良いな。

cvs ん時ゃ update して commit ねー、でリポジトリが壊れた事象を知ってます。

で、いぢくり回したこの docTest をリポジトリから消したい。

やってみる。

$ svn delete file:///path/to/repository/docTest
	
リビジョン 5 をコミットしました。
$
で、co したら??
$ svn co file:///path/to/repository/docTest
svn: URL 'file:///home/rms/svn.rep/docTest' は存在しません
$

svn delete で URL を指定すればリポジトリからディレクトリが削除され、ファイルを指定すればファイルがリポジトリの該当ディレクトリから削除。
URL の指定、面倒臭いんだけど CVSROOT にあたる環境変数は無いらしい。
プロジェクト管理においては URL を周知する必要あり??
ディレクトリを delete しちゃう (デキる) 権限とか設定可能なの??