bzr shelve

since 2011-08-08

bazaar のサブコマンドで、差分を「棚上げ」するコマンド。

bzr shelve/unshelveの使い方 http://bit.ly/oAE9xc

bzr shelve は「いじったら動かなくなった」というときに bzr revert のかわりに使うことができる。「棚上げ」は分割できるので、ちょっとずつ差分を適用して、どこから動かなくなるか、といったテストができる。

使ってみる

下記の環境で実験:

bzr --version
Bazaar (bzr) 2.3.1

まず、コミットされていないファイルがある作業ディレクトリ:

C:\work\nvda\jp2011.2>bzr status
modified:
  nvdaHelper/nvdajpime/dllmain.cpp
  nvdaHelper/nvdajpime/nvdajpime.cpp
  nvdaHelper/nvdajpime/nvdajpime.h
  nvdaHelper/nvdajpime/tls.cpp
  nvdaHelper/nvdajpime/tsf.cpp
  source/nvdajp_keyEvents.py

bzr shelve すると、差分を一つ一つ「一時退避」するかどうか質問される:

C:\work\nvda\jp2011.2>bzr shelve
--- nvdaHelper/nvdajpime/dllmain.cpp    2011-02-20 04:37:18 +0000
+++ nvdaHelper/nvdajpime/dllmain.cpp    2011-08-06 14:48:29 +0000
@@ -32,9 +32,11 @@
 //@@
 void Process_Dettach(HMODULE hModule)
 {
+#if 0
     TLS::DestroyTLS();
     TLS::Uninitialize();
        g_hModule = NULL;
+#endif
 }

 BOOL APIENTRY DllMain( HMODULE hModule,
Shelve? [yNfq?]

順番に y または n を押していく。ここでは2ヶ所だけ n を選んだ。最後に:

Selected changes:
 M  nvdaHelper/nvdajpime/dllmain.cpp
 M  nvdaHelper/nvdajpime/nvdajpime.cpp
 M  nvdaHelper/nvdajpime/nvdajpime.h
 M  nvdaHelper/nvdajpime/tls.cpp
 M  nvdaHelper/nvdajpime/tsf.cpp
 M  source/nvdajp_keyEvents.py
Shelve 16 change(s)? [yNfq?]

ここで y を押すと:

Changes shelved with id "1".

これで shelve しなかった差分だけが作業ファイルに残る:

C:\work\nvda\jp2011.2>bzr status
modified:
  nvdaHelper/nvdajpime/nvdajpime.cpp
  nvdaHelper/nvdajpime/nvdajpime.h

確認する。残念ながら1つ目の差分は前半はshelveして後半だけ残したかった:

C:\work\nvda\jp2011.2>bzr diff
=== modified file 'nvdaHelper/nvdajpime/nvdajpime.cpp'
--- nvdaHelper/nvdajpime/nvdajpime.cpp  2011-07-31 14:51:18 +0000
+++ nvdaHelper/nvdajpime/nvdajpime.cpp  2011-08-08 07:33:58 +0000
@@ -33,13 +33,13 @@
 void __RPC_USER midl_user_free(void* p) {
        free(p);
 }
-
+#endif



 HMODULE                                g_hModule;

-Cnvdajpime*                    g_Cnvdajpime;
+Cnvdajpime*                    g_Cnvdajpime = NULL;

 TLS                                    g_TLS;
 DWORD                          TLS::dwTLSIndex = TLS_OUT_OF_INDEXES;
=== modified file 'nvdaHelper/nvdajpime/nvdajpime.h'
--- nvdaHelper/nvdajpime/nvdajpime.h    2011-07-30 13:20:15 +0000
+++ nvdaHelper/nvdajpime/nvdajpime.h    2011-08-08 07:33:58 +0000
@@ -7,6 +7,7 @@
 # nvdajpime
 # by Masataka Shinke
 */
+#define RESOURCE_DEBUG // by nishimoto

 //#pragma once

もう一度 bzr shelve して f を選んだら、全部一時退避する、ということになってしまった:

C:\work\nvda\jp2011.2>bzr shelve
--- nvdaHelper/nvdajpime/nvdajpime.cpp  2011-07-31 14:51:18 +0000
+++ nvdaHelper/nvdajpime/nvdajpime.cpp  2011-08-08 07:33:58 +0000
@@ -33,13 +33,13 @@
 void __RPC_USER midl_user_free(void* p) {
        free(p);
 }
-
+#endif



 HMODULE                                g_hModule;

-Cnvdajpime*                    g_Cnvdajpime;
+Cnvdajpime*                    g_Cnvdajpime = NULL;

 TLS                                    g_TLS;
 DWORD                          TLS::dwTLSIndex = TLS_OUT_OF_INDEXES;
Selected changes:
 M  nvdaHelper/nvdajpime/nvdajpime.cpp
 M  nvdaHelper/nvdajpime/nvdajpime.h
Changes shelved with id "2".

どうやらひとつの diff を編集して細かく分ける、ということはできないらしい。

棚上げした差分を再度適用するには:

C:\work\nvda\jp2011.2>bzr unshelve 2
Using changes with id "2".
 M  nvdaHelper/nvdajpime/nvdajpime.cpp
 M  nvdaHelper/nvdajpime/nvdajpime.h
All changes applied successfully.
Deleted changes with id "2".

C:\work\nvda\jp2011.2>bzr unshelve 1
Using changes with id "1".
 M  nvdaHelper/nvdajpime/dllmain.cpp
 M  nvdaHelper/nvdajpime/nvdajpime.cpp
 M  nvdaHelper/nvdajpime/nvdajpime.h
 M  nvdaHelper/nvdajpime/tls.cpp
 M  nvdaHelper/nvdajpime/tsf.cpp
 M  source/nvdajp_keyEvents.py
All changes applied successfully.
Deleted changes with id "1".

確認しないでまとめて「棚上げ」するには:

C:\work\nvda\jp2011.2>bzr shelve --all
Selected changes:
 M  nvdaHelper/nvdajpime/dllmain.cpp
 M  nvdaHelper/nvdajpime/nvdajpime.cpp
 M  nvdaHelper/nvdajpime/nvdajpime.h
 M  nvdaHelper/nvdajpime/tls.cpp
 M  nvdaHelper/nvdajpime/tsf.cpp
 M  source/nvdajp_keyEvents.py
Changes shelved with id "1".

C:\work\nvda\jp2011.2>bzr diff

コミットを分割する

since 2011-10-16

コミットを忘れて複数の作業をしてしまったとき。

片方の作業が A, B に、もう一方の作業が C, D に変更を加えている。

bzr shelve で C, D を「棚上げ」して、A, B だけの状態に戻す。

そして A, B の作業を bzr commit する。

bzr unshelve で C, D の変更を呼び出す。

C, D の作業を bzr commit する。

bzr_shelve.txt · 最終更新: 2011/10/24 10:44 by Takuya Nishimoto
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0