バージョン管理システム。開発が停滞しているなどで 2013年ごろから人気がなくなってきた印象。
pythonで実装されているがmercurialとはかなりインタフェースが異なる。
数字でリビジョン番号がつけられるところはsubversionに近い。
サブコマンドの説明を見るには bzr help サブコマンド
http://wiki.bazaar.canonical.com/WindowsDownloads
bzr-2.4.2-1-setup.exe が利用可能(2011年11月現在)
インストール先を c:\usr\Bazaar にして、launchpad.net プラグイン以外のオプションを外す。
launchpad.net に push するための ssh key の置き場所は C:¥Documents and Settings¥%USERNAME%¥.ssh¥id_rsa
since 2012-07-12
$ 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 でのインストールは "sudo apt-get install bzr"
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
入れようと思ったら入っていた。
$ 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 の 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 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/
bzr checkout –lightweight は svn っぽく使う方法らしいので試す。
$ bzr co --lightweight http://bzr.sourceforge.jp/view/nvdajp/main
これでもちゃんとカレントに main ディレクトリを作ってくれる。
$ cd main $ bzr update
これでサーバから最新版を取ってくることができるようだ。
sf.jp のガイドには bzr branch を使えと書いてあるが、ひねくれて co –lightweight してみる。
$ bzr co --lightweight bzr+ssh://nishimoto@bzr.sourceforge.jp/bzrroot/nvdajp/main
うまくいった。 cd main; bzr update も問題ない。
since 2011-11-19
bzr checkout と bzr branch はどのように使い分けたらいいか?
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 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 はこの状況では同じではない。
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
ブランチのレイアウト SVN 形式でも、入れ子形式でも、開発者の名前をブランチ名に使っても、自由自在。
4種類の使い方?例えば「機能ブランチを開始する」を使ってみたいので、もう少し詳しく。
最後のリビジョンの情報を見る:
$ 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 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 リビジョン番号 リポジトリ 作成ディレクトリ
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 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-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 による管理から除外するには:
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
マージ元での複数のリビジョンは、マージしてコミットすると、一つのリビジョンにまとめられる。
このときリビジョン番号に小数点がつく。
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 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 ?
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
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 におけるチェンジセット
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 でできる。