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ファイルから個人情報を削除すると、次回以降ファイルを開いたり保存した場合でも個人情報が保存されることがなくなるようです。従って、そのファイルに対してはユーザが明示的に保存操作を行った場合にのみファイルが変更されるようになり、ユーザの想定通りバージョン管理ができるようになります。
最近のコメント