目次

Bazaar 分散バージョン管理システム

バージョン管理システム。開発が停滞しているなどで 2013年ごろから人気がなくなってきた印象。

nvda 本家、および nvdajp にて使用していた。

pythonで実装されているがmercurialとはかなりインタフェースが異なる。

数字でリビジョン番号がつけられるところはsubversionに近い。

サブコマンドの説明を見るには bzr help サブコマンド

資料

Win32で使う

http://wiki.bazaar.canonical.com/WindowsDownloads

bzr-2.4.2-1-setup.exe が利用可能(2011年11月現在)

インストール先を c:\usr\Bazaar にして、launchpad.net プラグイン以外のオプションを外す。

ssh key

launchpad.net に push するための ssh key の置き場所は C:¥Documents and Settings¥%USERNAME%¥.ssh¥id_rsa

Mac で使う

since 2012-07-12

macports

$ sudo port install bzr

エラーになった:

Error: org.macports.activate for port py27-docutils returned: 
Image error: /opt/local/Library/Frameworks/Python.framework/Versions/2.7/bin/rst2html.py already exists and does not belong to a registered port.  
Unable to activate port py27-docutils. 
Use 'port -f activate py27-docutils' to force the activation.
Error: Failed to install py27-docutils
Please see the log file for port py27-docutils for details:
    /opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_python_py-docutils/py27-docutils/main.log
Error: The following dependencies were not installed: py27-docutils py27-paramiko py27-pyrex
To report a bug, follow the instructions in the guide:
    http://guide.macports.org/#project.tickets
Error: Processing of port bzr failed

py27-docutils @0.9_0 と @0.9_1 があったので、両方消して入れ直した。

$ sudo port selfupdate
$ sudo port uninstall py27-docutils @0.9_0
$ sudo port uninstall py27-docutils
# これで両方消える
$ sudo port install bzr
# また docutils で止まる
$ sudo port -f activate py27-docutils
# 今度は activate に成功する
$ sudo port install bzr

$ which bzr
/opt/local/bin/bzr

Ubuntu/cygwin で bzr を使う

Ubuntu でのインストールは "sudo apt-get install bzr"

PPA を使う

since 2010-12-17

Ubuntu 9.04 のままで launchpad.net を使いたい。

http://wiki.bazaar.canonical.com/DistroDownloads#Ubuntu

$ sudo emacs -nw /etc/apt/sources.list

下記を末尾に追加:

deb http://ppa.launchpad.net/bzr/ppa/ubuntu jaunty main 
deb-src http://ppa.launchpad.net/bzr/ppa/ubuntu jaunty main 

下記を実行:

$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 8C6C1EFD
$ sudo apt-get update
$ sudo apt-get install bzr

cygwin で bzr を使ってみる

入れようと思ったら入っていた。

$ bzr --version
Bazaar (bzr) 2.0.0
  Python interpreter: /usr/bin/python 2.5.2
  Python standard library: /usr/lib/python2.5
  Platform: CYGWIN_NT-5.1-1.7.1-0.218-5-3-i686-32bit
  bzrlib: /usr/lib/python2.5/site-packages/bzrlib
  Bazaar configuration: /home/nishi/.bazaar
  Bazaar log file: /home/nishi/.bzr.log

Copyright 2005, 2006, 2007, 2008, 2009 Canonical Ltd.
http://bazaar-vcs.org/

bzr comes with ABSOLUTELY NO WARRANTY.  bzr is free software, and
you may use, modify and redistribute it under the terms of the GNU
General Public License version 2 or later.

ひとりで一台のマシンで使う

自分のディレクトリの中でひとりでファイルのバージョンを管理する。 mercurialっぽい使い方。 後述する bzr help init に書かれているレシピである。

sourceforge.jp からプロジェクトを取得

sourceforge.jp の bazaar で nvdajp の main を落とす。

cygwin で作った /home/nishi/.ssh/id_rsa.pub は登録済み。
$ ssh nishimoto@shell.sourceforge.jp はちゃんと動く。
ssh protocol version 2 対応が必要。

最初に自分の名前を登録する。

$ bzr whoami "Takuya Nishimoto <nishimotz@gmail.com>"

bzr branchをためす

bzr branchは「既存のブランチに基づいたブランチを手に入れる」コマンド。

$ bzr branch http://bzr.sourceforge.jp/view/nvdajp/main
Branched 3405 revision(s).

$ ls
main

$ cd main

$ bzr info
Standalone tree (format: unnamed)
Location:
  branch root: .

Related branches:
  parent branch: http://bzr.sourceforge.jp/view/nvdajp/main/

SVNっぽくcheckoutしてみる

bzr checkout –lightweight は svn っぽく使う方法らしいので試す。

$ bzr co --lightweight http://bzr.sourceforge.jp/view/nvdajp/main

これでもちゃんとカレントに main ディレクトリを作ってくれる。

$ cd main
$ bzr update

これでサーバから最新版を取ってくることができるようだ。

ssh+bzrを使う

sf.jp のガイドには bzr branch を使えと書いてあるが、ひねくれて co –lightweight してみる。

$ bzr co --lightweight bzr+ssh://nishimoto@bzr.sourceforge.jp/bzrroot/nvdajp/main

うまくいった。 cd main; bzr update も問題ない。

checkoutとbranch

since 2011-11-19

bzr checkout と bzr branch はどのように使い分けたらいいか?

bzr checkout

bzr checkout はリモートのブランチの作業コピーを作る:

bzr checkout http://remote/branch workingdir

bzr update すると作業コピーが更新され、リモートのブランチと同期が取れたことがわかる:

C:\work\nvda\nv2011.3>bzr update
 M  source/locale/de/symbols.dic
 M  source/locale/fi/LC_MESSAGES/nvda.po
 M  source/locale/pl/LC_MESSAGES/nvda.po
 M  user_docs/fi/changes.t2t
 M  user_docs/fi/userGuide.t2t
 M  user_docs/pl/changes.t2t
 M  user_docs/pl/userGuide.t2t
All changes applied successfully.
Updated to revision 4787 of branch http://bzr.nvaccess.org/nvda/releases/2011.3

bzr info するとチェックアウトであることがわかる:

Checkout (format: 2a)
Location:
       checkout root: .
  checkout of branch: http://bzr.nvaccess.org/nvda/releases/2011.3/

bzr commit すると、リモートに対してコミットを行う。例えばリモートが launchpad.net であれば launchpad 側がいきなり更新される。

bzr branch

bzr branch はリモートをブランチした新しいブランチをローカルに作る:

bzr branch http://remote/branch workingdir

bzr info すると:

Standalone tree (format: 2a)
Location:
  branch root: .

Related branches:
  parent branch: http://bzr.nvaccess.org/nvda/main/
  submit branch: http://bzr.nvaccess.org/nvda/main/

bzr branch で作った作業コピーのディレクトリで bzr pull すると、parent branch の差分を取り込んでくれる(bzr branch しなおしたのと同じ状態になる)。マージだとコミット前の状態になるので、bzr merge と bzr pull はこの状況では同じではない。

bzr push

since 2011-01-16

launchpad.net で push する先を変えるには?

remember オプションを使うとデフォルトのpush先を変えてくれる。

デフォルトの push 先は bzr info で確認できる:

> bzr info
Repository tree (format: 2a)
Location:
  shared repository: C:/work/nvda
  repository branch: .

Related branches:
    push branch: bzr+ssh://bazaar.launchpad.net/~nishimotz/nvda/nvdajp_jtalk/
  parent branch: C:/work/nvda/main

bzr push で送信先を変更:

> bzr push --remember lp:~nishimotz/nvda/jtalk
Connected (version 2.0, client Twisted)
Authentication (publickey) successful!
Secsh channel 1 opened.
No new revisions to push.

デフォルトの push 先が変更されたことを確認:

> bzr info
Repository tree (format: 2a)
Location:
  shared repository: C:/work/nvda
  repository branch: .

Related branches:
    push branch: bzr+ssh://bazaar.launchpad.net/~nishimotz/nvda/jtalk/
  parent branch: C:/work/nvda/main

作業スペースの構成

4種類の典型的な使い方

ブランチのレイアウト SVN 形式でも、入れ子形式でも、開発者の名前をブランチ名に使っても、自由自在。

bzrのコマンド

4種類の使い方?例えば「機能ブランチを開始する」を使ってみたいので、もう少し詳しく。

bzr log

最後のリビジョンの情報を見る:

$ bzr log -r-1
------------------------------------------------------------
revno: 3538
committer: Takuya Nishimoto <nishimotz@gmail.com>
branch nick: nvda
timestamp: Fri 2010-11-19 15:34:16 +0900
message:
  jtalk renamed to nvdajp_jtalk, dummy supportedSettings

リビジョン 20 以降のログを見る:

$ bzr log -r20..

リビジョン 20 の差分をパッチ形式で見る:

$ bzr log -r20 -p

bzr branch

使い方:

$ bzr help branch
Purpose: Create a new branch that is a copy of an existing branch.
Usage:   bzr branch FROM_LOCATION [TO_LOCATION]

(omitted)

Aliases:  get, clone
See also: checkout

リビジョンを指定してチェックアウトする:

bzr branch -r リビジョン番号 リポジトリ 作成ディレクトリ

bzr branch のバグ

since 2011-07-05

aishimoto さんのバグに遭遇してしまった。

Windows 7 (x64) で bzr-2.3.1-1-setup.exe 使用。

https://bugs.launchpad.net/bzr/+bug/663957

c:\work\nvda>bzr branch lp:~nishimotz/nvdajp/MiscellaneousDependencies miscdep
Connected (version 2.0, client Twisted)
Authentication (publickey) successful!
Secsh channel 1 opened.
bzr: ERROR: Unprintable exception TransformRenameFailed: dict={'errno': 13, 'fro
m_path': u'C:/work/nvda/miscdep/.bzr/checkout/limbo/new-3', 'to_path': u'C:/work
/nvda/miscdep/source', 'why': '[Error 5] \x83A\x83N\x83Z\x83X\x82\xaa\x8b\x91\x9
4\xdb\x82\xb3\x82\xea\x82\xdc\x82\xb5\x82\xbd\x81B'}, fmt='Failed to rename %(fr
om_path)s to %(to_path)s: %(why)s', error=UnicodeDecodeError('ascii', '[Error 5]
 \x83A\x83N\x83Z\x83X\x82\xaa\x8b\x91\x94\xdb\x82\xb3\x82\xea\x82\xdc\x82\xb5\x8
2\xbd\x81B', 10, 11, 'ordinal not in range(128)')

2011-11-19 bzr 2.4.2 ではこのバグが出なくなった。

2012-02-18 bzr 2.4.2 で久しぶりにこのエラーに遭遇した。

bzr checkout

bzr branch のドキュメントで see also と言われたので checkout を調べる。

作業スペースを構成するによると、オプション –lightweight つきの checkout は CVS や SVN の co と同じ感覚になるようだ。

$ bzr help checkout
Purpose: Create a new checkout of an existing branch.
Usage:   bzr checkout [BRANCH_LOCATION] [TO_LOCATION]

(omitted)

Aliases:  co
See also: branch, checkouts

リビジョン番号を指定して取り出す

2011-02-17

shared-repo を使い、特定のブランチの revno 23 を miscdep23 ディレクトリに取り出す:

$ bzr co -r 23 bzr+ssh://bazaar.launchpad.net/~nishimotz/nvdajp/MiscellaneousDependencies/ miscdep23

bzr init-repo

bzr init-repository / bzr init-repo は同じことらしい。init とは違うらしい。

$ bzr help init-repo
Purpose: Create a shared repository to hold branches.
Usage:   bzr init-repository LOCATION

(omitted)

Examples:
    Create a shared repositories holding just branches:

        bzr init-repo --no-trees repo
        bzr init repo/trunk

    Make a lightweight checkout elsewhere:

        bzr checkout --lightweight repo/trunk trunk-checkout
        cd trunk-checkout
        (add files here)

Aliases:  init-repo
See also: branch, checkout, init, repositories

じゃあ bzr init も。

Purpose: Make a directory into a versioned branch.
Usage:   bzr init [LOCATION]

(omitted)
  
  Recipe for importing a tree of files:
  
      cd ~/project
      bzr init
      bzr add .
      bzr status
      bzr commit -m "imported project"

See also: branch, checkout, init-repository

間違いを取り消す

since 2011-11-02

bzr revert は、最後のコミット以降のファイルへの変更を取り消す。

> bzr revert foo.py

bzr uncommit は最後のコミットを取り消す。

bzr uncommit
bzr revert
bzr push --overwrite 

bzr remove

ファイルを消さないで、bzr による管理から除外するには:

bzr remove --keep file.bin 

ファイル名を付け替える

$ bzr mv oldname newname
$ bzr commit -m "renamed"

他のブランチからマージする

since 2011-07-15

例えばローカルに branch1 と branch2 ディレクトリがあって、片方からもう一方にマージ:

cd branch2
bzr merge ../branch1

例えば作業ディレクトリに launchpad.net のブランチをマージ:

cd branch1
bzr merge lp:~username/project/branch2

マージ元での複数のリビジョンは、マージしてコミットすると、一つのリビジョンにまとめられる。

このときリビジョン番号に小数点がつく。

bzr log でマージの中身を見る

since 2011-07-15

以下は nvdajp での作業例。

マージされた内容を見る:

bzr log -r-1
------------------------------------------------------------
revno: 4171 [merge]
committer: Takuya Nishimoto <nishimotz@****.com>
branch nick: jp2011.1
timestamp: Fri 2011-07-15 07:59:15 +0900
message:
  merged mshinke revno 4136
------------------------------------------------------------
Use --include-merges or -n0 to see merged revisions.

インクルードされたマージの中身を見る:

bzr log -r-1 -n0
------------------------------------------------------------
revno: 4171 [merge]
committer: Takuya Nishimoto <nishimotz@****.com>
branch nick: jp2011.1
timestamp: Fri 2011-07-15 07:59:15 +0900
message:
  merged mshinke revno 4136
    ------------------------------------------------------------
    revno: 4072.1.64
    committer: Masataka Shinke <mshinke@****.jp>
    branch nick: releases_2011.1
    timestamp: Fri 2011-07-15 07:29:37 +0900
    message:
      imm(32bit)動作時に日本語入力が切れる問題の修正。
    ------------------------------------------------------------
    revno: 4072.1.63 [merge]
    committer: Masataka Shinke <mshinke@****.jp>
    branch nick: releases_2011.1
    timestamp: Mon 2011-07-11 14:39:52 +0900
    message:
      lp:~nishimotz/nvdajp/releases_2011.1:4170 をマージ
    ------------------------------------------------------------
    revno: 4072.1.62 [merge]
    committer: Masataka Shinke <mshinke@****.jp>
    branch nick: releases_2011.1
    timestamp: Mon 2011-07-11 09:41:31 +0900
    message:
      lp:~nishimotz/nvdajp/releases_2011.1:4169 をマージ

リビジョンに名前(タグ)をつける

bzr revno と bzr tags

bzr branch してきたプロジェクトの現在のリビジョン番号と過去のタグ:

> bzr revno
4057

> bzr tags
release-0.6p1        1640
release-0.6p2        2145
release-0.6p3        2517
release-2009.1       3164
release-2009.1beta1  3098
release-2009.1rc1    3140
release-2010.1       3410
release-2010.1beta1  3379
release-2010.1rc1    3407
release-2010.2       3839.1.52
release-2010.2beta1  3837
release-2010.2beta2  3839.1.26
release-2010.2rc1    3839.1.38
release-2011.1beta1  4056
releases             ?

タグをつけてlaunchpadにpushする

since 2011-06-27

C:\work\nvda\jp2011.1>bzr tag jpdev110627
Created tag jpdev110627.

C:\work\nvda\jp2011.1>bzr push
Using saved push location: bzr+ssh://bazaar.launchpad.net/~nishimotz/nvdajp/releases_2011.1/
Connected (version 2.0, client Twisted)
Authentication (publickey) successful!
Secsh channel 1 opened.
No new revisions to push.

http://bazaar.launchpad.net/~nishimotz/nvdajp/releases_2011.1/changes をみると、 revno 4160 に jpdev110627 がついていることが分かる。

タグを修正する

since 2011-12-14

http://doc.bazaar.canonical.com/beta/ja/user-guide/undoing_mistakes.html にも書いてある。

タグを取り消す:

bzr tag タグ名 --delete

過去のリビジョンにタグをつける:

bzr tag -r リビジョン番号 タグ名

衝突の解消

bzr merge すると衝突が起きることがある。

「もしマージの際にコンフリクトが発生すれば、ベース名が同じ3つのファイルが生成されます。共通の基準となるのが".BASE"で、修正点を含むのが".THIS"、そして他のツリーの修正を含むのが".OTHER"です。 kdiff3といったプログラムを使えば、安心してそれらを一つにマージすることができます。コミットするためにはマージされた".THIS"ファイルを元のファイル名へとリネームする必要があります。コンフリクトの解消をするにはresolveコマンドを使わなければなりません。これは".OTHER"や".BASE"ファイルを削除します。これらのファイルがある限り、コミットには失敗します。」

衝突の解消

手作業で修正したら bzr resolve コマンドで解決を宣言する。

bzr conflicts コマンドで衝突ファイル一覧。

ファイル名を指定しないでまとめて衝突解消(の宣言):

bzr resolve --all

衝突したときのファイルの内容

since 2011-07-27

拡張子が何もついていない(生成されたファイルではない)元のファイルの内容。

完全にファイル全体が変更されたと扱われてしまった場合:

<<<<<<< TREE
変更前(元のファイル)の内容 (xxx.THIS の内容)
=======
変更後(マージされたファイル)の内容 (xxx.OTHER の内容)
>>>>>>> MERGE-SOURCE

criss-cross

bzr merge すると

Warning: criss-cross merge encountered.  See bzr help criss-cross.

と出てくる。

remerge で解決することがあるらしい。

bzr remerge --weave 

チェリーピック

「ブランチの変更の全部ではなく一部だけを選んでマージする」

http://doc.bazaar.canonical.com/bzr.dev/ja/user-guide/adv_merging.html

foo ブランチのリビジョン Xによってなされた変更のみをマージするためには:
bzr merge -c X foo

foo ブランチのリビジョンXまでの変更のみをマージするためには:
bzr merge -r X foo

foo のリビジョンX以降の変更のみをマージするためには:
bzr merge -r X.. foo

foo ブランチのリビジョンXからリビジョンYまでの変更のみをマージするには:
bzr merge -r X..Y foo

bzr help revisionspec でリビジョン指定方法の説明。

launchpad.net との関係

launchpad.net におけるチェンジセット

http://bazaar.launchpad.net/~username/projectname/branchname/revision/NNNN

をチェリーピックする操作

bzr merge -c NNNN lp:~username/projectname/branchname

になる。

特定のリビジョンの変更だけをマージ

不具合がどのリビジョンで起きたかを調べる

since 2011-11-01

aBranch の revno 200 で不具合が見つかった。revno 100 では起きていなかった。

まず revno 100 の作業ブランチを作る:

bzr branch aBranch -r 100 workingBranch 

途中までマージする:

cd workingBranch
bzr merge ../aBranch -r 100..150

この作業ファイルで動作を確認する。 問題がなかったら続きをマージしたいところだが commit しないと merge できない、と怒られるので、revert してやり直すことにする:

bzr revert
bzr merge ../aBranch -r 100..175

これを繰り替えれば、どの revno で不具合が混入したか突き止めることができる。

revno 181 で不具合が起きたことがわかったとする。もともとのブランチを revno 180 に戻すには:

cd ../aBranch
bzr merge . -r 200..180

リバースマージ

since 2011-11-03

こんな問題に遭遇したので、記録しておく。

ロックの解除

since 2012-05-27

>bzr push
Using saved push location: bzr+ssh://bazaar.launchpad.net/~nvdajp/nvdajp/jp2012.2/
Unable to obtain lock  held by misono@bazaar.launchpad.net on crowberry (process #5730), acquired 18 hours, 37 minutes ago.
See "bzr help break-lock" for more.bzr: ERROR: Could not acquire lock "(remote lock)": bzr+ssh://bazaar.launchpad.net/~nvdajp/nvdajp/jp2

>bzr break-lock lp:~nvdajp/nvdajp/jp2012.2
Break held by misono@bazaar.launchpad.net on crowberry (process #5730), acquired 18 hours, 39 minutes ago? [y/n]: y
Broke lock bzr+ssh://bazaar.launchpad.net/~nvdajp/nvdajp/jp2012.2/.bzr/branch/lock
    18kB     2kB/s \

>bzr push
Using saved push location: bzr+ssh://bazaar.launchpad.net/~nvdajp/nvdajp/jp2012.2/
Pushed up to revision 5204.

変更履歴を調べる

since 2012-08-25

行ごとに、最終変更されたリビジョン、コミットしたユーザー、内容を表示。

bzr annotate FILENAME

同じことは emacs で vc-annotate でできる。