ksaitoの日記

日々試したことの覚え書き

BazaarとSubversion

bzr-svnを使ってSubversionでセンター管理されてれいるソースをローカルでbazaarで管理することができます。
Subversionにアクセスできないときにローカルのbazaarにコミットしておいて、Subversionにアクセスできるときに、まとめてコミトできます。
Subversionの古いバージョンで作成したリポジトリを使っている場合、マージトラッキングがサポートされませんが、bzr-svnを使うとbzrのマージトラッキングを使うことができます。
開発ツールによっては、各ディレクトリに作成される.svnディレクトリを勝手に削除したりするツールがあります。
こうした開発ツールのソースは、Subversionのexportとsvn_load_dir.plを使っていました。
bzrは、トップディレクトリに.bzrを作るだけなので、bzr-svnを使うと管理が簡単になります。

インストール

aptでSubversion, bazaar, bzr-svnをインストールします。

$ sudo apt-get subversion bzr bzr-svn

subversion用のテストリポジトリ

Subversionの適当なリポジトリを用意します。

$ export REPO=/tmp/svn
$ svn ls $REPO
branches/
tags/
trunk/
$ 

bzr-svn用のbzrリポジトリを作成

オプションに--rich-root-packを付けてbzrリポジトリを作成します。
このオプションを付けることでSubversionリポジトリを扱うことがでるようになります。

$ bzr init-repo --rich-root-pack bzr-repo
Shared repository with trees (format: rich-root-pack)
Location:
  shared repository: bzr-repo
$ 
$ cd bzr-repo/
$ ls -la
合計 12
drwxr-xr-x 3 ksaito ksaito 4096 2010-05-13 22:55 .
drwxr-xr-x 4 ksaito ksaito 4096 2010-05-13 22:55 ..
drwxr-xr-x 4 ksaito ksaito 4096 2010-05-13 22:55 .bzr
$ 

subversionのtrunkをbzrリポジトリにチェックアウト

bzrのcoコマンドでSubversionリポジトリのURLを指定します。

$ bzr co $REPO/trunk svn-trunk
Initialising Subversion metadata cache in /home/ksaito/.cache/bazaar/svn/12dd016d-98d1-4012-84ba-f756777f9405.
$ ls                                                                           
svn-trunk
$

bzrリポジトリに作業用のブランチを作成

ローカル作業用にbzrのブランチを作成します。

$ bzr branch svn-trunk svn-branch
Branched 1 revision(s).                                                        
$ ls
svn-branch  svn-trunk
$ 

bzrリポジトリの作業用ブランチで開発

作成したブランチで通常の開発をします。
bzrヘのコミットはできますが、Subversionには反映されません。

$ cd svn-branch/
$ touch test1.txt
$ touch test2.txt
$ bzr st
unknown:
  test1.txt
  test2.txt
$ bzr add
adding test1.txt
adding test2.txt
$ bzr commit -m "Added test files."
Committing to: /home/ksaito/tmp/bzr-repo/svn-branch/                           
added test1.txt
added test2.txt
Committed revision 2.
$ 

bzrリポジトリの作業用ディレクトリの修正をSubversionにコミット

bzrにコミットした内容をSubversionに反映します。

$ svn ls $REPO/trunk
$ cd ../svn-trunk/
$ bzr update
Tree is up to date at revision 1.                                              
$ bzr merge ../svn-branch
+N  test1.txt                                                                  
+N  test2.txt
All changes applied successfully.                                              
$ bzr commit -m "commit for svn"
Committing to: /home/ksaito/tmp/svn/trunk                                      
added test1.txt
added test2.txt
Committed revision 2.                                                          
$ svn ls $REPO/trunk
test1.txt
test2.txt
$ svn log $REPO/trunk
------------------------------------------------------------------------
r2 | ksaito | 2010-05-13 23:06:37 +0900 (水, 13  5月 2010) | 1 line

commit for svn
------------------------------------------------------------------------
r1 | ksaito | 2010-05-13 22:53:32 +0900 (水, 13  5月 2010) | 1 line

init
------------------------------------------------------------------------
$ 

Subversionリポジトリで修正

Subversion側で修正が発生した場合の取り込み方法です。
まず、Subversionのソースを修正します。

$ svn co $REPO/trunk
A    trunk/test2.txt
A    trunk/test1.txt
Checked out revision 2.
$ cd trunk/
$ ls
test1.txt  test2.txt
$ touch test3.txt
$ svn add test3.txt 
A         test3.txt
$ svn commit -m "add test3.txt"
Adding         test3.txt
Transmitting file data .
Committed revision 3.
$

bzrのローカルブランチに取り込み

bzrに修正を取り込みます。

$ bzr update
+N  test3.txt                                                                  
All changes applied successfully.                                              
Updated to revision 3.
$ cd ../svn-branch
$ bzr pull
Using saved parent location: /home/ksaito/tmp/bzr-repo/svn-trunk/
+N  test3.txt                                                                  
All changes applied successfully.                                              
Now on revision 3.
$