« Google Reader Full Feedが遅い | トップページ | pixivのリファラ設定 »

2011/01/30

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さん、こんばんは。

SVNにロックがそういうふうに使えるとは知りませんでした。
確かに、衝突の解消が困難なファイルを複数人が編集する可能性がある場合は
svn:needs-lockを用いることで、そもそも衝突が発生する状況を無くしておく、というのは非常に有効ですね。


ただ、私の場合はちょっと特殊(?)なVCSの使い方をしていまして、基本的に編集するのは自分ひとりになります。
ただ、同時にExcelファイルを複数開いて、あるファイルを参照しつつ別のファイルを更新する、というような感じで作業しています。
この作業中、更新すべきファイルをちゃんと保存して、更新すべきでないファイルは間違って保存していないことを確認するために
svn statusコマンドを実行して見たりしているのですが、ファイルを開いた状態でこれを行うと実際には編集していなくても
変更があると見做されてしまう、というのがそもそもの問題でした。
また、コミットする際には一旦全ファイルを閉じないと、編集していないものまでコミット対象になってしまう、という問題もありました。

ロック(や編集可能属性の変更)で、編集しないファイルは編集できないようにしておく手は、
編集対象ファイルが都度変わり、また、ファイルを開いた時点では編集するかどうか確定していないので、
コミット作業が煩雑になってしまうのです…


> Excelが読取専用ファイルまで書き換えるかどうかは分かりませんが、

これは本エントリを記述する際に試してみましたが、読み取り専用のファイルについては個人情報の更新は行われませんでした。

> Bazaarで同様のことが可能かどうかは分かりませんが一応。

Bazaarのような分散バージョン管理システムでは、原理的にロック機構は不可能ですね…
WordやExcelなんかを複数人で編集するような場合には、ソースを分散バージョン管理システムで管理していたとしても
SVNの利用価値は残りそうですね。

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/18902/50731863

この記事へのトラックバック一覧です: Excelをバージョン管理するための基礎知識:

« Google Reader Full Feedが遅い | トップページ | pixivのリファラ設定 »

other sites

  • follow us in feedly
  • github
  • stackoverflow

ソフトウェアエンジニアとして影響を受けた書籍

  • Christain Bauer: HIBERNATE イン アクション

    Christain Bauer: HIBERNATE イン アクション
    理論と実践が双方とも素晴らしい製品であるHibernate。本書はそのプロダクトを書名に冠していますが、Hibernateを使うつもりがなく、ORマッピングの解説書として読むにしても十分な良書です。Second EditionとしてJava Persistence With Hibernateという書籍も出版されていますが、残念ながら現在のところ 和訳はされていません。-インアクションは2.xの、Java Persistence-は3.1の頃のものなので、最新版とはちょっと違うところもあることに注意。 (★★★★★)

  • アンドリュー・S・タネンバウム: 分散システム 原理とパラダイム 第2版

    アンドリュー・S・タネンバウム: 分散システム 原理とパラダイム 第2版
    クライアント/サーバシステムを構築する上で必要となる知識が総論されてます。Web技術者も、フレームワーク部分を開発するのであれば必読。 (★★★★★)

  • Joel Spolsky∥著: ジョエル・オン・ソフトウェア

    Joel Spolsky∥著: ジョエル・オン・ソフトウェア
    前述の書籍「ソフトウエア開発プロフェッショナル」をより砕いたもの、という感じでしょうか。 前書きではプログラマでなくSE向けの本のように書かれているが、プログラマが読んでも面白い本であると思われます。 SEになった新人(あるいはそういう会社に入る/入りたての人)にとっては、これからどういったことが仕事を遂行していく上で起こりえるのか、どのように考えて行なっていけばいいのか決定する助けになると思います。 元は″Joel on Software″というブログの記事で、web上でも一部日本語で読めます。 http://japanese.joelonsoftware.com/ (★★★)

  • ドナルド・C・ゴース,ジェラルド・M・ワインバーグ: ライト、ついてますか

    ドナルド・C・ゴース,ジェラルド・M・ワインバーグ: ライト、ついてますか
    問題解決(一昔前のの流行語で言うところの『ソリューション』)能力は、システムエンジニアのスキルとして備えるべきもののうちのひとつです。しかし、これは難しい。学校で出されるテストと違い、唯一の、(問題提出者が想定している)解を求めるだけが「問題解決」では無いからです。そもそも、何が問題なのか、それは本当に問題なのか、それは本当に解決すべき問題なのか、その問題解決方法は正しいのか、などを解決しなければ、「その解は正しいのか」に辿りつくことができません。この本の最も良いところのひとつは、本があまり厚くないこと。すぐに読めるし、何回も読み返す気になるでしょう。 (★★★★★)

  • スティーブ・マコネル: ソフトウエア開発プロフェッショナル

    スティーブ・マコネル: ソフトウエア開発プロフェッショナル
    コードコンプリートで有名なスティーブマコネルの著書。新人SEに読んで欲しい。個人として業界の中でどうあるべきか、組織としてどうあるべきか、SEのプロ意識とは?SEの心構え概論、といったところでしょうか。また、業界における資格の重要性についても説かれています。この業界では資格が特に軽んじられる傾向がありますが、この傾向はどんな弊害をもたらすのか、将来的にこの業界は資格に対してどのような姿勢で臨んでいくべきなのか。日経BP社では(他の出版社もだが)最近、似たような類いのあまり面白くない書籍が乱出版されていますが、この本は別格だと思うので安心して購入して欲しいと思います。 (★★★★★)

無料ブログはココログ