ExcelをBazaarで管理する場合はTortoiseBZRをインストールしない/むやみにbzr statusを実行しない
追記:本エントリの記載はいくつか勘違いを含んでいました。TortoiseBZRメンテナのmethaneさんから補足頂いていたり、勘違いの修正も記載していますのでコメント欄も参照ください。
前回の、Excelファイル(.xls)をBazaarでバージョン管理すると、保存しなくてもファイルを開いて閉じるだけで編集状態になってしまう問題の原因と思しきものと対処方法がわかりました。
確認したのは現時点でのWindows版(Standalone)最新バージョン、2.2.1-3です。
原因
周知の通り、編集可能なExcelファイル(拡張子が.xlsの形式のもの)は、開いただけでファイルが変更されます。ただし変更しないで閉じると元の状態に戻るため、通常(Subversionなど)は変更したとはみなしません。
bzrの場合、バイナリファイルについては、一旦modified(変更状態)であると認識すると、元の状態に戻ってもmodifiedのままになるようです。つまり、
- Excelファイルを開く
- bzr statusコマンドを実行する ←ここでmodifiedとなる
- Excelファイルを閉じる(保存しない)
という操作を行うとファイルが変更されたとみなされてしまうようです。svnの場合は、2.でsvn statusの時点ではmodifiedとなりますが、ファイルを閉じた後は再び変更なしに戻ります。
そんな状態でbzr statusを実行しなければ良いだけじゃないのか、と思うかもしれません。しかし、tortoiseBZRをインストールしていたりBazaar Exploerを起動していたりすると、明示的にbzr statusコマンドを実行せずとも、何かのタイミングでstatusコマンド相当が実行されるようで(アイコンオーバレイの更新とか?)、いつの間にかmodifiedになっていた、ということが頻繁に起こりました。
対策
その1。Excelは.xlsフォーマットでなく.xlsxフォーマットで扱う。
根本的な原因は、編集していないにもかかわらずファイルを変更してしまうExcelが悪いと言えます。.xlsxフォーマットではそのような行儀の悪い動作は起こらないようなので、こちらを用いるのが正しい対策だと言えるでしょう。ただし、bzrと相性が悪いから.xlsxに変更します、とすぐ対処できるような環境なら、そもそも初めから.xlsなんて使っていないと思われますのでこの対処は難しいのではないでしょうか。
その2。tortoiseBZRやBazaar Explorerをインストールしない。
自分の意図しないところでstatusコマンドを実行されなければ、予期せず編集状態にしてしまう機会も減少させられるでしょう。tortoiseBZRをインストールすると自動起動するtbzrcache.exeプロセスはツールバーから終了させることができるのですが、bzrコマンドを実行するとまた勝手に起動するようなので(これ仕様なのですかね?バグじゃないのかな…仕様でした)、初めからインストールしない方が事故が防げると思います。
ちなみに、bzr statusを実行しなければ良いように書いてきましたが、おそらくbzr commitなど他のコマンドでもファイル変更確認走査は実行されているはずなので、管理対象のExcelを開いている場合には、bzrコマンドは実行しない、という風に決めておいた方が楽だと思います。
さて、SVNとの連携(bzr-svn)ですが、svn+httpsは指定できない、とか、checkoutはできるがcommitできない、とか書かれているページがあったのですが、現在のバージョンではcommitも問題なくできているように見え、考えていたことは実現できそうです。
Excelの差分確認はこちらで公開されている「Windowsで外部コマンドが起動できないバグを修正するプラグイン」「extdiffplusプラグイン」の2つを利用して実現することができています。
« BazaarでExcelファイルをバージョン管理しようとしたがうまくいかなかった | トップページ | 最終回 SEの年収(2011年版) »
コメント
この記事へのコメントは終了しました。
トラックバック
この記事へのトラックバック一覧です: ExcelをBazaarで管理する場合はTortoiseBZRをインストールしない/むやみにbzr statusを実行しない:
» Excelをバージョン管理するための基礎知識 [雪羽の発火後忘失]
はじめに Excel(.xls; Excel97-2003ブック形式)ファイルをSubversionなどのバージョン管理システム(VCS,RCSとも)で管理することはしばしば発生する状況であると思います。 私も以前からCVSやSubversion(SVN)でExcelファイルのバージョン管理を行っており、うまく動作していると考えていました。 しかし、Bazaar(BZR)を利用する機会があった際に... [続きを読む]
« BazaarでExcelファイルをバージョン管理しようとしたがうまくいかなかった | トップページ | 最終回 SEの年収(2011年版) »
TortoiseBZR のメンテナです。
tbzrcacheプロセスはシェルからステータス確認のために呼び出され、プロセス自体が存在しないと自動的に起動される仕様です。
勝手にstatusを実行させないために用意してある機能は、タスクトレイアイコンを右クリックすると出てくるメニューにあるスリープという項目です。
当方で Excel 2003 を使って実験してみたのですが、bzrと関係なく、xlsファイルを開いて閉じるだけで、元のファイルのコピーと fc /b すると差分がありました。
ファイルの変更がないという状態を再現できないので、残念ながらバグも再現できず、TortoiseBZRがどう影響しているのかを確認することができません。
Excelファイルが元ファイルを変更しない条件等、何かヒントがあれば教えていただけないでしょうか?
投稿: methane | 2011/01/22 20:33
methaneさん、はじめまして。
> tbzrcacheプロセスはシェルからステータス確認のために呼び出され、プロセス自体が存在しないと自動的に起動される仕様です。
すみません、名前から早とちりして「スリープ」は一時停止のようなもの、「プログラムを終了する」は完全停止(プロセスは復活しない)のようなもの、と思い込んでいました…
> 当方で Excel 2003 を使って実験してみたのですが、bzrと関係なく、xlsファイルを開いて閉じるだけで、元のファイルのコピーと fc /b すると差分がありました。
私の環境でも同様の手順で試してみました。結果、methaneさんの環境と同様、開いて保存せずに閉じた場合でもバイナリは変更されていました。
バイナリが変わっているのに何故svn/bzrはmodifiedと見做さないのだろう?と気になって調べてみたところ、以下のような記事を見つけました。
http://stackoverflow.com/questions/4730452/why-does-subversion-fail-to-flag-a-modified-microsoft-excel-spreadsheet-file
svnではバイナリファイルに変更があったかどうかをファイル更新日時で比較しており、.xlsファイルが上記のようにバイナリレベルで不一致であったとしても、更新日時が前回コミット時から変わっていなければ変更無しとみなしているそうです。
bzrについても同様の挙動となっているように見えますので、おそらくsvnと同じ方法でバイナリファイルの変更有無を認識しているのではないでしょうか。
投稿: 雪羽 | 2011/01/23 05:01
>すみません、名前から早とちりして「スリープ」は一時停止のようなもの、「プログラムを終了する」は完全停止(プロセスは復活しない)のようなもの、と思い込んでいました…
「スリープ」は「生きてるけど何もしない(シェル拡張には固定値を返すだけ)」状態なんで言葉通りなんですけど、「終了する」が「(けどシェルがすぐ起動する)」というのは、確かにユーザーから見ると詐欺ですね。自分で再起動しているわけではない以上、「再起動する」と変更するのもおかしいですし。
今のシェル拡張部分はできるだけシンプルにしたくてバックエンド(tbzrcache)が必須になってるんですが、将来的にバックエンドを起動しない程度の状態管理はシェル側に持たせることにします。
> bzrについても同様の挙動となっているように見えますので、おそらくsvnと同じ方法でバイナリファイルの変更有無を認識しているのではないでしょうか。
なるほど。bzrも確かに変更時間や作成時間をキャッシュすることで高速にファイルが修正されているかどうかを判断していますね。
私が再現できていなかったのは、ファイルを開く前に bzr status を実行していなかったので変更時間キャッシュが存在しておらず、 bzr status を実行するとファイルの中身をチェックしていたのが原因のようです。
ファイルを作成後、一旦 bzr status を実行し、xlsファイルを開いて閉じた後もう一度 bzr status を実行することで「ファイルが変更されているけど変更されていると認識しない」状態を再現できました。
ただし、この場合、 bzr にとっては「変更された」と報告している方が正しい状態で、「変更なし」と報告しているのは modified time に騙されているだけという事になります。(多分、svnも同じでしょう。) この方針で TortoiseBZR を Excel に対応させるというのは、ちょっと無いですね。
あるとしたら、docフォーマット内のタイムスタンプを理解して、タイムスタンプのみの変更を自動でrevertするプラグインを作るか、書き込み権限を落として read only にすることでExcelが勝手にタイムスタンプを更新するのを防ぐという操作を手軽に行えるシェル拡張を作るくらいかな。
投稿: methane | 2011/01/23 15:51
本エントリを書いた際に、私は以下の2点を勘違いをしていました。
[A]Excelが.xlsファイルを開いたときにファイルを変更するが、保存せずに閉じると開く前と完全に同一のファイルに戻る。
[B]svn status/bzr statusで表示されるファイル状態は、(テキストかバイナリかに関わらず)常にファイル自身の変更を見て出力されている。
また、以下の点に気付いていませんでした。
[C]バイナリファイルに対して、初回bzr statusコマンド実行時と、2回目以降(キャッシュされた状態で)のコマンド実行では、差異を確認するために用いている情報が異なる。
ですので、
1.コミットされた.xlsファイルをExcelで開く。
2.保存せずに閉じる。
3.svn status/bzr statusコマンドを実行する。
という手順をとるとmodifiedとはならない、という前提でエントリを書いたのですが、
実際には、手順1の前に
0.bzr statusコマンドを実行する。
という手順が無いと再現できない(1-3の手順だけだと、BZRではmodifiedとなる)ということですね[C]。
また、ファイルが変わっていない[A]のだからmodifiedとならないのは当然だ、と考えていたのですが、
実際の.xlsファイルは(fc /bの結果が示す通り)変更されており、本来の意味からするとバージョン管理システムはmodifiedと示すのが正しいのですね。
ここでSVNや(特定の条件下での)BZRがmodifiedと表示しないのはファイルの中身を比較している[B]わけではなく、
modified timeを見て判断しているため、ということですね。
(これはファイル比較のコストを抑えるため、といったような理由からでしょうね)
> bzr にとっては「変更された」と報告している方が正しい状態で、「変更なし」と報告しているのは modified time に騙されているだけという事になります。(多分、svnも同じでしょう。)
上記の理解を踏まえると、
Excelが.xlsファイルにアクセスしただけで変更を加え、その上、変更を加えたにもかかわらずmodified timeを偽称するというcrazyな仕様にも関わらず
CVS/SVN/(bzr stをしょっちゅう叩く私の使い方での)BZR が、.xlsファイルを(私にとって)正しく扱えているように見えているのは
「たまたま」
だったということですね…(modified timeを正しく更新されてしまうと、それはそれで困ったことになっていそうですが)
> docフォーマット内のタイムスタンプを理解して、タイムスタンプのみの変更を自動でrevertするプラグインを作るか、書き込み権限を落として read only にすることでExcelが勝手にタイムスタンプを更新するのを防ぐという操作を手軽に行えるシェル拡張を作るくらいかな。
こちらの助言について少し考えてみました。
●後者の方針「read onlyで開く」について:
私の行っている作業では、ファイルを開こうとした時点では、まだそのファイルを編集するかどうかが確定していません。
ですので、
・ファイルはすべて「読み込み専用」にしておく。
・編集し保存を行おうとした場合には命名規則を決めて「別名で保存」する。
・commit前に編集ファイルをリネームして差し換え、read onlyにする
というようなことを行わないといけないかなあ、と考えます。
●前者の方針「Excelが勝手に変えた部分のみrevertする」について:
先のstackoverflow記事中のリンクにあった
http://spreadsheetpage.com/index.php/oddity/who_last_opened_that_file/
をみると、どうも勝手に変更するのはタイムスタンプのみではないようで、また、他の解説サイトも見た感じでは、どうも仕様は非公開であるように見えました。
そういえばExcelは勝手に個人情報をファイルに埋め込むのが問題だ、というようなことがしばしば話題になるなあ、ということを思い出し、この方向で検索してみたところ、以下の解説がヒットしました。
http://office.microsoft.com/ja-jp/excel-help/HA010354331.aspx#BM2
この解説を参考に「ドキュメントのプロパティと個人情報」をファイルから削除して保存してみたところ、
ファイルを開いて閉じただけではfc /bコマンドで差異が出ることは無くなりました。
以上より、.xlsファイルから個人情報を削除しておくことで、バージョン管理システムで.xlsファイルをちゃんと扱える
ということに期待が持ててきました。
投稿: 雪羽 | 2011/01/23 21:06