Excelをバージョン管理するための基礎知識
はじめに
Excel(.xls; Excel97-2003ブック形式)ファイルをSubversionなどのバージョン管理システム(VCS,RCSとも)で管理することはしばしば発生する状況であると思います。
私も以前からCVSやSubversion(SVN)でExcelファイルのバージョン管理を行っており、うまく動作していると考えていました。
しかし、Bazaar(BZR)を利用する機会があった際に従来と同様の使い方をすると正しく動作していないように見える事態が発生し、当時のことをまとめるために本エントリを起こしました。
今回試してみた環境は以下の通りです。
- Windows7 x64
- Excel2010
- TortoiseSVN 1.6.12, Build 20536 - 64 Bit
- bzr-2.2.2
- Git-1.7.3.1-preview20101002
- mercurial-1.7.3-1-x64
結論
最初に結論を書いておきます。以下の2点のうちいずれかの対応を採れば上記いずれのVCSでも正しく管理できるでしょう。
- .xlsx形式でファイルを作成、管理する。
- .xls形式を使用する場合、ファイルから個人情報を削除しておいたものをバージョン管理対象とする。
.xlsファイルから個人情報を削除する手順はExcelのバージョンによって異なりますが、Microsoftのサイトにまとまっています…と思ったらリンクに誤りがあったりで参考にならないので以下に記載します。
- Excel2010
ファイル > 情報 > 共有準備の問題のチェック > ドキュメントの検査 で「ドキュメントのプロパティと個人情報」を削除 - Excel2007
Microsoft Officeボタン > 配布準備 > ドキュメント検査 で「ドキュメントのプロパティと個人情報」を削除 - Excel2003, Excel2002(XP), Excel2000
ツール > オプション > セキュリティタブ > 「保存時にファイルのプロパティから個人情報を削除する」にチェック
(これ未満のバージョンや、MacのOffice2004もExcel2003と同様の手順のようですが、Microsoftのサイトでは見つけることができませんでした。)
私はExcel2010でしか試せていませんが、methaneさんがExcel2003でもうまくいくことを試していらっしゃいます。
上記ファイルをテンプレート(.xlt)にするなどして、新しいドキュメント作成時にはこれを用いることで、.xlsを正しくバージョン管理できるようになります。
問題点
Excelアプリケーションは、書き込み権限のある.xlsファイルを開くたび個人情報を更新するため、ユーザが明示的に保存を行わなくてもファイルが変更されてしまいます(.xlsx形式ではそのようなことはないようです。また当然と言えば当然ですが、OpenOffice.orgなどでは.xlsファイルを開いただけでファイルが更新されることもありません)。
つまり、.xlsファイルを開いただけでバージョン管理しているファイルと差異が出てしまい、本来行いたい管理ができなくなる、というのが.xlsファイルを扱う際の問題点といえます。
SVN(やCVS)ではこの問題が表面化することはまれでした(せいぜい、ファイルを開いている最中にstatusコマンドを実行すると変更が検知される程度で、これも保存せずに閉じると未編集状態に戻ってしまいます)。
これは、SVN(やCVS)は、ファイルのタイムスタンプが変わっていなければ未編集であるとみなしているためです。
前述の通り、Excelアプリケーションは保存を行わなくてもファイルを変更しますが、この際タイムスタンプを開く前の状態に書き戻します。この挙動のためバージョン管理システムはファイルが変更されていないと誤解する状況が生まれます。
(この問題は、よくSambaで共有しているExcelファイルを開いただけでタイムスタンプが変わってしまう、という問題で取り上げられます[参考]が、本来タイムスタンプが変わるのは正常だ、ということになります。)
一方、BZR,HG,GITは、ファイル自身の比較を行うため、タイムスタンプに騙されず、開いただけの.xlsファイルでも正しく「変更された」と判断します。このため、「SVN/CVSではうまくいっていたのにBZR/HG/GITだとダメだ」という状況になります。
(BZR,HG,GITもタイムスタンプで判断する場合があるので、騙される条件もあります。また、この3種を試したところ、BZRと他2種とでは騙される条件が若干異なるように見えました(BZRの方がより厳密?)。)
この問題の解決策として、「結論」に記載した通り個人情報を削除し保存しないようにすることが挙げられます。一度.xlsファイルから個人情報を削除すると、次回以降ファイルを開いたり保存した場合でも個人情報が保存されることがなくなるようです。従って、そのファイルに対してはユーザが明示的に保存操作を行った場合にのみファイルが変更されるようになり、ユーザの想定通りバージョン管理ができるようになります。
参考
« Google Reader Full Feedが遅い | トップページ | pixivのリファラ設定 »
コメント
この記事へのコメントは終了しました。
Subversionでの話になりますが、私のところではExcelファイルなどには必ずsvn:needs-lock属性を適用しています。これがあると、チェックアウトしたファイルに(Windowsでは)読取専用属性が付きます(SVNでロックを獲得すれば、読み取り専用属性が無くなり編集可能になる)。
Excelが読取専用ファイルまで書き換えるかどうかは分かりませんが、いずれにせよSVNではロックを獲得しない限り差分の対象にならないので、気になりません。
この点でも、SubversionではExcelの件は問題になりにくいです。
Bazaarで同様のことが可能かどうかは分かりませんが一応。
投稿: Egtra | 2011/05/28 02:03
Egtraさん、こんばんは。
SVNにロックがそういうふうに使えるとは知りませんでした。
確かに、衝突の解消が困難なファイルを複数人が編集する可能性がある場合は
svn:needs-lockを用いることで、そもそも衝突が発生する状況を無くしておく、というのは非常に有効ですね。
ただ、私の場合はちょっと特殊(?)なVCSの使い方をしていまして、基本的に編集するのは自分ひとりになります。
ただ、同時にExcelファイルを複数開いて、あるファイルを参照しつつ別のファイルを更新する、というような感じで作業しています。
この作業中、更新すべきファイルをちゃんと保存して、更新すべきでないファイルは間違って保存していないことを確認するために
svn statusコマンドを実行して見たりしているのですが、ファイルを開いた状態でこれを行うと実際には編集していなくても
変更があると見做されてしまう、というのがそもそもの問題でした。
また、コミットする際には一旦全ファイルを閉じないと、編集していないものまでコミット対象になってしまう、という問題もありました。
ロック(や編集可能属性の変更)で、編集しないファイルは編集できないようにしておく手は、
編集対象ファイルが都度変わり、また、ファイルを開いた時点では編集するかどうか確定していないので、
コミット作業が煩雑になってしまうのです…
> Excelが読取専用ファイルまで書き換えるかどうかは分かりませんが、
これは本エントリを記述する際に試してみましたが、読み取り専用のファイルについては個人情報の更新は行われませんでした。
> Bazaarで同様のことが可能かどうかは分かりませんが一応。
Bazaarのような分散バージョン管理システムでは、原理的にロック機構は不可能ですね…
WordやExcelなんかを複数人で編集するような場合には、ソースを分散バージョン管理システムで管理していたとしても
SVNの利用価値は残りそうですね。
投稿: 雪羽 | 2011/05/30 01:08