(57)【要約】【課題】  ファイル管理システムおよび方法を提供すること。【解決手段】  ファイル管理システムおよび方法は、階層ファイルシステム（「エリア」と称される）で構成されている。エリアには、ワークエリア、ステージングエリア、およびエディションエリアの3種類がある。ワークエリアは、修正可能なファイルシステムであり、ワークエリアにおいては、ユーザーは、ファイルおよびディレクトリを作成、編集、および削除することができる。ステージングエリアは、バージョニング選択操作がサポートされる読み取り専用のファイルシステムである。ワークエリアのさまざまなユーザーは、自身のワークエリアの内容をステージングエリアにサブミットすることによって、自身の作業を統合することができる。ステージングエリアにおいては、複数の開発者がそれぞれの作業を比較したり、変更がどのように組み込まれるかを確認することができる。エディションは、読み取り専用のファイルシステムであり、ステージングエリアの内容がエディションに仮想的にコピーされ、ステージングエリアの内容の瞬間的な読み取り専用スナップショットが作成される。このファイル管理システムおよび方法の1つの用途は、Webサイト開発ツールである。親マップ置換メカニズムは、特定のファイルバージョンのすべての親ディレクトリを追跡するための代替手法を説明しており、この手法では、すべての親ディレクトリへのバックポインタを格納および維持することが要求されない。このメカニズムによって、サブミット操作のパフォーマンスが高まる。【選択図】  なし【特許請求の範囲】
【請求項１】
Webサイト開発用のファイル管理システムであって、
ファイルと、
複数のディレクトリであって、それぞれが、前記ファイルが前記ディレクトリのうちの対応する1つのディレクトリの中に存在しているかを示す情報を含んでいる、前記複数のディレクトリと、
前記複数のディレクトリをまとめて連鎖させるためのポインタと、
前記複数のディレクトリのうちの1つのディレクトリを指す、前記ファイルのバックポインタと、
を有する、ファイル管理システム。
【請求項２】
前記複数のディレクトリが、1つのディレクトリの複数のバージョンを有する、請求項1に記載のファイル管理システム。
【請求項３】
ポインタが、後継ポインタと先行ポインタとを有し、前記後継ポインタのそれぞれが、前記複数のディレクトリのうちの1つのディレクトリから、前記複数のディレクトリのうちの対応する1つのディレクトリの後継バージョンを指しており、前記先行ポインタのそれぞれが、前記複数のディレクトリのうちの1つのディレクトリから、前記複数のディレクトリのうちの対応する1つのディレクトリの先行バージョンを指している、請求項2に記載のファイル管理システム。
【請求項４】
前記ファイルが、いずれかのディレクトリの中に存在しているか否かを判断するためのモジュール、
をさらに有する、請求項1に記載のファイル管理システム。
【請求項５】
異なるユーザーが、Webサイトに表示されるWebコンテンツを作成および維持することができるように構成されている複数のワークエリアであって、前記ワークエリアのそれぞれが、対応するワークエリアの中に存在しているWebコンテンツを有するファイルの仮想的な表現をユーザーが編集できるようにする目的で、読み取り操作と書き込み操作とを有するファイルシステムであり、前記ファイルが前記複数のワークエリアのうちの1つの中に存在する、前記複数のワークエリア、
をさらに有する、請求項1に記載のファイル管理システム。
【請求項６】
Webサイト開発用のファイル管理システムの方法であって、
ファイルのバックポインタを格納するステップであって、前記バックポインタが、複数のディレクトリのうちの1つのディレクトリを指している、前記ステップと、
複数のディレクトリをまとめて連鎖させるための複数のポインタを格納するステップであって、前記複数のディレクトリのそれぞれが、前記ファイルが前記ディレクトリのうちの対応する1つのディレクトリの中に存在しているかを示す情報を含んでいる、前記ステップと、
を含んでいる、方法。
【請求項７】
前記ファイルが、いずれかのディレクトリの中に存在しているか否かを判断するステップ、
をさらに含んでいる、請求項6に記載の方法。
【請求項８】
前記バックポインタと、前記複数のディレクトリのそれぞれに含まれている前記情報とから、前記複数のポインタのサブセットを求めるステップであって、前記ファイルが、前記複数のディレクトリの前記サブセットのそれぞれの中に存在している、前記ステップ、
をさらに含んでいる、請求項7に記載の方法。
【請求項９】
前記複数のディレクトリが、1つのディレクトリの複数のバージョンを有する、請求項7に記載の方法。
【請求項１０】
前記ファイルが、前記複数のディレクトリのうちのいずれにも存在していないという判断に応答して、前記ファイルによって使用されているストレージを再利用するステップ、
をさらに含んでいる、請求項9に記載の方法。
【請求項１１】
前記複数のディレクトリのうちの1つのディレクトリから、前記複数のポインタを使用して、前記複数のディレクトリのうちの任意のディレクトリにアクセスすることができるように、前記複数のポインタが、前記複数のディレクトリを連鎖させている、請求項6に記載の方法。
【請求項１２】
前記複数のポインタが、
前記複数のディレクトリのうちの第一ディレクトリから、前記複数のディレクトリのうちの第二ディレクトリを指す第一ポインタと、
前記第二ディレクトリから前記第一ディレクトリを指す第二ポインタと、
を有する、請求項11に記載の方法。
【請求項１３】
データを提供することのできる機械可読媒体であって、1つ以上のプロセッサのセットによって実行されたとき、当該プロセッサのセットに、Webサイト開発用のファイル管理システムの方法を実行させ、前記方法が、
ファイルのバックポインタを格納するステップであって、前記バックポインタが、複数のディレクトリのうちの1つのディレクトリを指している、前記ステップと、
複数のディレクトリをまとめて連鎖させるための複数のポインタを格納するステップであって、前記複数のディレクトリのそれぞれが、前記ファイルが前記ディレクトリのうちの対応する1つのディレクトリの中に存在しているかを示す情報を含んでいる、前記ステップと、
を含んでいる、
機械可読媒体。
【請求項１４】
前記方法が、
前記ファイルがいずれかのディレクトリの中に存在しているか否かを判断するステップ、
をさらに含んでいる、請求項13に記載の媒体。
【請求項１５】
前記方法が、
前記バックポインタと、前記複数のディレクトリのそれぞれに含まれている前記情報とから、前記複数のポインタのサブセットを求めるステップであって、前記ファイルが、前記複数のディレクトリの前記サブセットのそれぞれの中に存在している、前記ステップ、
をさらに含んでいる、請求項14に記載の媒体。
【請求項１６】
前記複数のディレクトリが、1つのディレクトリの複数のバージョンを有する、請求項14に記載の媒体。
【請求項１７】
前記方法が、
前記ファイルが前記複数のディレクトリのうちのいずれにも存在していないという判断に応答して、前記ファイルによって使用されているストレージを再利用するステップ、
をさらに含んでいる、請求項16に記載の媒体。
【請求項１８】
前記複数のディレクトリのうちの1つのディレクトリから、前記複数のポインタを使用して、前記複数のディレクトリのうちの任意のディレクトリにアクセスすることができるように、前記複数のポインタが、前記複数のディレクトリを連鎖させている、請求項13に記載の媒体。
【請求項１９】
前記複数のポインタが、
前記複数のディレクトリのうちの第一ディレクトリから、前記複数のディレクトリのうちの第二ディレクトリを指す第一ポインタと、
前記第二ディレクトリから前記第一ディレクトリを指す第二ポインタと、
を有する、請求項18に記載の媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、階層ファイルシステムに関し、より詳細には、Webサイトの開発ツールとして使用することができるファイル管理システムおよび方法に関する。
【背景技術】
【０００２】
インターネットは、商取引において大きな役割りを果たしており、ほとんどの会社はWebサイトを持つ傾向にある。多くのWebサイトは、頻繁に修正する必要があり、通常、何人もの作成者によって一時的なプロセスにおいて修正される。この結果、Webサイトのコンテンツを、適切に統合された最新かつ正確な状態に維持する継続的なプロセスの方が、最初の計画・開発段階よりも多くの労力を要することがしばしばある。インターネットサイトは、数百人単位のチームによって、毎日、あるいは1時間ごと、あるいは分単位で更新されることがある。同様に、イントラネットのコンテンツの作成者は、絶え間なく新しいコンテンツを投稿したり既存のコンテンツを変更するため、新しいコンテンツが迅速に組み込まれない限りは、基本的なコミュニケーションリソースとしてのイントラネットの有用性が制限される。
【０００３】
大きなWebサイトでは、Web作成者の数が指数関数的に増大する、したがって、多くの問題に直面する。このようなサイトのボリュームとコンテンツは、急速に増しており、サイトのトラフィックが増大してインターネットコマースが成長するにつれて、サイトをより頻繁に更新しなければならない。作成者の数と、コンテンツのボリュームおよび複雑さが増すに従って、Webサイトの管理者（「ウェブマスター」）がすべての変更を監視して品質管理を行っていくことが、ますます難しくなっている。
【０００４】
Webサイト開発は複雑であるため、Webサイト開発を管理および制御する中央システムが必要である。Webサイト開発を管理および制御する公知のシステムとして、ソフトウェアコンフィギュレーション管理システム、ドキュメント管理システム、データベースパブリッシングシステムが挙げられる。
【０００５】
このような公知のWebサイト開発システムでは、関連する欠点がいくつかある。例えば、Webサイトを維持するためには、数十人から数百人の労力がしばしば必要とされるため、Webサイトの作成者は平行して作業を進めることが望ましい。ソフトウェアコンフィギュレーション管理システムでは、複数の作成者がWebサイトの同じ領域に同時に変更を行うことができない。さらに、公知のシステムのいずれにおいても、作成者が平行して作業を進めながら、Webサイトを実際に変更することなく各自の作業を個別にテストすることはできない。従って、互いに衝突する変更がWebサイトにポストされ、それに起因してWebサイトが機能しなくなることがある。
【０００６】
作成者は、別の作成者の作業と組み合わされたときの自身の作業内容の効果を個人レベルで予測することができないため、公知のシステムにおいては、Webサイトにポストされた変更のすべてを統合し、エラーがないか変更をチェックすることを、ウェブマスターに頼っている。また、ウェブマスターは、作成者のそれぞれが変更を許可されているコンテンツのみを変更するように監視する。しかしながら、ウェブマスターは、Webサイトへの変更の統合およびテストのすべてを行わなければならないため、しばしばWebサイト開発プロセスのボトルネックとなっている。複数のユーザーの作業を統合することは、手作業であって時間がかかり、バグの修正と衝突の解決に大量の時間が無駄になる一方で、デザイン、革新、サイト戦略には、わずかな時間しか費やされない。さらに、ウェブマスターは、作成者が変更をウェブマスターにサブミットできる状態となるまで、作成者の変更の進行を容易には監視することができない。従って、ウェブマスターは、エラーを前もって訂正することができず、作成者の進行状況を把握することもできない。
【０００７】
公知のWebサイト開発システムの別の欠点は、これらのシステムではファイルのバージョンの履歴が追跡されないことである。Webサイトのファイルは、追加、削除、変更、移動、名前変更が絶え間なく行われるため、ファイルのどのバージョンを誰が作成したかと、バージョンが作成された日時とを知ることは有用である。過去のバージョンのすべてにアクセスできれば、バグの原因となった変更を見つけ出すこと、以前のバージョンに立ち戻ること、および新たなバグを識別することを、容易に行うことができる。さらに、公知のWebサイト開発システムでは、サイトの一部またはサイト全体の以前のバージョンにただちにアクセスすることはできない。Webサイトの以前の任意のバージョンにただちにロールバックできることは、サイトの機能不全、あるいは不適切な情報または不正確な情報を発信した場合における重要な災害回復ツールとなりうる。
【０００８】
さらには、プロセス障害またはシステム障害の場合には、変更の処理中にデータが失われることがある。特定のファイルシステムのすべての親ディレクトリを追跡することは難しく、手間のかかる作業である。
【発明の開示】
【課題を解決するための手段】
【０００９】
本発明は、ファイル管理システムおよび方法を提供する。
【００１０】
本発明のシステムは、階層ファイルシステムで構成されており、階層ファイルシステムは、本明細書においては「エリア」と呼ばれている。エリアには、ワークエリア、ステージングエリア、エディションエリアの3種類がある。ワークエリアは、修正可能なファイルシステムであり、ワークエリアにおいては、ユーザーは、ファイルおよびディレクトリを作成、編集、削除、追加、修正することができる。一実施例においては、ワークエリアは、既存のWebサイトの仮想的なコピーであり、ユーザーの個人的な、Webサイトのビューである。
【００１１】
ステージングエリアは、バージョニング選択操作がサポートされる読み取り専用のファイルシステムである。ワークエリアのさまざまなユーザーは、自身のワークエリアの内容をステージングエリアにサブミットすることによって、自身の作業を統合することができる。ステージングエリアにおいては、複数の開発者がそれぞれの作業を比較したり、それぞれが行った変更がどのように組み込まれるかを確認することができる。
【００１２】
エディションエリアは、読み取り専用のファイルシステムである。ステージングエリアの内容は、エディションエリアに仮想的にコピーされて、ステージングエリアの内容の瞬間的な読み取り専用スナップショットが作成される。一実施例においては、エディションエリアの内容は、Webサイトの1つのエディションの内容を表す。
【００１３】
一実施例においては、エリアが作成されるたびにディレクトリおよびファイルを物理的にコピーする必要がないように、エリアはディレクトリツリーを共有する。これによって、エリアを迅速に作成することができ、システムリソースが効率的に使用される。各ファイルおよびディレクトリには履歴オブジェクトが関連付けられており、履歴オブジェクトは、そのファイルまたはディレクトリが存在している各エリアにおける、そのファイルまたはディレクトリの内容に関する情報を格納している。
【００１４】
別の実施例においては、本発明は、各ファイルおよびディレクトリの内容の履歴を追跡する。これによって、システムは、1つのファイルを別のファイルと、または1つのディレクトリを別のディレクトリと容易に比較して、ファイルまたはディレクトリが同一であるか、または関係しているかを識別することができる。
【００１５】
さらに別の実施例においては、本発明のシステムは、1つのWebサーバーがあたかも複数のWebサーバーであるかのように動作することができるようにする、HTTPプロトコル仮想化モジュールを含んでいる。これによって、エリアごとに個別のWebサーバーを保持することなく、各エリアをHTTPプロトコルレベルにおいて完全なWebサイトとすることができる。
【００１６】
Webサイト開発用のファイル管理システムは、ファイルと、複数のディレクトリであって、それぞれが、前記ファイルが前記ディレクトリのうちの対応する1つのディレクトリの中に存在しているかを示す情報を含んでいる、前記複数のディレクトリと、前記複数のディレクトリをまとめて連鎖させるためのポインタと、前記複数のディレクトリのうちの1つのディレクトリを指す、前記ファイルのバックポインタと、を含んでいる。前記複数のディレクトリは、1つのディレクトリの複数のバージョンを含んでいる。前記ポインタは、後継ポインタと先行ポインタとを含んでおり、前記後継ポインタのそれぞれが、前記複数のディレクトリのうちの1つのディレクトリから、前記複数のディレクトリのうちの対応する1つのディレクトリの後継バージョンを指しており、前記先行ポインタのそれぞれが、前記複数のディレクトリのうちの1つのディレクトリから、前記複数のディレクトリのうちの対応する1つのディレクトリの先行バージョンを指している。
【００１７】
前記ファイル管理システムは、前記ファイルがいずれかのディレクトリの中に存在するか否かを判断するモジュールを含んでいる。さらに、前記ファイル管理システムは、異なるユーザーがWebサイトに表示されるWebコンテンツを作成および維持することができるように構成されている複数のワークエリア、を含んでおり、前記ワークエリアのそれぞれが、対応するワークエリアの中に存在しているWebコンテンツを有するファイルの仮想的な表現をユーザーが編集できるようにする目的で、読み取り操作と書き込み操作とを有するファイルシステムであり、前記ファイルが前記複数のワークエリアのうちの1つの中に存在する。
【００１８】
Webサイト開発用のファイル管理システムの方法は、ファイルのバックポインタを格納するステップであって、前記バックポインタが、複数のディレクトリのうちの1つのディレクトリを指している、前記ステップと、複数のディレクトリをまとめて連鎖させるための複数のポインタを格納するステップであって、前記複数のディレクトリのそれぞれが、前記ファイルが前記ディレクトリのうちの対応する1つのディレクトリの中に存在しているかを示す情報を含んでいる、前記ステップと、を含んでいる。
【００１９】
前記方法は、前記ファイルがいずれかのディレクトリの中に存在しているか否かを判断するステップと、前記バックポインタと、前記複数のディレクトリのそれぞれに含まれている前記情報とから、前記複数のポインタのサブセットを求めるステップであって、前記ファイルが、前記複数のディレクトリの前記サブセットのそれぞれの中に存在している、前記ステップと、をさらに含んでいる。さらに、前記複数のディレクトリは、1つのディレクトリの複数のバージョンを含んでいる。
【００２０】
前記方法は、前記ファイルが前記複数のディレクトリのうちのいずれにも存在していないという判断に応答して、前記ファイルによって使用されているストレージを再利用するステップ、をさらに含んでいる。前記複数のポインタは、前記複数のディレクトリのうちの1つのディレクトリから前記複数のディレクトリのうちの任意のディレクトリに前記複数のポインタを使用してアクセスできるように、前記複数のディレクトリを連鎖させている。前記複数のポインタは、前記複数のディレクトリのうちの第一ディレクトリから、前記複数のディレクトリのうちの第二ディレクトリを指す第一ポインタと、前記第二ディレクトリから前記第一ディレクトリを指す第二ポインタと、を含んでいる。
【００２１】
データを提供することのできる機械可読媒体は、1つ以上のプロセッサのセットによって実行されたとき、当該プロセッサのセットに、Webサイト開発用のファイル管理システムの方法を実行させ、前記方法は、ファイルのバックポインタを格納するステップであって、前記バックポインタが、複数のディレクトリのうちの1つのディレクトリを指している、前記ステップと、複数のディレクトリをまとめて連鎖させるための複数のポインタを格納するステップであって、前記複数のディレクトリのそれぞれが、前記ファイルが前記ディレクトリのうちの対応する1つのディレクトリの中に存在しているかを示す情報を含んでいる、前記ステップと、を含んでいる。前記方法は、前記ファイルがいずれかのディレクトリの中に存在しているか否かを判断するステップと、前記バックポインタと、前記複数のディレクトリのそれぞれに含まれている前記情報とから、前記複数のポインタのサブセットを求めるステップであって、前記ファイルが、前記複数のディレクトリの前記サブセットのそれぞれの中に存在している、前記ステップと、をさらに含んでいる。
【００２２】
前記複数のディレクトリは、1つのディレクトリの複数のバージョンを含んでいる。前記方法は、前記ファイルが前記複数のディレクトリのうちのいずれにも存在していないという判断に応答して、前記ファイルによって使用されているストレージを再利用するステップ、をさらに含んでいる。前記複数のポインタは、前記複数のディレクトリのうちの1つのディレクトリから前記複数のディレクトリのうちの任意のディレクトリに前記複数のポインタを使用してアクセスできるように、前記複数のディレクトリを連鎖させ、かつ、前記複数のポインタは、前記複数のディレクトリのうちの第一ディレクトリから、前記複数のディレクトリのうちの第二ディレクトリを指す第一ポインタと、前記第二ディレクトリから前記第一ディレクトリを指す第二ポインタと、を含んでいる。
【発明を実施するための最良の形態】
【００２３】
本発明は、Webサイト開発に関して説明されているが、この技術分野に精通している者に理解されるように、本発明は、別の特定の形式にも具体化することができる。
【００２４】
図1は、Webサイト開発用のコンピュータネットワーク100を示している。開発ワークステーション110（従来のパーソナルコンピュータとすることができる）では、Webサイト開発者が、Webサイトのファイルを追加、削除、編集、および検査する。開発ワークステーション110は、インターネットなどのコンピュータネットワーク120を介して開発サーバー130に接続されている。
【００２５】
開発サーバーは、Webサーバー145を含んでおり、このWebサーバー145は、開発ステーション110からのWebサイトのコンテンツに関するHTTP要求を処理する。開発サーバー130は、Webサイトのファイルが物理的に格納される従来の補助ストレージ160（Microsoft社から市販されているWINDOWS（登録商標） NTファイルシステムなど）も含んでいる。
【００２６】
開発サーバー130は、従来のメモリ150（例：RAM）と、従来のプロセッサ140も含んでおり、プロセッサ140は、Webサイト開発ソフトウェアモジュール135を実行することによって、本発明のWebサイト開発方法を実施する。Webサイト開発モジュール（後述されている）は、メモリ150に格納されている。メモリ150には、HTTPプロトコル仮想化モジュール137も格納されており、このモジュールは、後述されているように、プロセッサ140によって実行され、Webサーバー145があたかも複数のWebサーバーであるかのように動作することができるようにする。
【００２７】
開発サーバー130は、ネットワーク165を介してプロダクションWebサーバー170に結合されている。ネットワーク165は、ネットワーク120と同じネットワークとすることができ、または、別のネットワークとすることができる。WebサイトプロダクションWebサーバー170は、インターネットまたはイントラネット175に結合されている。WebサイトをWWWまたはイントラネットにポストする準備ができたとき、開発サーバー130がそのWebサイトをプロダクションWebサーバー170に送信し、プロダクションWebサーバー170は、インターネットまたはイントラネットからそのWebサイトへのアクセスを提供する。
【００２８】
Webサイトは、任意のファイルシステムのコンテンツで構成されている。本発明のWebサイト開発システムは、一連の階層ファイルシステムで構成されている。これらの階層ファイルシステムのそれぞれは、個々のファイルを管理して個々のファイルを操作する手段を提供する1つの環境である。Webサイト開発ソフトウェアモジュール135は、実行されると、ファイルシステムの一部であり、ファイルの管理および操作のほとんどを可能にする。補助ストレージ160は、ファイルおよび対応するメタデータ（例：オーナーID、グループID、アクセス制御ファイルの名前、修正日時、作成日時など）が物理的に格納される場所である。一実施例においては、（たとえファイルが補助ストレージ160に物理的に格納されていても）ファイルが補助ストレージ160以外のドライブに格納されているように見えるようにすることができる。
【００２９】
階層ファイルシステムは、ファイルとシンボリックリンクとが保持されている、ディレクトリのツリーを有する。ディレクトリツリーの一番上は、ルートディレクトリであり、他のディレクトリのすべては、ルートディレクトリから直接的または間接的に分岐している。
【００３０】
ファイルシステムは、修正可能なファイルシステム、または読み取り専用ファイルシステムとすることができる。修正可能なファイルシステムは、ファイルに対する読み取り操作（例：ルートディレクトリの取得、ディレクトリの読み取り、ディレクトリの検索、ファイルの読み取り、属性の取得、シンボリックリンクの読み取り、その他）と、修正操作（例：ディレクトリの作成、ファイルの作成、シンボリックリンクの作成、属性の設定、ファイルの削除、ディレクトリの削除、ファイル名の変更、ディレクトリ名の変更、ファイルの書き込み、その他）とをサポートしているファイルシステムである。一般的なハードディスクボリュームは、修正可能なファイルシステムの1つの例である。
【００３１】
読み取り専用ファイルシステムでは、読み取り操作のみがサポートされる。読み取り専用ファイルシステムの2つの例として、CD ROMボリュームと、書き込み防止タブが書き込み防止位置にある状態のフロッピー（登録商標）ディスクボリュームが挙げられる。
【００３２】
上述されているように、本発明のWebサイト開発システムは、階層ファイルシステムで構成されている。Webサイトのコンテンツを構成するファイルを作成することができるように、階層ファイルシステムのうちのいくつかは修正可能である。別の階層ファイルシステムでは、他のファイルシステムからのファイルを比較してWebサイト開発を調整することができ、さらに別の階層ファイルシステムには、Webサイトのコンテンツを構成する完成したファイルが含まれる。
【００３３】
本発明の階層ファイルシステムが従来のファイルシステムとは異なる1つの面として、本発明の階層ファイルシステムのいくつかでは、読み取り操作および／または修正操作に加えて、2つ以上の関係するファイルシステムの操作を可能にするバージョニング選択操作（後述されている）がサポートされている。Webサイトのコンテンツは、本発明における関係する一連のファイルシステムに対して、読み取り操作、修正操作、およびバージョニング操作を実行することによって作成される。
【００３４】
本発明の階層ファイルシステムは、「エリア」と称され、エリアには、ワークエリア、ステージングエリア、エディションエリアの3種類がある。ワークエリアは修正可能なファイルシステムであるのに対し、ステージングエリアとエディションエリアは読み取り専用のファイルシステムである。
【００３５】
ワークエリアは、最初は、既存のWebサイトの仮想的なコピーである（ただし既存のWebサイトが存在しない場合、ワークエリアは最初は空の状態である）。言い換えれば、ワークエリアは、最初は、Webサイトとして指定されるファイルシステムと同じ内容を有する。ワークエリアは、Webサイトの開発者の個人的なビューであり、Webサイトのコンテンツを作成するすべての開発者は、ワークエリアにおいてコンテンツ作成を行う。ワークエリアにおいては、開発者は、Webサイトのコンテンツを自由に追加、削除、または修正することができ、さらに、自身の変更がWebサイト全体のコンテンツにどのように組み込まれるかを確認することができる。追加操作、削除操作、および修正操作の詳細は、後述されている。1つのワークエリアにおいて作成者によって行われる変更は、別のワークエリアにおける別の作成者のWebサイトまたは作業に影響しない。なぜなら、前述されているように、各エリアは個別のファイルシステムであるためである。開発者は、自身のワークエリアの内容をステージングエリアにサブミットすることによって、ステージングエリアにおいて自身の作業を統合する。サブミット操作は、さきに言及されているバージョニング選択操作の1つであり、後からさらに詳しく説明されている。ステージングエリアは、ブランチ（ブランチについては後述されている）上のすべてのユーザーから利用可能なWebサイトの共有ビューである。言い換えれば、ステージングエリアは、ブランチ上のすべてのユーザーからアクセス可能なファイルシステムである。ステージングエリアは、何人かの開発者のワークエリアの集合的な作業内容を保持し、複数の開発者が、それぞれの変更を共有して統合することができる。ステージングエリアにおいては、複数の開発者がそれぞれの作業を比較したり、それぞれが行った変更がどのように組み込まれるかを確認することができる。比較操作は、後からより詳しく説明されるバージョニング選択操作のうちの別の1つである。
【００３６】
ステージングエリアの現在の状態（さまざまな作成者が新しい内容をワークエリアからサブミットするにつれて変化していく）が反映された最新の状態にワークエリアを維持する目的で、ステージングエリアにおける集合的な作業内容を、プライベートなワークエリアに仮想的にコピーすることができる。コピーは「仮想的」であり、なぜなら、ディレクトリツリーを物理的にコピーする必要がないように、エリアがディレクトリツリーを共有しているためである。ステージングエリアにおける集合的な作業内容が最終的であるとみなされると、その内容をパブリッシュしてWebサイトのエディションを作成することができる。エディションからワークエリアを作成するステップと、ステージングエリアをパブリッシュするステップは、後述されているバージョニング選択操作のうちのさらなる操作である。
【００３７】
ステージングエリアの内容は、エディションエリアに仮想的にコピーされて、Webサイトのエディションが作成される。この場合にも、仮想的なコピーとは、エディションがステージングエリアと同じディレクトリツリーを参照していることを意味する。エディションは、読み取り専用ファイルシステムであるため、単一のブランチに沿った特定の時点における、Webサイト全体のコンテンツの瞬間的なスナップショットである。各エディションは、アーカイブされ、すべての開発者からアクセス可能である。
【００３８】
エディションの内容は、ワークエリアに仮想的にコピーして、Webサイトのさらなる開発のためのベースとして使用することができる。エディションは、アーカイブとしての役割りも果たし、ユーザーは、ファイルあるいはディレクトリ全体を瞬時に呼び出す、あるいは、Webサイトの過去のバージョン全体を再構築することができる。
【００３９】
図2は、開発者の観点における、ワークエリアからエディションへの開発の流れを要約している。開発者は、ワークエリアにおいてファイルを編集、追加、または削除する（210）。次いで、開発者は、自身のワークエリアの内容をステージングエリアにサブミットする（220）。ステージングエリアにおいて、作成者のワークエリアの内容が、別の作成者のワークエリアの内容と統合される（230）。ステージングエリアにサブミットされた内容のすべてが良好に統合されて承認されると（240）、ステージングエリアの内容がエディションにパブリッシュされる（250）。承認されない場合、作成者は、承認されるまで自身のファイルの編集を続ける（210）。
【００４０】
一実施例によると、Webサイト開発は、開発のいくつかのブランチに分割することができる。開発者の観点からは、ブランチは、1つのWebサイトの開発の経路である。図3に示されているように、1つのブランチ300は、ワークエリア310と、ステージングエリア320と、1つ以上のアーカイブされたWebサイトエディション330とを含んでいる。互いに別個の代替開発経路を開発チームが維持することができるように、ブランチは、サブブランチを含むことができる。内容は、ブランチとサブブランチとの間で共有することができる。
【００４１】
Webサイト開発をブランチに分割する一例は、現在のWebサイト用に1つのブランチを持ち、そのWebサイトの新しいバージョン用に別のブランチを持つことである。別の例は、特定の地域またはクライアントに合わせたWebサイトを製作する目的で、異なる地域または異なるクライアントごとに、開発の異なるブランチを持つことである。
【００４２】
メインブランチは、Webサイト開発ソフトウェアモジュールが開発サーバーにインストールされたときに作成される。図4に示されているように、メインブランチ400は、最初、空のステージングエリア420と空のエディション430とを含んでいる。メインブランチは、最初、空のワークエリア410を含んでいることもできる。ワークエリアは、メインブランチが作成された時点、またはそれより後の時点で作成することができ、なぜなら、ユーザーは、ワークエリアの属性（例：ワークエリアにアクセスできる人）を定義する準備が整うまでワークエリアの作成を遅らせることを望むことがあるためである。
【００４３】
Webサイト開発ソフトウェアモジュールがインストールされる前にWebサイトが存在している場合、空のワークエリア410は、それがまだ存在していなければ作成される。図5に示されているように、オリジナルのWebサイトのコンテンツ510が、空のワークエリア410にコピーされ、次いで、空のステージングエリア420にコピーされ、次いで、最初のエディション440にパブリッシュされる。
【００４４】
最も新しいエディションの内容を新しいワークエリアに仮想的にコピーすることによって、追加のワークエリアをメインブランチ上に作成することができる。図6は、エディション440からメインブランチ上に3つのワークリア600が作成された状況を示している。ワークエリア600の内容は、ステージングエリア610にサブミットされ、ステージングエリア610の内容は新しいエディション620にパブリッシュされる。
【００４５】
メインブランチまたはそれ以外のブランチから分かれたサブブランチを作成することもできる。図7は、メインブランチから分かれたサブブランチが作成された状況を示している。親ブランチ720からのエディション710が、サブブランチ730の最初のエディション725として使用されている。次いで、最初のエディション725の内容が、サブブランチ730の中のワークエリア740と、ステージングエリア750と、新しいエディション760に仮想的にコピーされる。なお、別のサブブランチから分かれたサブブランチを同様に作成できることに留意されたい。サブブランチ上で行われる作業は、より高いレベルのブランチ上で行われる作業とは無関係に平行して存在する。サブブランチ上で作成される作業は、そのサブブランチ上のエディションの内容をより高いレベルのブランチ上のワークエリアに仮想的にコピーすることによって、その高いレベルのブランチに組み込むことができる。サブブランチからの内容は、別のワークエリアからの内容と統合され、より高いレベルのブランチ上の新しいエディションとしてパブリッシュされる。
【００４６】
ここまで、Webサイト開発システムの概要と一般的な使用方法について説明した。以下では、一実施例による、システムの特定の実施形態について説明されている。
【００４７】
個別のワークエリアと、ステージングエリアと、エディションエリアのそれぞれは、ツリー構造に編成されている1つ以上のファイルおよびディレクトリによって構成されている。図8は、エリアのディレクトリツリーの例を示しており、このツリーでは、ディレクトリ1がルートディレクトリである。複数のエリアが同じディレクトリツリーを共有することができる。実際に、新しいエリアを作成する目的で既存のエリアがコピーされると、その新しいエリアは、既存のエリアと同じルートディレクトリを単に参照する。
【００４８】
個別のワークエリアと、ステージングエリアと、エディションエリアのそれぞれは、エリアを表し、かつ、名前フィールドと、オブジェクトIDフィールドと、生成IDフィールドと、ディレクトリフィールドと、ブランチフィールドとを有するオブジェクト、を作成することによって作成される。名前フィールドは、ワークエリアの名前を含んでいる。ディレクトリフィールドは、特定のワークエリア、ステージングエリア、またはエディションエリアのディレクトリツリーのルートディレクトリを識別する。ブランチフィールドは、ワークエリアが存在しているブランチを示す。図9は、ワークエリアオブジェクトを図で表している。なお、ワークエリアオブジェクトは既存のディレクトリツリーを指すため、ワークエリアの作成時には、実際のコピーとは対照的に、ディレクトリツリーの仮想的なコピーが作成されることに留意されたい。
【００４９】
個別のワークエリアと、ステージングエリアと、エディションエリアのそれぞれは、2つの一意の識別子を有し、そのうちの1つは、本出願においては「生成ID」と称されており、他方は「オブジェクトID」と称されている。オブジェクトIDは、エリアを表すオブジェクトを識別し、オブジェクトにオブジェクトIDがいったん割り当てられると、そのオブジェクトIDは変更されない。各エリアは、一意の生成IDによっても識別され、生成IDは、エリアが他のエリアとどのように関係しているかを示す。特定のエリアの生成IDは、（例えば、ステージングエリアがエディションにパブリッシュされるときに）後述されているように変更することができる。生成IDは、生成IDフィールドに格納されている。オブジェクトIDは、オブジェクトIDフィールドに格納されている。
【００５０】
なお、ディレクトリ、ファイル、履歴オブジェクト（後述されている）、その他のオブジェクトにも、オブジェクトIDが割り当てられ、これらのIDは、いったん割り当てられた後は変更されない。
【００５１】
生成IDは、一意の数のシーケンスまたはセットによって構成されている。生成IDは、エリアを一意に識別するのみならず、上述されているように、エリアが他のエリアとどのように関係しているかも示す。
【００５２】
あるエリアが他のエリアから直接的または間接的に派生している場合、前者のエリアはその別のエリアと関係している。例えば、図7において、サブブランチにおける最初のエディションは、親ブランチにおけるエディション2から直接的に派生している。サブブランチにおけるワークエリアは、サブブランチにおける最初のエディションから直接的に派生しており、親ブランチにおけるエディション2から間接的に派生している。
【００５３】
生成IDは、オブジェクト自身の一意な数と、その生成IDが派生した元の生成IDの数字とを含んでいる。例えば、あるエリアに割り当てられている一意の数が1であり、かつ、別のエリアに割り当てられている一意の数が0である場合、これらのエリアから派生しているエリアの生成IDは、自身の一意の数、例えば4と、数0および1である。
【００５４】
図10は、新しいエリアに割り当てられる生成IDを親生成IDから導く方法を示しており、親生成IDは、新しいエリアの直接の親に割り当てられている。一意の数を順次（例：1、2、3、4）またはランダムに生成する従来のアルゴリズムを使用して、一意の数が取得される（1000）。次いで、親生成IDに関連付けられている一意の数のセットまたはシーケンスが取得される（1010）。次いで、親生成IDと、取得された一意の数との連結である数のセットまたはシーケンスが作成される（1020）。
【００５５】
エリア間の関係は、系統ツリーによっても表される。系統ツリーはデータ構造であり、ツリーの各ノードが異なる生成（すなわちエリア、本出願全体を通じてエリアはしばしば生成と称されている）を表している。
【００５６】
図11は、系統ツリーの例を示している。生成G0は、最初のエディションを表している。生成G2は、1つのワークエリア（「ワークエリア1」）を表しており、生成G3は、別のワークエリア（「ワークエリア2」）を表しており、生成G1は、エディション（「エディション1」）を表しており、生成G4はステージングエリアを表している。この系統ツリーは、G1、G2、G3がG0から直接的に派生していることを示しており、すなわち、G1、G2、およびG3は、G0と同じルートディレクトリを持つ。G4は、G0から間接的に派生しており、かつG1から直接的に派生しており、従って、G4もG0と同じルートディレクトリを持つ。
【００５７】
図12は、ディレクトリ1200を図で表している。このディレクトリが変更された生成のそれぞれに対して、このディレクトリは生成ページ1280を含んでおり、生成ページ1280は、自身に対応する生成におけるディレクトリの内容をリストするオブジェクトである。従って、ディレクトリには、そのディレクトリが変更された生成のそれぞれにおけるディレクトリの内容のスナップショットが効率的に含まれている。生成ページ1280により、たとえディレクトリが異なるエリアにおいて異なる内容を含んでいても、異なるエリアが同じディレクトリを参照することができる。
【００５８】
図12に示されているディレクトリ1200においては、ディレクトリページ1280は、生成G0においてディレクトリ1200にアイテム「m」が追加されたことと、生成G2においてディレクトリ1200にアイテム「n」が追加されたことと、生成G3においてディレクトリ1200にアイテム「p」が追加されたこととを示している。なお、ディレクトリ1200から何も削除されていないと想定すると、ディレクトリページ1280は、特定の生成において追加された内容のみならず、その特定の生成が派生した元の生成において追加された内容も含んでいることに留意されたい。例えば、図11に示されている系統ツリーがこの例にあてはまると想定する。生成G0においては、ディレクトリd1はアイテム「m」を含んでいる。生成G2において、アイテム「n」がディレクトリ1200に追加され、従って、G2はGOから派生しているため、ディレクトリ1200は、生成G2においてアイテム「m」と「n」とを含んでいる（「m」が削除されなかったと想定する）。生成G3においては、アイテム「p」がディレクトリd1に追加され、従って、ディレクトリ1200は、アイテム「p」と「m」とを含んでいる。なお、G3はG2からは派生しておらず、従って、ディレクトリ1200は、生成G3においてアイテム「n」を含まないことに留意されたい。
【００５９】
一実施例においては、ある特定の生成においてディレクトリが変更されなかった場合、そのディレクトリは、その生成の生成ページを含まない。ディレクトリが生成において変更されると、その生成の生成ページがディレクトリに追加される。ディレクトリの中の各アイテムには、履歴オブジェクトが関連付けられている。履歴オブジェクトは、ファイルまたはディレクトリの内容が編集または修正された生成を示す。言い換えれば、履歴オブジェクトは、ディレクトリの中のアイテムの履歴を示す。履歴オブジェクトは、生成IDのフィールド1225と、ファイルまたはディレクトリへのポインタの内容フィールド1230とを含んでいる。図12に示されている例においては、履歴オブジェクトh0は、生成G0においてアイテムmが、ファイルf1に関連付けられている内容を含んでいることを示している。また、履歴オブジェクトh0は、生成G2において、アイテムnが、ファイルf2に関連付けられている（かつファイルf1には関連付けられていない）内容を含んでいることも示している。内容フィールド1230にリストされているアイテムは、ファイルf2の実際の内容1235を指す。このアイテムは、f2がディレクトリである場合には、ディレクトリ1200など別のディレクトリを指す。内容には、ディレクトリにリストされているアイテムに関連付けられている先行するファイルまたはディレクトリへのポインタが格納される「前のフィールド」1240が含まれている。例えば、f2は、内容「B」を有するファイルと、f1へのポインタ1240とを指しており、すなわち、生成G2の前にアイテム「m」はf1の内容を保持していた。
【００６０】
図13は、ワークエリア、ステージングエリア、およびエディションエリアの作成および操作を可能にする、本発明の一実施例によるWebサイト開発ソフトウェアモジュール135を示している。Webサイト開発ソフトウェアモジュール135は、ワークフローサブシステム1300と、バージョニングサブシステム1305と、オブジェクトサブシステム1310とを含んでいる。ワークフローサブシステムは、ワークエリア、ステージングエリア、エディションエリア、およびブランチを作成および管理する。バージョニングサブシステムは、ファイルおよびディレクトリの修正および編集、ファイルの比較、ディレクトリの比較、ステージングエリアへのワークエリアの内容のサブミット、ファイルおよびディレクトリの衝突のチェックといった機能を、管理および制御する。オブジェクトサブシステムは、サーバーのメインメモリの中とディスクの中のオブジェクトの配布を管理する。オブジェクトサブシステムは、従来の永続オブジェクト格納／キャッシングサブシステムとして実施することができる。
【００６１】
ワークフローサブシステムは、ワークエリア作成モジュール1312と、ステージングエリア作成モジュール1314と、エディションエリア作成モジュール1316と、ブランチ作成モジュール1346と、エリア削除モジュール1342とを含んでいる。バージョニングサブシステム1305は、サブミットモジュール1336と、衝突チェックモジュール1338と、比較モジュール1340と、アイテム追加モジュール1318と、参照カウントモジュール1320と、直接参照追加モジュール1332と、直接参照削除モジュール1324と、ディレクトリ読み取りモジュール1326と、アイテム削除モジュール1328と、ファイル編集モジュール1330と、名前変更モジュール1332と、ディレクトリパス生成モジュール1334と、ロックモジュール1344と、生成IDモジュール1348とを含んでいる。ワークフローサブシステムとバージョニングサブシステムの中のこれらのモジュールによって、Webサイト開発に使用されるエリア、ファイル、ディレクトリ、その他のオブジェクトの作成および操作が可能になる。
【００６２】
ワークフローサブシステムとバージョニングサブシステムは、C＋＋プログラミング言語で実施される。以下では、ワークフローサブシステムとバージョニングサブシステムの中のモジュールの動作について説明されている。
【００６３】
上述されているように、ワークエリアは、以前のエディションの内容をワークエリアに仮想的にコピーすることによって作成される（ただし例外として、メインブランチ上の最初のワークエリアは最初は空である）。図14は、エディション（以下ではエディションeと称されている）からワークエリアを作成するワークエリア作成モジュール1312の動作を示している。モジュール1312は、エディションeのルートディレクトリと生成IDとを取得する（1410）。次いで、モジュール1312は、エディションeの生成IDから導かれる新しい生成IDを、生成IDモジュール1348から取得する（1420）。生成IDモジュール1348は、図11に示されているプロセスを実行することによって新しい生成IDを導く。モジュール1312は、ワークエリアの新しいオブジェクトID（ランダムに生成または順次生成される一意の数）も取得する。
【００６４】
モジュール1312は、ワークエリアを表し、かつ、名前フィールドと、ルートディレクトリフィールドと、オブジェクトIDフィールドと、生成IDフィールドと、ブランチフィールドとを有するオブジェクトを作成する（1430）。モジュールは、名前フィールドにワークエリアの名前を格納し、ディレクトリフィールドにエディションeのルートディレクトリを格納し、生成IDフィールドに、ステップ1420において導かれた生成IDを格納し、オブジェクトIDフィールドにオブジェクトIDを格納し、ブランチフィールドに、ワークエリアが存在するブランチのIDを格納する（1440）。従って、このオブジェクトは、ワークエリアが、エディションeと同じルートディレクトリを有し、かつ、導かれた生成IDを有するデータ構造であることを示している。なお、エディションeの内容は、ワークエリアを作成する目的に物理的にはコピーされないことに留意されたい。代わりに、新しく作成されるワークエリアが最初はエディションと同じデータ構造を持つことを示すオブジェクトが作成される。
【００６５】
図15は、エディション（以下ではエディションeと称されている）からステージングエリアを作成するためのステージングエリア作成モジュール1314の動作を示している。ステージングエリアを作成する目的で、モジュール1314は、エディションeの生成IDを取得し（1510）、次いで、エディションeの生成IDから導かれる新しい生成IDを、生成IDモジュール1348から取得する（1520）。モジュール1314は、ステージングエリアの新しいオブジェクトID（ランダムに生成または順次生成される一意の数）も取得する。
【００６６】
モジュール1314は、ステージングエリアを表し、かつ、名前フィールドと、ルートディレクトリフィールドと、生成IDフィールドと、オブジェクトIDフィールドと、ブランチフィールドとを有するオブジェクトを作成する（1530）。モジュール1314は、名前フィールドにステージングエリアの名前を格納し、ルートディレクトリフィールドにエディションeのルートディレクトリを格納し、生成IDフィールドに、ステップ1520において得られた生成IDを格納し、オブジェクトIDフィールドに、ステップ1525において得られたオブジェクトIDを格納し、ブランチフィールドに、ステージングエリアが存在するブランチのIDを格納する（1540）。
【００６７】
場合によっては、複数のステージングエリアを持つことが望ましい。例えば、パブリックなステージングエリアに加えて、特定のユーザーのみが内容をサブミットすることのできるプライベートなステージングエリアをいくつか持つことが望ましいことがある。複数のステージングエリアは、上述されているステージングエリア作成方法を複数回実行することによって作成することができる。
【００６８】
図16aおよび図16bは、ステージングエリア（以下では、任意のラベル「s」が付されている）の内容からエディションを作成するためのエディション作成モジュール1316の動作を示している。モジュール1316は、ステージングエリアsの生成IDとルートディレクトリとを取得する（1610）。モジュールは、エディションeの一意のオブジェクトIDも取得する（1615）。モジュール1316は、新しいエディションを表し、かつ、名前フィールドと、ルートディレクトリフィールドと、生成IDフィールドと、オブジェクトIDフィールドと、ブランチフィールドとを有するオブジェクトを作成する（1620）。モジュール1316は、名前フィールドに新しいエディションの名前を格納し、生成IDフィールドに、ステージングエリアsの生成IDを格納し、ルートディレクトリフィールドにステージングエリアsのルートディレクトリを格納し、オブジェクトIDフィールドに、ステップ1625において得られたオブジェクトIDを格納し、ブランチフィールドに、エディションが存在するブランチのIDを格納する（1630）。
【００６９】
モジュール1316は、ステージングエリアの生成IDを使用することによって、ステージングエリアsを新しいエディションに変換する。従って、エディションが作成されるき、エディション作成モジュール1316は、新しい生成IDを取得し（1640）、それをステージングエリアに割り当てる（1650）。
【００７０】
図17a〜図17cは、ブランチ作成モジュール1346の動作を示している。ブランチを作成する目的で、モジュール1346は、作成されるブランチがメインブランチであるかを判断する（1705）。ブランチがメインブランチではない場合、モジュール1346は、新しいブランチを分岐させる親ブランチから、ベースエディション（エディションbと称する）の生成IDを取得する（1710）。エディション「b」は、親ブランチ上の任意のエディションとすることができる。次いで、モジュール1346は、生成IDモジュール1348から、エディションbの生成IDから導かれる新しい生成IDを取得する（1715）。次いで、エディションbと同じルートディレクトリと、ステップ1715において得られた生成IDとを有する最初のエディション（「エディションe」と称する）が作成される（1720）。さらに、エディションeと同じルートディレクトリと、エディションeの生成IDから導かれる別の生成IDとをそれぞれが有するワークエリアを、必要であれば1つ以上作成することができる（1730）。ワークエリアは、ブランチの作成時点、またはそれより後の時点で作成することができる。次いで、エディションeと同じルートディレクトリと、エディションeの生成IDから導かれる生成IDとを有するステージングエリアが作成される（1740）。エディションe、ワークエリア、およびステージングエリアは、図14〜図16に関して説明されている方法に従って作成される。
【００７１】
再びステップ1705を参照し、作成されるブランチがメインブランチである場合、モジュール1346は、ルート生成ID（g0と称する）を取得する（1750）。ルート生成IDは、一意の数を生成する従来のプログラムを使用して生成される数であり、別の生成IDからは導かれない。次いで、モジュール1346は、空のディレクトリ（d0と称する）と、そのディレクトリの履歴オブジェクト（h0と称する）とを作成する（1755,1760）。モジュール1346は、履歴オブジェクトが生成g0においてディレクトリd0に関連付けられていることを示すエントリを、その履歴オブジェクトに追加する（1765）。このエントリは、表記（g0,d0）によって表すことができる。
【００７２】
履歴オブジェクトを作成した後、モジュール1346は、ルートディレクトリd0とルート生成g0とを有する最初のエディションを作成する（1770）。また、モジュールは、最初の（すなわち空の）エディションと同じルートディレクトリと、ルート生成から導かれる別の生成IDとをそれぞれが有する、ステージングエリアと1つ以上のワークエリアも作成する（1775）。なお、ワークエリアは、ブランチの作成時に作成する必要はなく、あとの時点において作成することができる。
【００７３】
アイテム追加モジュール1318は、ファイルまたはディレクトリなどのオブジェクトを、ワークエリアまたはステージングエリアに追加することができるようにする。図18a〜図18dは、内容「f」を有するアイテム「n」をエリア「a」におけるディレクトリ「d」に追加する場合の、アイテム追加モジュール1318の動作を示している。エリアは、ワークエリアまたはステージングエリアとすることができ、アイテムnは、ファイルまたはディレクトリとすることができる。アイテムfも、ファイルまたはディレクトリとすることができる。アイテムを追加する目的で、モジュール1318は、エリアaの生成ID（「g」と称する）を識別する（1805）。次いで、モジュール1318は、ディレクトリdを読み取り（1810）、生成gの生成ページが存在しているかを判断する（1815）。ディレクトリdの生成ページが存在していない場合、モジュール1318は、生成ページを有する最も近い関係の親生成（「最も合致する生成）」）の生成ページをコピーすることによって、ディレクトリの生成ページを作成する（1820）。生成gの生成ページが見つかるかまたは作成した後、モジュール1318は、名前が「n」であるアイテムがないか生成ページの内容をスキャンし（1825）、生成gにおけるディレクトリdの中にアイテムnが存在しているかを判断する（1835）。名前が「n」であるアイテムが生成gにおけるディレクトリdの中に見つからない場合、モジュール1318は、生成gにおいてアイテムnには内容「f」が関連付けられていることを示すエントリを有する履歴オブジェクトを作成する（1840）。このようなエントリを表す目的には、表記（f,g）が使用される。次いで、モジュール1318は、ファイル「n」に履歴オブジェクト「h」が関連付けられていることを示す、表記（n,h）によって表されるエントリを、生成ページ「g」に追加する（1845）。なお、アイテムnをディレクトリdに追加する目的には、アイテムnはディレクトリdに仮想的にも物理的にもコピーされないことに留意されたい。ディレクトリdは、単にアイテムを参照するに過ぎない。
【００７４】
ステップ1835において、アイテムnがディレクトリにすでに追加されているが、アイテムnの更新されたバージョンが既存のバージョンに置き換わっている（すなわち、新しい内容がアイテムnに関連付けられている）ときには、判断の結果は「はい」である。その場合、モジュール1318は、アイテム「n」が変更されている最も新しい生成において、ファイル「n」に関連付けられている履歴オブジェクトの内容をスキャンする（1850）。次いで、モジュール1318は、生成gにおいてアイテムnが変更されたかを判断する（1855）（すなわち、モジュール1318は、アイテムnがエリアaにおいて変更されたかを判断し、なぜならエリアaは生成ID gを有するためである）。アイテムnが生成gにおいて変更されていない場合、モジュール1318は、生成gにおいてファイルnには内容fが関連付けられていることを示すエントリを、履歴オブジェクトに追加する（1860）。アイテムfは、アイテムnの前の内容を示すフィールドを有する（例えば、アイテムfはアイテムnの前の内容へのポインタを含んでいる）。モジュール1318は、最も合致する生成における「n」の内容を指すようにアイテムfの前のフィールドを設定する（1865）。
【００７５】
ステップ1855を参照して、アイテムnが生成gにおいて変更されていた場合、モジュール1318は、生成gにおいてアイテムnの内容がアイテムfであることが反映されるように、生成gに関連付けられている履歴オブジェクトのエントリを変更する（1870）。次いで、モジュール1318は、生成gにおけるnの前の内容を指すように、アイテムfの前のフィールドを設定する（1875）。
【００７６】
オブジェクト（例：ディレクトリ、ファイル、履歴オブジェクト）がいずれのエリアからもアクセスすることができない場合、リソースを再利用する目的で、そのオブジェクトはストレージから物理的に削除される。オブジェクトの追加およびエリアからの削除は、仮想的とすることができ、なぜなら、多くの場合、オブジェクトの1つの物理的コピーのみが格納されているためである。従って、オブジェクトの物理的コピーを削除するべきかを判断するためには、いずれかのエリアからそのオブジェクトにアクセスできるかを知る必要がある。エリアからオブジェクトにアクセスできる場合、そのオブジェクトはそのエリアにおいて「参照されて」いる。いずれか1つのエリアからオブジェクトにアクセスできるかを判断する目的で、各オブジェクトに対して参照カウントが維持され、参照カウントは、オブジェクトにアクセスできるエリアの数を示す。オブジェクトの参照カウントが0である場合、そのオブジェクトは削除することができる。
【００７７】
参照カウントの計算を可能にする目的で、各オブジェクトには、「参照リスト」と「非参照リスト」とが関連付けられている。参照リストは、オブジェクトが追加されたディレクトリと、参照されている各ディレクトリについて、そのディレクトリにオブジェクトが追加された生成（すなわちエリア）とを示す。具体的には、オブジェクトがディレクトリに追加されるたびに、そのオブジェクトがそのディレクトリに追加された生成を示すエントリが、参照リストに追加される。
【００７８】
非参照リストは、オブジェクトが削除されたディレクトリと、参照されている各ディレクトリについて、そのディレクトリからオブジェクトが削除された生成とを示す。具体的には、オブジェクトがディレクトリから削除されるたびに、そのディレクトリと、そのディレクトリからそのオブジェクトが削除された生成とを示すエントリが、非参照リストに追加される。
【００７９】
直接参照追加モジュール1322は、参照リストにエントリを追加する。図19は、オブジェクト（例：ファイル、ディレクトリ、または履歴オブジェクト）がエリア「a」においてディレクトリ「d」に追加されるときの、直接参照追加モジュールの動作を示している。オブジェクトcがディレクトリdに追加されるとき、cへのdの直接参照が追加される。言い換えれば、cの参照リストは、cがディレクトリdに追加されたことを示している。直接参照を追加する目的で、直接参照追加モジュール1322は、最初に、エリアaの生成（便宜上「g」と称する）を取得する（1910）。次いで、直接参照追加モジュール1322は、オブジェクトcの参照リストに、オブジェクトcが生成gにおいてディレクトリdに追加されたことを示すエントリが存在しているかを判断する（1920）。そのようなエントリは、便宜上、表記（g,d）によって表される。オブジェクトcの参照リストに（g,d）が存在していない場合、そのエントリが参照リストに追加される（1930）。
【００８０】
（g,d）が参照リストに追加された後、または（g,d）が参照リストにすでに存在していた場合、直接参照追加モジュール1322は、非参照リストにエントリ（g,d）が存在しているかを判断する（1940）。以前に生成gにおいてオブジェクトcがディレクトリpから削除された場合、非参照リストにエントリ（g,d）が存在している。オブジェクトcの非参照リストにエントリ（g,d）が存在していない場合、直接参照を追加するプロセスは完了する。非参照リストにエントリ（g,d）が存在している場合、非参照リストからそのエントリが削除される（1950）。さらに、生成gから直接的に派生している生成のそれぞれについて（giと称する）、エントリ（gi,d）が非参照リストに追加される（1960）。この最後のステップの理由は、派生した生成は最初はその親生成と同じ内容であるためである。従って、1つの生成においてあるオブジェクトにアクセスできる場合、子生成が派生した後にそのオブジェクトが親ディレクトリに追加された場合と、そのオブジェクトが子生成から明示的に削除された場合とを除き、その生成から派生したすべての子生成からそのオブジェクトにアクセスすることができる。従って、既存の子生成を持つ生成においてオブジェクトがディレクトリに追加される場合、非参照リストは、既存の子生成からそのオブジェクトにはアクセスできないことを示していなければならず、なぜなら、既存の子生成が派生した時点でそのオブジェクトは親生成の一部ではなかったためである。当然ながら、図18a〜図18dに関連して図示および説明されている方法を使用して、そのオブジェクトを子生成に追加することもできる。
【００８１】
直接参照削除モジュール1324は、非参照リストにエントリを追加する。図20は、エリア「a」においてディレクトリ「d」からオブジェクト「c」が削除されるときの、直接参照削除モジュール1324の動作を示している。直接参照削除モジュール1324は、エリアaの生成ID（便宜上「g」と称する）を確認する（2010）。次いで、直接参照削除モジュール1324は、オブジェクトの参照リストに、以前に生成gにおいてディレクトリdにオブジェクトcが追加されたことを示すエントリが存在しているかを判断する（2020）。そのようなエントリは、表記（g,d）によって表される。参照リストに（g,d）が存在していない場合、このプロセスは完了し、なぜなら、オブジェクトcは生成gにおいてディレクトリdへの直接的な参照を持たなかったためである。従って、削除する必要のある参照が存在しない。
【００８２】
参照リストに（g,d）が存在している場合、オブジェクトcの参照リストから（g,d）が削除される（2030）。さらに、gから派生している子生成（giと称する）それぞれについて、エントリ（gi,d）が非参照リストに存在していない場合、そのエントリが参照リストに追加される（2040）。このステップの理由は、オブジェクトcが既存の子生成からアクセス可能であった場合、親生成からはオブジェクトcが削除されたが、既存の子生成からはオブジェクトcに依然としてアクセス可能であることを、参照リストが示すようにするためである。ステップ2040の後、直接参照削除モジュール1324は、非参照リストの中にエントリ（g,d）が存在しているかを判断する（2050）。エントリが存在しない場合、非参照リストに追加される（2060）。エントリが存在している場合、直接参照を削除するステップが完了する。エントリ（g,d）が非参照リストにすでに存在しているはずはないが、それ以前にこのエントリが誤って非参照リストに追加された場合に、直接参照削除モジュール1324はこの判断を行う。
【００８３】
参照カウントモジュール1320は、アイテムが参照された回数を計算する。これを目的として、参照カウントモジュール1320は、2個の要素から成るリストpを維持し、このリストは最初は空である。参照カウントモジュール1320は、アイテムfが参照された回数を表すための整数nも使用し、この整数は、最初は0に設定される。
【００８４】
図21aおよび図21bは、アイテムfの参照数を計算する場合の、参照カウントモジュール1320の動作を示す。参照カウントモジュール1320は、アイテムfの参照リストおよび非参照リストを取得する（2110,2120）。参照カウントモジュール1320は、系統ツリーのルートノードの生成ID（便宜上「g」と称する）を取得する（2125））（本発明におけるすべてのエリアは系統に編成できる）。参照カウントモジュール1320は、参照リストの中の、生成gに関連するエントリすべてを見つける（2130）。例えば、生成gにおいてアイテムfがディレクトリd1に追加された場合、参照リストにはエントリ（g,d1）が存在しており、参照カウントモジュール1320は、このエントリを見つける。生成gに関連するエントリのそれぞれについて、参照カウントモジュール1320は、エントリ（アイテム名,＋）をリストpに追加し（2130）、この場合の「アイテム名」は、生成gにおいて参照されているアイテムの名前である。「＋」は、そのアイテムが（非参照リストとは対照的に）参照リストにおいて参照されたことを意味する。例えば、アイテムfの参照リストにエントリ（g,d1）が見つかった場合、エントリ（d1,＋）がリストpに追加される。リストpに、アイテム名が同じであるエントリ（例：（d1,−））がすでに含まれている場合、参照カウントモジュールは、エントリを（アイテム名,＋）に設定する。
【００８５】
参照カウントモジュール1320は、非参照リストも検索して、非参照リストの中の、生成gに関連するエントリすべてを見つける（2140）。生成gに関連する非参照リストの中のエントリのそれぞれについて、参照カウントモジュール1320は、エントリ（アイテム名,−）をリストpに追加し、この場合の「−」は、そのアイテムが非参照リストにおいて参照されたことを意味する。リストpに、アイテム名が同じであるエントリがすでに含まれている場合、参照カウントモジュールは、エントリを（アイテム名,−）に設定する。
【００８６】
次いで、参照カウントモジュール1320は、リストpの中の「＋」のエントリのそれぞれについて、n＝n＋1に設定する（2150）。nは、最初は0に設定されている。次いで、参照カウントモジュール1320は、生成gが子生成（すなわち生成gから派生している生成）を持つかを判断する（2160）。持たない場合、参照カウントは完了し（2170）、nが、アイテムfへの参照数である。生成gが子生成を持つ場合、参照カウントモジュール1320は、子生成のそれぞれについて、gを子生成の生成IDに設定し（2180）、ステップ2130に戻る。
【００８７】
図22は、エリア「a」におけるディレクトリ「d」の内容を読み取る場合の、ディレクトリ読み取りモジュール1326の動作を示している。ディレクトリ読み取りモジュール1326は、エリアaの生成（「g」と称する）を取得する（2210）。ディレクトリ読み取りモジュール1326は、ディレクトリを分析して、生成gの生成ページが存在しているかを判断する（2220）。ディレクトリdがエリアaにおいてすでに修正されていた場合、生成gの生成ページが存在する。生成gの生成ページが存在する場合、ディレクトリ読み取りモジュール1326は、生成ページ「g」におけるエントリのリストを戻す（2230）。存在しない場合、ディレクトリ読み取りモジュール1326は、最も近い関係の親生成ページ（「最も合致する生成ページ」）の生成ページにおけるエントリの（図22より）リストを戻す（2240）。
【００８８】
以下では、図12に示されているディレクトリを使用して、ディレクトリ読み取りモジュールの動作の一例が説明されている。生成G3を有するエリアにおけるディレクトリの内容を読み取る目的で、ディレクトリ読み取りモジュール1326は、生成ページG3における1つ以上のエントリ（この例においてはエントリ（m,h0））のリストを戻す（1326）。
【００８９】
いま、図12における生成が、図11に示されているような関係にあると想定する。生成G4におけるディレクトリdの内容を読み取る目的で、ディレクトリ読み取りモジュール1326は、G4の生成ページが存在しているかを判断する（1326）。G4の生成ページが存在していないため、ディレクトリ読み取りモジュール1326は、最も合致する生成ページを検索する。G1は、G4に最も近い親生成であるが、G1の生成ページが存在しない。G0は、次に近い親生成であり、G0の生成ページが存在しているため、G0の生成ページにおけるエントリのリストが、G4におけるディレクトリの内容として戻される。
【００９０】
図23aおよび図23bは、生成ID「g」を有するエリア「a」におけるディレクトリ「d」からアイテム「n」が削除されるときの、アイテム削除モジュール1328の動作を示している。アイテムnは、ディレクトリ内の任意のオブジェクト（例：ファイル、別のディレクトリ）とすることができる。ディレクトリdからアイテムを削除する目的で、図22に関して説明されている方法に従って、ディレクトリdが読み取られる（2310）。アイテム削除モジュール1328は、ディレクトリdの中に生成gの生成ページが存在しているかを判断する（2320）。存在していない場合、最も近い親生成（「最も合致する生成」）から生成ページをコピーすることによって、生成gの生成ページが作成される（2330）。
【００９１】
アイテム削除モジュール1328は、生成ページ「g」の中にアイテムnに対応するエントリが存在しているかを判断する（2330）。存在していない場合、アイテム削除モジュール1328は、エラーが起きたことを示し（2340）、なぜなら、アイテムnが生成gにおけるディレクトリdの中に存在しておらず、従って、生成gにおけるディレクトリから削除できないためである。
【００９２】
ステップ2330に戻って、生成ページgにアイテムnのエントリが存在している場合、アイテム削除モジュール1328は、nに対応する履歴オブジェクトを取得する（2350）。アイテム削除モジュール1328は、生成gにおいてアイテムnが修正されたことを履歴オブジェクトが示しているかを判断する（2355）。言い換えれば、アイテム削除モジュール1328は、生成「g」に関連するエントリが履歴オブジェクトに含まれているかを判断する。
【００９３】
生成gにおいてアイテムnが変更されていない場合、アイテム削除モジュール1328は、生成gにおけるアイテムnがディレクトリdから削除されたことを示すエントリを履歴オブジェクトに追加する（2370）。このプロセスにおけるアイテムnの削除は仮想的であるため、このエントリを追加することによって、生成gにおけるディレクトリdからアイテムnが削除されたことになる。このエントリは、表記（g,z）によって表され、この場合の「z」は、アイテムが削除されたことを示すオブジェクトを表す。アイテムnのzオブジェクトが作成されていない場合、アイテム削除モジュール1328は、zオブジェクトを作成する。
【００９４】
ステップ2355を参照し、アイテムnが生成gにおいて変更されていた場合、アイテム削除モジュール1328は、生成gにおいてnがディレクトリdから削除されたことを示すように、生成gに対応する履歴オブジェクトの中のエントリを変更する（2360）（すなわちエントリは（g,z）となる）。アイテム削除モジュール1328は、アイテムnのzオブジェクトがまだ存在していない場合、それを作成する。
【００９５】
zオブジェクトは、図12に示されているファイルの内容1235と同様に、アイテムの前の内容を示すフィールドも有する。このフィールドは、「前のフィールド」と称される。ステップ2360または2370の後、zオブジェクトにおける前のフィールドは、生成gにおけるnの前の内容を指すように設定される（2380）。
【００９６】
図24aおよび図24bは、生成ID「g」を有するワークエリア「a」におけるディレクトリ「d」の中のファイル「n」を編集する場合の、ファイル編集モジュール1320の動作を示している。ファイル編集モジュール1320は、ファイル「n」に対する書き込みコマンドを受信する（2405）。次いで、ファイル編集モジュール1320は、ファイルnの履歴オブジェクトを取得し（2410）、ファイルnが生成gにおいて変更されたか（すなわち生成gに関連するエントリが存在しているか）を判断する（2420）。変更されていた場合、ファイル編集モジュール1320は、ファイル「n」への変更すべてを、生成gにおけるファイルnに関連付けられている内容に書き込む（2430）。
【００９７】
履歴オブジェクトが生成gに関連するエントリを持っていない場合、ファイル編集モジュール1320は、最も合致する生成に関連するエントリを見つける（2440）。次いで、ファイル編集モジュール1320は、ステップ2440におけるエントリに関連付けられているファイル（f1と称する）をコピーし（2450）、ファイルf1のこの新しいコピー（f2と称する）に、すべての変更を書き込む（2460）。生成gにおけるファイルnの内容がファイルf2の内容であることを示すエントリを、履歴オブジェクトに追加する（2470）。言い換えれば、ファイル編集モジュール1320は、表記（g,f2）によって表されるエントリを履歴オブジェクトに追加する。
【００９８】
図25は、エリアaにおけるディレクトリd1の中のアイテムn1（ファイルまたはディレクトリ）を、エリアaにおけるディレクトリd2の中のアイテムn2に名前を変更する場合の、名前変更モジュール1332の動作を示している。名前変更モジュール1332は、ディレクトリd1の中のアイテムn1の履歴オブジェクト（h1と称される）を取得する（2510）。なお、そのような履歴オブジェクトが存在しない場合、名前変更モジュール1332は、エラーが起きたことをユーザーに報告する。履歴オブジェクトを取得した後、名前変更モジュール1332は、名前がn2であるアイテムがディレクトリd2の中に存在するかを判断する（2520）。存在する場合、名前変更モジュールは、アイテムn2に対する上書き保護が存在しているかを判断する（2523）。一実施例においては、ディレクトリに対する上書き保護が存在するが、ファイルに対しては存在しない。上書き保護が存在する場合、名前変更モジュールは、アイテムn2がディレクトリd2の中にすでに存在していることを報告する（2527）。上書き保護が存在しない場合、名前変更モジュール1332は、図23aおよび図23bに関連して図示および説明されている方法に従って、既存のアイテムn2をディレクトリd2から削除する（2530））。
【００９９】
既存のアイテムn2がディレクトリd2から削除された後、またはアイテムn2がディレクトリd2の中に存在しなかった場合、名前変更モジュール1332は、名前がn2である新しいアイテムをディレクトリd2に追加する（2540）。名前変更モジュール1332は、ディレクトリd2の中のアイテムn2に履歴オブジェクトh1を関連付ける。名前変更モジュール1332は、アイテムn2の内容の「前のフィールド」において、n1がn2の「名前変更元祖先」（後から定義されている）であることを示す。なお、名前変更プロセスは、d1＝d2である場合には同じであることに留意されたい。
【０１００】
図26aおよび図26bは、エリアaにおけるディレクトリdのフルパス名を生成する場合の、ディレクトリパス生成モジュール1334の動作を示している。ディレクトリパス生成モジュール1334は、エリアaにおけるディレクトリdを読み取り、ディレクトリdの親ディレクトリ（Pdと称する）を識別する。本発明の一実施例によると、親ディレクトリには、ディレクトリにおけるエントリ「..」が関連付けられている。この実施例においては、ディレクトリパス生成モジュール1334は、エントリ「..」に対応するディレクトリを識別する。
【０１０１】
モジュール1334は、エリアaにおけるディレクトリPdを読み取り、ディレクトリdのエントリを見つける。次いで、モジュール1334は、ディレクトリパスの中の名前としてディレクトリdを識別する。このアルゴリズムは、ルートディレクトリに達するまで繰り返される。具体的には、ディレクトリdに関する上述されている方法が、ディレクトリPdに対して、次いで、ディレクトリPdの親に対して、以下同様に、ルートディレクトリに達するまで、繰り返される。検索された名前は、ディレクトリパスの中の名前である。名前は、ディレクトリパス名における最後から先頭の方向に見つかる。
【０１０２】
図27は、エリア「a」におけるディレクトリ「d」の中の履歴オブジェクト「h」のベース名を生成する場合の、ベース名生成モジュール1335の動作を示している。ベース名生成モジュール1335は、ディレクトリdの中の、エリアaに対応する生成ページを読み取る（2710）。ベース名生成モジュール1335は、履歴オブジェクトhを有するエントリを識別する（2720）。エントリの中の、履歴オブジェクトhに対応するアイテムの名前が、求めるベース名である。例えば、エリアaにおけるディレクトリdの中にエントリ（n,h）が見つかった場合、「n」が履歴オブジェクトhのベース名である。
【０１０３】
図28a〜図28cは、履歴オブジェクトhと内容「f」とを有するアイテム「n」を、生成ID gを有するステージングエリアaにおけるディレクトリdにサブミットする場合の、サブミットモジュール1336の動作を示している。サブミット操作は、ワークエリアの内容をステージングエリアにサブミットする目的に使用される。ファイルの内容はその履歴オブジェクトによって定義されているため、実際にステージングエリアにサブミットされるのは、ファイルの履歴オブジェクトである。サブミットモジュール1336は、図26および図27に関連して図示および説明されている方法に従って、ディレクトリdのフルパス名と、エリアaにおける履歴オブジェクトhのベース名とを計算することによって、履歴オブジェクトhのフルパスを取得する（2805）。サブミットモジュール1336は、同じフルパス名を持つ対応するアイテムがステージングエリアに存在するかを判断する（2810）。これは、（ディレクトリ読み取りモジュール1326によって）ディレクトリdを繰り返し読み取って、ステージングエリアにおける別のオブジェクトが履歴オブジェクトhと同じフルパス名を持っているかを判断することによって行われる。
【０１０４】
対応するアイテムがステージングエリアに存在しない場合、サブミットモジュール1336は、ステップ2805において計算されたディレクトリパスがステージングエリアに存在しているかを確認する（2830）。存在していない場合、そのディレクトリパスが作成され（2835）、ファイルfはフローズンとマークされる（2840）。ステップ2830またはステップ2840の後、サブミットモジュール1336は、アイテム追加モジュール1318を呼び出して、内容fを有するアイテムnをステージングエリアaにおけるディレクトリdに追加する（2845）。サブミットモジュール1336は、履歴オブジェクトにエントリ（g,f）を追加する（2850）。
【０１０５】
次いで、サブミットモジュール1336は、アイテムfがディレクトリであるかを判断する（2855）。ディレクトリではない場合、サブミットプロセスが完了する。アイテムfがディレクトリである場合、サブミットモジュール1336は、子ディレクトリdiのそれぞれについて、ワークエリアにおけるdiに関連付けられている履歴オブジェクトにエントリ（g,di）を追加する。このステップによって、ディレクトリがステージングエリアにサブミットされるときには、その子ディレクトリもサブミットされる。
【０１０６】
ステップ2810に戻って、ステージングエリアの中に対応するアイテムが存在する場合、サブミットモジュール1336は、衝突チェックモジュール1338（後述されている）を呼び出して、対応する履歴オブジェクト（hsと称する）と履歴オブジェクトhとの間に衝突があるかを判断する（2815）。a）hとhsが同じである、または、b）hがhsから派生している、または、c）hsがhから派生している場合、履歴オブジェクトhとhsは衝突していない。hと、対応する履歴オブジェクトhsとの間に衝突がない場合、サブミットモジュール1336は、ステップ2830に進む。衝突がある場合、サブミットモジュール1336は、既存のファイルを上書きすることができる上書きモードが有効であるかを判断する（2820）。有効である場合、サブミットモジュール1336は、ステップ2830に進む。有効ではない場合、衝突のため、サブミットは失敗する。
【０１０７】
図29は、ブランチbにおけるエリアatargetにおける衝突について、ファイルfreferenceに対するファイルftargetをチェックする場合の、衝突チェックモジュール1338の動作を示している。衝突チェックモジュール1338は、ブランチbにおいてftargetがロックされているかを判断する（2910）。ブランチ上のワークエリアのうち、ファイルをステージングエリアにサブミットできるワークエリアが1つのみであるならば、そのブランチにおいてそのファイルはロックされている。ファイルをロックすることは、衝突を回避する1つの手段である。ブランチbにおいてftargetがロックされている場合、衝突チェックモジュール1338は、ftargetのロックがatarget以外のエリアによって保持されているかを判断する（2920）。保持されている場合、衝突が存在し、ftargetをエリアatargetにサブミットすることはできない。
【０１０８】
ブランチbにおいてftargetがロックされていない場合、または、ftargetのロックがatargetによって保持されている場合、衝突チェックモジュール1338は、ftargetとfreferenceとが同じ内容を指しているか（すなわち、ftargetとfreferenceとが同じであるか）を確認する（2930）。これらが同じ内容を指している場合、衝突チェックモジュール1338は、衝突がないものと判断する。2つのファイルの内容が同じではない場合、衝突チェックモジュール1338は、freferenceがftargetの祖先（すなわち、同名祖先、コピー元祖先、名前変更元祖先（後から定義されている））であるかを判断する（2940）。freferenceが祖先である場合、ftargetはfreferenceの望ましい修正であると考えられるため、衝突はない。祖先ではない場合、衝突がある。
【０１０９】
図30aおよび図30bは、エリアatargetにおけるディレクトリdtargetをエリアareferenceにおけるディレクトリdreferenceに対して比較する場合の、ディレクトリ比較モジュール1340の動作を示している。比較を行う目的で、ディレクトリ比較モジュール1340は、図22に関連して図示および説明されている方法に従って、エリアatargetにおけるディレクトリdtargetの内容を読み取る（3005）。ディレクトリ比較モジュールは、図22に関連して図示および説明されている方法に従って、エリアareferenceにおけるディレクトリdreferenceの内容も読み取る（3010）。
【０１１０】
ディレクトリ比較モジュール1340は、ディレクトリdtargetの中の最初のアイテムを識別し（3015）、ディレクトリdtargetの中の最初のアイテムと同じ名前のアイテムが、ディレクトリdreferenceの中に存在しているかを判断する（3020）。存在しない場合、ディレクトリ比較モジュール1340は、dtargetの中の識別されたアイテムに合致するアイテムがdreferenceの中に存在しないことを報告し（3045）、ステップ3050に進む。存在する場合、ディレクトリ比較モジュール1340は、同じ名前の2つのアイテムが同じ内容を有するかを判断する（3025）。そのような比較は、各アイテムの履歴オブジェクトを確認することによって行われ、エリアareferenceにおけるdreferenceの履歴オブジェクトが、エリアatargetにおけるdtargetの履歴オブジェクトと同じ内容を指している場合、これらのディレクトリの内容は同じである。内容が同じである場合、ディレクトリ比較モジュール1340は、アイテムが同じ名前および内容を有することを報告し（3030）、ディレクトリ比較モジュール1340は、ステップ3050に進む。内容が同じではない場合、ディレクトリ比較モジュール1340は、名前は同じであるが内容が同じではないことを報告し（3035）、ディレクトリ比較モジュール1340は、ステップ3050に進む。
【０１１１】
ステップ3050において、ディレクトリ比較モジュール1340は、dtargetの中に別のアイテムが存在するかを確認する（3050）。dtargetの中に別のアイテムが存在する場合、ディレクトリ比較モジュール1340は、次のアイテムを識別し（3053）、ステップ3020に戻る。dtargetの中に別のアイテムが存在しない場合、ディレクトリ比較モジュール1340は、dreferenceの中の最初のアイテムを識別する（3055）。ディレクトリ比較モジュール1340は、識別されたアイテムが、dtargetの中のアイテムと名前が同じであるかを判断する（3060）。名前が同じではない場合、ディレクトリ比較モジュール1340は、dreferenceの中の識別されたアイテムが、dtargetの中のいずれのアイテムとも合致しないことを報告し（3065）、ステップ3067に進む。識別されたアイテムが、dtargetの中のアイテムと名前が同じである場合、その識別されたアイテムは、ステップ3020においてすでに見つかっており、従って、ディレクトリ比較モジュール1340は、ステップ3067に進む。
【０１１２】
ステップ3067において、ディレクトリ比較モジュール1340は、ディレクトリdreferenceの中に別のアイテムが存在するかを判断する。ディレクトリdreferenceの中に別のアイテムが存在しない場合、dtargetをdreferenceに比較するステップは完了する。存在する場合、ディレクトリ比較モジュール1340は、dreferenceの中の次のアイテムを取得し（3070）、ステップ3060に戻る。
【０１１３】
ファイル比較モジュール1341は、（ディレクトリを比較するディレクトリ比較モジュール1340とは対照的に）ファイルを比較する。ファイルは、ステージングエリアにサブミットされるときに比較される。さらに、Webサイト開発者は、自身のワークエリアにおけるファイルを比較したいことがある。
【０１１４】
ファイルの比較は、ファイルの祖先を確認するステップを含んでいる。ファイルは、同名祖先、コピー元祖先、名前変更元祖先という3種類の祖先を持つことができる。同名祖先は、ファイル（fと称する）の前のバージョンであり、ファイルfと同じ名前（すなわち「f」）を持ち、この場合、同名祖先は以前にファイルfと同じエリアにサブミットされている。ファイルの「前のフィールド」（例：図12におけるフィールド1240）は、ファイルの同名祖先を指している。
【０１１５】
ファイル（fと称する）のコピー元祖先は、内容がファイルfにコピーされたファイルである。ファイルに対するコピー操作または立ち戻り（revert）操作によって、コピー元祖先を有するファイルがワークエリア内に生成されることがある。これは、この操作によって既存のファイルが上書きされる場合に起こる。例えば、ファイルe2が、ステージングエリアにおけるファイルであるとする。ファイルuが、ファイルe2とは衝突する、ワークエリアにおけるファイルであるとする。ファイルuの内容をファイルe2の内容のコピーに置き換えることによって、ファイルuが更新される場合、古いファイルuは、更新されたファイルuの同名祖先であり、ファイルe2は、更新されたファイルuのコピー元祖先である。ファイルe2は、別のエリアまたは別のブランチからのファイルとすることができる。また、ファイルe2は、ファイルuのバージョン履歴におけるファイル、または、別のブランチ上の別のファイルのバージョン履歴におけるファイルとすることもできる。ファイルがコピー元祖先を持つ場合、そのファイルの「前のフィールド」（例：図12におけるフィールド1240）は、そのコピー元祖先と同名祖先とを指している。
【０１１６】
ファイル（fと称する）の名前変更元祖先は、ファイルfの名前が変更された元のファイルである。ファイルが名前変更元祖先を持つ場合、そのファイルの「前のフィールド」は、名前変更元祖先と同名祖先とを指している。
【０１１７】
図31aおよび図31bは、ディレクトリdtargetの中のファイルFtargetを、ディレクトリdreferenceの中のファイルFreferenceと比較する場合の、ファイル比較モジュール1341の動作を示している。ファイル比較モジュール1341は、ディレクトリdtargetの中のFtargetの内容を含んでいるファイル（ftと称する）を調べる（3110）。なお、Ftargetとftとの違いは、Ftargetがディレクトリの中のファイルの名前であるのに対して、ftは、ディレクトリdtargetの中のFtargetの実際の内容である。Ftargetとftとの違いは、図12に示されているディレクトリの中の「m」という名前のファイルと、生成G0におけるファイル「m」の内容「A」との違いに似ている。
【０１１８】
ファイル比較モジュール1341は、ディレクトリdreferenceの中のFreferenceの内容を含んでいるファイル（frと称する）を調べる（3120）。次いで、比較モジュールは、frとftとが同じであるかを判断する（3130）。同じである場合、ファイル比較モジュール1341は、FreferenceとFtargetとが同じであることを報告する（3140）。
【０１１９】
frとftとが同じではない場合、ファイル比較モジュール1341は、FreferenceがFtargetの祖先であるかを判断する（3145）。各ファイルの内容には、そのファイルの同名祖先（例：前の内容）へのポインタが（「前のフィールド」に）含まれており、ファイルがコピー元祖先または名前変更元祖先を持つ場合、そのような祖先。比較モジュールは、ftとその祖先の「前のフィールド」を逆にたどりながら、frを検索する。「前のフィールド」の1つにfrが存在している場合、FreferenceはFtargetの祖先であり、ファイル比較モジュール1341は、FtargetがFreferenceの修正であることを報告する（3150）。
【０１２０】
FreferenceがFtargetの祖先ではない場合、ファイル比較モジュール1341は、FtargetがFreferenceの祖先であるかを判断する（3155）。具体的には、比較モジュールは、frとその祖先の「前のフィールド」を逆にたどりながら、ftを検索する。「前のフィールド」の1つにftが存在している場合、ファイル比較モジュール1341は、FreferenceがFtargetの修正であることを報告する（3160）。存在していない場合、ファイル比較モジュール1341は、FtargetとFreferenceの両方の祖先であるファイルが存在するかを判断する（3165）。共通のファイルが存在する場合、ファイル比較モジュール1341は、FreferenceとFtargetとが共通の祖先を持つことを報告し（3170）、共通のファイルが存在しない場合、FtargetがFreferenceとは関係していないことを報告する（3175）。
【０１２１】
エリア削除モジュール1342は、ユーザーまたはシステム管理者によってもはや必要とされないエリアを削除する。図32は、エリア「a」を削除する場合のエリア削除モジュール1342の動作を示している。エリア削除モジュール1342は、エリアaのディレクトリツリーを取得し（3210）、子を持たないノード（すなわちディレクトリ）（便宜上「cノード」と称される）を見つける（3230）。エリア削除モジュール1342は、アイテム削除モジュール1328を呼び出して、cノードをその1つ以上の親ディレクトリから削除する（3240）。また、エリア削除モジュール1342は、直接参照削除モジュール1324を呼び出し、cノードの参照リストから親ディレクトリへの参照を削除する（3250）。次いで、エリア削除モジュール1342は、参照カウントモジュール1320を呼び出して、参照カウントが0であるかを判断し（3260）、0である場合、cノードに関連付けられている物理オブジェクトをストレージから削除する（3270）。0でない場合、cノードに関連付けられている物理オブジェクトはストレージから削除されず、なぜなら、cノードはエリアaからは削除されたが、別のエリアには依然として存在しているためである。参照カウントを調べた後、エリア削除モジュール1342は、エリアに残っているノードがあるかを判断する（3280）。ノードがある場合、モジュール1342は、ステップ3230に戻る。ノードがない場合、エリア削除プロセスは完了する。
【０１２２】
図33a、図33b、および図34は、ロックモジュール1346の動作を示している。図33aおよび図33bは、ブランチb上のエリアaにおけるディレクトリdの中のアイテムfに対するロックを作成する場合の、ロックモジュール1346の動作を示している。そのようなロックを作成する目的で、ロックモジュール1346は、エリアaにおけるディレクトリdの中のアイテムfのフルパス名を調べ（3310）、次いで、別のロックが同じフルパス名を持っているかを確認する（3320）。持っている場合、ロックモジュール1346は、ロックの衝突に起因してロック作成操作が失敗したことを報告する（3250）。別のロックが同じフルパス名を持っていない場合、ロックモジュール1346は、ステップ3310において識別されたフルパス名を含んでいるロックを作成し（3330）、そのロックを、ロックのオーナーがエリアaであるとしてマークする（3340）。
【０１２３】
図34は、エリアaにおけるディレクトリdの中のアイテムがロックされているかを判断する場合の、ロックモジュール1346の動作を示している。ロックモジュール1346は、エリアaにおけるディレクトリdの中のアイテムfのフルパス名を確認し（3410）、次いで、ブランチbに同じフルパス名のロックが存在しているかを判断する（3420）。存在していない場合、ロックモジュールは、アイテムfがロックされていないことを報告する（3430）。存在している場合、ロックモジュールは、アイテムfがロックされていることを報告する（3440）。
【０１２４】
ここまでは、Webサイト開発ソフトウェアについて説明した。以下では、一実施例によるHTTPプロトコル仮想化モジュール137（「仮想化モジュール137」）について説明する。
【０１２５】
各エリアは、HTTPプロトコルレベルにおいて完全なWebサイトであるように見える。エリアごとの個別のWebサーバーを保持することなしにこれを達成する目的で、仮想化モジュール137は、1つのWebサーバーが複数のWebサーバーであるかのように機能することを可能にする。これによって、開発および維持コストが減少する一方で、各エリアを、HTTPプロトコルレベルにおいて完全なWebサイトとすることができる。
【０１２６】
図35は、開発ワークステーション110の1つにおけるWebブラウザ、仮想化モジュール137、およびWebサーバー145の間の通信経路を示している。開発ワークステーション110におけるWebブラウザは、（後述されているリンクのタイプに応じて）WebサイトコンテンツのHTTP要求のすべてまたは一部を、仮想化モジュール137にルーティングするようにされている。必要な場合、仮想化モジュール137は、要求のディレクトリパスが、要求が発行されたエリア（このエリアは「ビューイングエリア」と称される）または別の望ましい場所（後述されている）に対応するように、要求のディレクトリパスを変更する。言い換えれば、仮想化モジュール137に送られたHTTP要求は、必要な場合、ビューイングエリアまたは別の望ましい場所に対応するファイルシステムにリダイレクトされる。
【０１２７】
HTTP要求を処理した後、仮想化モジュール137は、HTTP要求をWebサーバー145に転送し、Webサーバー145は、要求されたドキュメントを、要求によって指定される場所から取得する。次いで、Webサーバー145は、要求されたドキュメント（または見つからない場合はエラー信号）を仮想化モジュール137に送り返し、仮想化モジュール137は、要求されたドキュメント（またはエラー信号）をWebブラウザに転送する。
【０１２８】
仮想化モジュール137は、HTTP要求を変更するかについてと変更方法とを、マッピング規則を使用して判断する。マッピング規則は、1つの表現を別の表現にマッピングする。マッピング規則は、等号によって分けられる両側に分解される。マッピング規則の左側は、正規表現であり、正規表現は、合致させる変数パターンの一部を定義する。マッピング規則の正規表現は、数学およびコンピュータ科学の分野における正規表現の適切に定義されている規則に従い、一実施例においては、マッピング規則において使用される正規表現は、UNIX（登録商標）オペレーティングシステムにおいて正規表現が適用される場合と同じように適用される（例：regex(5)拡張正規表現）。
【０１２９】
マッピング規則の右側は、置換表現（すなわち、左側の正規表現に置き換わる表現）である。置換表現においては、シンボル$N（Nは「1」、「2」、..、「9」）は、正規表現のカッコ演算子()によって表される左側のパターンの最初の10個の部分を表す（例：$1は左側の最初のパターンを表し、$2は左側の二番目のパターンを表し、以下同様）。
【０１３０】
HTTP要求は、以下の順序における3つの部分に分けることができる。
【０１３１】
エリア接頭辞/ドキュメントルート接頭辞/要求されるファイルの名前
モジュール137は、要求のドキュメントルート接頭辞とエリア接頭辞とを変更することによって、HTTP要求をリダイレクトする。ドキュメントルート接頭辞は、「ドキュメントルート」のパス名であり、ドキュメントルートは、Webサーバーのソースディレクトリである。ドキュメントルートは、ファイルシステムの中のディレクトリのうち、（特に指定されない限り）要求されたドキュメントをWebサーバーが検索するディレクトリである。ドキュメントルートは、Webサーバーのルートディレクトリの概念としての「.」と考えることができる。
【０１３２】
エリアのトップレベルのディレクトリは、必ずしもドキュメントルートでなくてもよい。開発者は、エリアのトップレベルのディレクトリがWebサーバーのドキュメントルートに対応しないようにエリアを設定することができる。Webサーバーの実際のドキュメントルートは、エリアのトップレベルのディレクトリの下の任意のディレクトリとすることができる。
【０１３３】
エリアのドキュメントルートは、特殊なマッピング規則によって指定される。一実施例においては、各ブランチは、一連のマッピング規則を有し、本実施例においては、ブランチ上の各エリアは、特殊な「_docroot」マッピング規則によって指定される同一のドキュメントルートを有する。
【０１３４】
以下は、あるブランチのドキュメントルートのマッピング規則の例である。
_docroot=/directoryA/directoryB
【０１３５】
元のURL要求がGET/documents/idex.htmlである場合、ドキュメントルート接頭辞は、元の要求の最初の「/」の直前に付加される。言い換えれば、接頭辞「/directoryA/directoryB」が、「/documents/index.html」の前に付加される。
【０１３６】
ドキュメントルート接頭辞の代わりに、別の接頭辞を使用することが望ましい状況がある。そのような状況として、開発者がドキュメントルートディレクトリの外側にコンテンツディレクトリを設定する、または、コンテンツディレクトリの名前の別名を作成する、または、そのエリアレベルでの任意の変形を適用する場合が挙げられる。これらの特殊な状況用のマッピング規則が存在し、要求がこれらの特殊なマッピング規則の1つに合致する場合、マッピング規則の置換表現（右側）は、ドキュメントルート接頭辞の代わりに要求に付加される接頭辞である。例えば、あるブランチのマッピング規則が以下であるとする。
/Special(.*)=/Foo$1
【０１３７】
元の要求がGET/special/index.htmlである場合、接頭辞「/Foo」が「/index.html」に付加される。
【０１３８】
エリア接頭辞は、ドキュメントルート接頭辞の前、または、ドキュメントルート接頭辞に置き換わる特殊接頭辞の前（該当時）に付加される。エリア接頭辞は、元の要求と共に送信される「クッキー」を解読することによって導かれる。クッキーは、Webブラウザによって格納されており仮想化モジュール137に渡される少量の永続データである。クッキーは、さまざまなタイプの情報（例：ユーザーのID、ユーザーのセッションのID（「セッションID」）、ポート番号など）を含むことができ、そのようなタイプの1つとして、ビューイングエリアのパスの指定を含めることができる。一実施例においては、クッキーは、実際のエリア接頭辞を含んでいる。別の実施例においては、仮想化モジュールが、クッキーから別のタイプの情報（セッションIDあるいはポート番号など）を取り出し、取り出されたタイプの情報をエリア接頭辞にマッピングする外部のルックアップテーブルを調べて、エリア接頭辞を取得する。
【０１３９】
ドキュメントルート接頭辞のさらなる例として、元の要求と共に送信されたクッキーから導かれるエリア接頭辞が、「/iw-mount/default/main/workarea/joe」である場合、変形後の要求は次のようになる。
GET/iw-mount/default/main/workarea/joe/directoryA/directoryB/documents/index.html.
【０１４０】
WebブラウザがすべてのHTTP要求を仮想化モジュール137にルーティングするか、一部のみのHTTP要求をルーティングするかは、システムにおけるHTMLドキュメントに含まれているリンクのタイプに依存する。HTMLドキュメントに含めることのできるリンクには少なくとも3つのタイプがあり、それらは、相対リンク、絶対リンク、完全修飾リンクである。完全修飾リンクは、明示的なプロトコルの指定と明示的なホスト名の後ろにドキュメントのフルパス名を含んでいるリンクである。絶対リンクは、プロトコルの指定とホスト名のいずれも含んでいないが、ドキュメントのフルパス名を含んでいるリンクである。絶対リンクは、通常、最初のスラッシュ文字(initial slash character)（「/」）で始まる。相対リンクは、絶対リンクに似ているが、パスが現在のドキュメントのリンクに相対的であることを示す先頭のスラッシュ文字(leading slash character)（「/」）を特徴とする。言い換えれば、相対リンクは、要求されるドキュメントの実際の名前以外は、現在のドキュメントと同じフルパス名を有する。
【０１４１】
仮想化モジュール137は、3種類のリンクすべてを処理することができる。システム100に格納されているHTMLコンテンツが、完全修飾リンクの仮想化を必要とする場合、Webブラウザは、すべての要求を仮想化モジュール137に送るように構成されている。多くの一般的なWebブラウザでは、コンフィギュレーションの設定によってこの機能がサポートされている。一実施例によると、Webサイトが完全修飾リンクの管理を必要としない場合、Webブラウザは、絶対HTMLリンクと相対HTMLリンクのみを仮想化モジュール137に渡す。Webサーバーは、通常では、絶対リンクおよび相対リンクを自動的に仮想化モジュール137に送るための特殊な構成を必要としない。
【０１４２】
図36aおよび図36bは、絶対要求および相対要求を処理する場合の仮想化モジュール137の動作を示している。仮想化モジュール137は、開発ワークステーション110の1つにおけるWebブラウザからHTTP要求を受信し（3610）、要求からURL (Uniform Resource Locator)アドレスを取り出す（3620）。また、仮想化モジュール137は、URLアドレスと共に送られたクッキーを取り出す（3630）。次いで、仮想化モジュール137は、要求が絶対要求か相対要求かを判断する（3640）。1つの要求の実施例においては、相対HTML要求では、仮想化モジュール137によって処理される前にエリア接頭辞がすでに付加されているが（これはWebブラウザによって自動的に行われる）、絶対要求では、仮想化モジュール137によって処理される前にエリア接頭辞が付加されていないことによって、これらの要求が区別される。要求が相対要求である場合、その要求は、宛先として正しいファイルシステムおよびディレクトリ（すなわち、ビューイングドキュメントがアクセスされた元のファイルシステムおよびディレクトリ）がすでに指定されており、仮想化モジュール137は、その要求をWebサーバーに渡す（3690）。
【０１４３】
要求が絶対要求である場合、仮想化モジュール137は、ビューイングエリアが属しているブランチに対応するマッピング規則を検索し（3650）、適切な接頭辞（ドキュメントルート接頭辞、またはマッピング規則に基づく特殊な接頭辞（上述されている）のいずれか）を選択する（3660）。仮想化モジュール137は、適切なマッピング規則に従って、選択された接頭辞を元の要求、またはその一部に付加する（3670）。
【０１４４】
仮想化モジュール137は、（上述されているように）クッキーからエリア接頭辞を取り出すかまたは導き（3680）、ステップ3670において付加された接頭辞の前にそれを付加する。要求または要求の一部のパスは、この時点で完全であり、従って、モジュール137は、修正された要求をWebサーバー145にルーティングする（3690）。
【０１４５】
図37は、完全修飾リンクを処理する場合の仮想化モジュール137の方法を示している。仮想化モジュール137は、開発ワークステーション110の1つにおけるWebブラウザの1つからHTTP要求を受信し（3710）、要求からURLとクッキーとを取り出す（3720）。
【０１４６】
次いで、仮想化モジュール137は、完全修飾要求に対するマッピング規則を検索し（3730）、要求がマッピング規則の正規表現に合致するかを判断する。合致しない場合、要求はそのままWebサーバーに転送される（3780）。合致する場合、仮想化モジュール137は、マッピング規則から得られる接頭辞を、マッピング規則に従って要求または要求の一部に付加する（3756）。
【０１４７】
仮想化モジュール137は、（上述されているように）クッキーからエリア接頭辞を取り出すかまたは導き（3760）、ステップ3750において付加された接頭辞の前にそれを付加する。要求のパスは、この時点で完全であり、仮想化モジュール137は、修正された要求をWebサーバー145にルーティングする（3780）。
【０１４８】
仮想化モジュール137では、外部のWebサーバーからの内容を動的に継ぎ合わせることができる。場合によっては、Webサイトには、システム100によって管理されないコンテンツが含まれることがある。その場合、仮想化モジュール137では、デフォルトで検索される場所（例：ビューイングエリア）にドキュメントが属していない場合、ドキュメントの要求を外部のWebサーバーに動的にリダイレクトすることができる。ドキュメントの要求が、HTTPエラーコード「404：ファイルが見つかりません（File not found）」と共に戻される場合、仮想化モジュール137は、マッピング規則を検索し、合致する規則が見つかった場合、その規則に従って要求を変更する。次いで、変更された要求が、指定された外部の宛先Webサーバーに送信される。
【０１４９】
仮想化モジュール137では、異なるブランチからの内容を動的に継ぎ合わせることもできる。場合によっては、Webサイトのコンテンツが、異なる開発ブランチに分けられていることがある。その場合、仮想化モジュール137は、エラーコード「404：ファイルが見つかりません（File not found）」を受信すると、既存のドキュメントルート接頭辞を、別のブランチのドキュメントルート接頭辞に置き換える。次いで、変更された要求が、Webサーバー145に送信される。
【０１５０】
図38は、サイトベースまたはブランチベースの動的な継ぎ合わせを実行する場合の仮想化モジュールの動作を示している。仮想化モジュール137は、Webサーバー145からHTTP要求の結果を受信する。仮想化モジュールは、その結果から、要求されたドキュメントが見つかったかを判断する。見つかった場合、仮想化モジュールは、要求されたドキュメントを、その要求を仮想化モジュール137に送信したWebブラウザに転送する（3825）。ドキュメントが見つからない場合、仮想化モジュール137は、マッピング規則を検索して（3830）、Webサーバーに送信されたHTTP要求またはその一部が、いずれかの規則の左側に合致するかを判断する（3840）。合致する場合、要求は、そのマッピング規則に従って変更され（3850）、適切なWebサーバーに転送される（3860）。
【０１５１】
図39aおよび図39bは、本発明の一実施例による、親ディレクトリ排除プロセスの別の動作を示している。
【０１５２】
上述されているファイル管理システムにおいては、ファイルは複数のファイルシステム（すなわち「エリア」）に仮想的にコピーされるように見えるが、ファイルの1つのみのコピーは物理的に格納されている。そのようなシステムにおいては、特定のエリアにおける各バージョンの親ディレクトリを見つけることと、ストレージを再利用する目的で、ファイルのバージョンがいずれかのエリアによって依然として参照されているかを判断することとが可能であるだけの十分な情報が、ファイルの各バージョンと共に格納されていなければならない。
【０１５３】
このことを達成する1つの方法は、ファイルの各バージョンと共に、そのバージョンが存在している各エリアの親ディレクトリへのポインタを格納することである。特定のファイルバージョンのこれらの「バックポインタ」すべてのセットは、そのバージョンの親マップである。図39aは、ファイルの各バージョンをマッピングする親ディレクトリシステムを示している。例えば、File 1v1.1の各バージョンは、このバージョンが存在している各エリアの親ディレクトリ（ディレクトリv1.1、ディレクトリv1.2など）を指す情報を有する。File 1v1.2の各バージョンは、このバージョンが存在している各エリアの親ディレクトリ（ディレクトリv1.3、ディレクトリv1.4、ディレクトリv1.5など）を指す情報を有する。
【０１５４】
同様に、File 2v1.1の各バージョンは、このバージョンが存在している各エリアの親ディレクトリ（ディレクトリv1.1、ディレクトリv1.2、ディレクトリv1.3、ディレクトリv1.4など）を指す情報を有する。File 3v1.1の各バージョンは、このバージョンがディレクトリv1.2およびディレクトリv1.3の中であるすべてのエリアを逆に指す情報を有する。File 3v1.2の各バージョンは、このバージョンがディレクトリv1.4およびディレクトリv1.5の中であるすべてのエリアを逆に指す情報を有する。
【０１５５】
しかしながら、この手法では、スケーラビリティの問題が生じ、すなわち、バックポインタの数が、ファイルバージョンが存在しているエリアの数に比例する。また、パフォーマンスの問題も生じ、すなわち、ディレクトリの新しいバージョンを作成するには、そのディレクトリの中のすべてのファイルの親マップを更新する必要がある。
【０１５６】
以下では、各ファイルバージョンと共に、そのバージョンが存在しているすべてのエリアの親ディレクトリへのバックポインタを格納する必要がない、代替方法について説明されている。この代替手法においては、ディレクトリは、後継ポインタと先行ポインタとを介してまとめて連鎖され、各ファイルバージョンには、1つの親ディレクトリへのバックポインタが格納される。
【０１５７】
図39bは、本発明の一実施例による、ディレクトリ排除プロセスを示している。この実施例においては、ディレクトリv1.1、ディレクトリv1.2、ディレクトリv1.3などのディレクトリは、後継ポインタ（s2など）および先行ポインタ（s3など）を介してまとめて連鎖されている。
【０１５８】
例えば、File 1v1.1は、ディレクトリv1.1とディレクトリv1.2へのバックポインタを有する。File 1v1.2は、ディレクトリv1.3、v1.4、およびv1.5へのバックポインタを有する。ファイルバージョンFile 1v1.1またはFile1v1.2のそれぞれには、1つの親ディレクトリを指しているバックポインタ（p2、p3など）が格納されている。このようにして、各ファイルバージョンと共に、そのバージョンが存在しているすべてのエリアの親ディレクトリへのバックポインタが格納されている。
【０１５９】
同様に、File 3v1.1は、ディレクトリv1.2とディレクトリv1.3とを直接指しており、なぜなら、各バージョンが存在しているすべてのエリアがバックポインタP1、P2、P3、P4、およびP5によってリンクされているためである。各ファイルバージョンには、P1、P2、P3、P4、P5などのポインタが格納される。ディレクトリは、S1、S2、およびS3を介してまとめて連鎖されている。このようにして、バックポインタP1、P2、P3、およびP4は、そのバージョンが存在しているすべてのエリアの親ディレクトリを指している。
【０１６０】
ファイル管理システムの中でメタデータを変更するためには、サーバーのスレッドは、補助ストレージに格納されているメタデータを表すメモリ内オブジェクトキャッシュへの書き込みアクセスを取得する必要がある。このアクセスを取得するためには、スレッドは、特殊な種類のセマフォを取得する必要がある。マイクロオペレーションは、スレッドがストレージ変更セマフォを取得した瞬間からそのセマフォを解放するまでにスレッドによって行われるすべてのオブジェクト変更として定義される。
【０１６１】
ストレージ変更セマフォは、変更されたオブジェクトの数を追跡する。特定のしきい値を超える、またはタイムアウトが発生すると、セマフォは、新たなマイクロオペレーションの発生を許可しないことによって、自身の状態を変更する。次いで、セマフォオブジェクトは、現在実行中のマイクロオペレーションすべてが完了するまで待機する。
【０１６２】
この時点において、オブジェクトキャッシュは一貫性のある状態であり、スナップショット手順が呼び出される。スナップショット手順は、変更されたオブジェクトのすべてをオンディスクデータ構造体にシリアル化し、結果を1つのトランザクションとしてメモリバッファに格納する。スナップショット段階が完了すると、別のサーバースレッドが、新しい一連のマイクロオペレーション用にセマフォを取得することができる。
【０１６３】
バックグラウンドにおいては、ジャーナリングおよびWAL（ログ先行書き込み）を採用している特殊なスレッドによって、トランザクションがメモリバッファから補助ストレージにコミットされる。
【０１６４】
スナップショット手順では、バックグラウンドのコミット手順によって実行される必要なI／Oすべてと、高速かつ予測可能なメモリ内のみ処理（in-memory-only processing）が実行されるため、サーバーのスレッドがストレージ変更セマフォをブロックしている時間長に関する非常に高い制御性が得られる。
【０１６５】
この技術分野に精通している者には理解されるように、本発明は、本発明の精神または本質的な特徴から逸脱することなく、別の特定の形態に具体化することができる。Webサイト開発は、本明細書に開示されている本発明の数多くの実用的な用途の1つに過ぎない。本明細書に開示されている本発明の別の用途としては、ソースコード、メディアファイル（例：CD−ROMマルチメディア用）、メディアエンジン、その他の開発が挙げられる。従って、本発明の開示は、添付の請求項に記載されている本発明の範囲を（制限することなく）説明することを目的としている。
【図面の簡単な説明】
【０１６６】
【図１】本発明の一実施例による、Webサイト開発用のコンピュータネットワークを示す。
【図２】本発明の一実施例による、Webサイトコンテンツを開発する場合の（開発者の観点からの）開発の流れを示す。
【図３】本発明の一実施例による、ブランチの例を示す。
【図４】本発明の一実施例による、メインブランチの最初の内容の例を示す。
【図５】本発明の一実施例による、メインブランチの例を示す。
【図６】本発明の一実施例による、メインブランチの別の例を示す。
【図７】本発明の一実施例による、メインブランチとサブブランチの例を示す。
【図８】本発明の一実施例による、エリアのディレクトリツリーの例を示す。
【図９】本発明の一実施例による、ワークエリアオブジェクトを図で表している。
【図１０】本発明の一実施例による、生成IDを導く方法を示す。
【図１１】本発明の一実施例による、系統ツリーの例を示す。
【図１２】本発明の一実施例によるディレクトリを図で表している。
【図１３】本発明の一実施例によるWebサイト開発モジュールを示す。
【図１４】本発明の一実施例による、ワークエリア作成モジュールの動作を示す。
【図１５】本発明の一実施例による、ステージングエリア作成モジュールの動作を示す。
【図１６ａ】本発明の一実施例による、エディション作成モジュールの動作を示す。
【図１６ｂ】本発明の一実施例による、エディション作成モジュールの動作を示す。
【図１７ａ】本発明の一実施例による、ブランチ作成モジュールの動作を示す。
【図１７ｂ】本発明の一実施例による、ブランチ作成モジュールの動作を示す。
【図１７ｃ】本発明の一実施例による、ブランチ作成モジュールの動作を示す。
【図１８ａ】本発明の一実施例による、アイテム追加モジュールの動作を示す。
【図１８ｂ】本発明の一実施例による、アイテム追加モジュールの動作を示す。
【図１８ｃ】本発明の一実施例による、アイテム追加モジュールの動作を示す。
【図１８ｄ】本発明の一実施例による、アイテム追加モジュールの動作を示す。
【図１９】本発明の一実施例による、直接参照追加モジュールの動作を示す。
【図２０】本発明の一実施例による、直接参照削除モジュールの動作を示す。
【図２１ａ】本発明の一実施例による、参照カウントモジュールの動作を示す。
【図２１ｂ】本発明の一実施例による、参照カウントモジュールの動作を示す。
【図２２】本発明の一実施例による、ディレクトリ読み取りモジュールの動作を示す。
【図２３ａ】本発明の一実施例による、アイテム削除モジュールの動作を示す。
【図２３ｂ】本発明の一実施例による、アイテム削除モジュールの動作を示す。
【図２４ａ】本発明の一実施例による、ファイル編集モジュールの動作を示す。
【図２４ｂ】本発明の一実施例による、ファイル編集モジュールの動作を示す。
【図２５】本発明の一実施例による、名前変更モジュールの動作を示す。
【図２６ａ】本発明の一実施例による、ディレクトリパス生成モジュールの動作を示す。
【図２６ｂ】本発明の一実施例による、ディレクトリパス生成モジュールの動作を示す。
【図２７】本発明の一実施例による、ベース名生成モジュールの動作を示す。
【図２８ａ】本発明の一実施例による、サブミットモジュールの動作を示す。
【図２８ｂ】本発明の一実施例による、サブミットモジュールの動作を示す。
【図２８ｃ】本発明の一実施例による、サブミットモジュールの動作を示す。
【図２９】本発明の一実施例による、衝突チェックモジュールの動作を示す。
【図３０ａ】本発明の一実施例による、ディレクトリ比較モジュールの動作を示す。
【図３０ｂ】本発明の一実施例による、ディレクトリ比較モジュールの動作を示す。
【図３１ａ】本発明の一実施例による、ファイル比較モジュールの動作を示す。
【図３１ｂ】本発明の一実施例による、ファイル比較モジュールの動作を示す。
【図３２】本発明の一実施例による、エリア削除モジュールの動作を示す。
【図３３ａ】本発明の一実施例による、ロックモジュールの動作を示す。
【図３３ｂ】本発明の一実施例による、ロックモジュールの動作を示す。
【図３４】本発明の一実施例による、ロックモジュールの別の動作を示す。
【図３５】本発明の一実施例による、Webブラウザ、HTTPプロトコル仮想化モジュール、およびWebサーバーの間の通信経路を示す。
【図３６ａ】本発明の一実施例による、HTTPプロトコル仮想化モジュールの動作を示す。
【図３６ｂ】本発明の一実施例による、HTTPプロトコル仮想化モジュールの動作を示す。
【図３７】本発明の一実施例による、HTTPプロトコル仮想化モジュールの別の動作を示す。
【図３８】本発明の一実施例による、HTTPプロトコル仮想化モジュールのさらに別の動作を示す。
【図３９ａ】本発明の一実施例による、親ディレクトリ排除プロセスの別の動作を示す。
【図３９ｂ】本発明の一実施例による、親ディレクトリ排除プロセスの別の動作を示す。
【符号の説明】
【０１６７】
110  開発ワークステーション
120  ネットワーク
130  開発サーバー
135  Webサイト開発ソフトウェアモジュール
137  HTTPプロトコル仮想化モジュール
140  プロセッサ
145  Webサーバー
150  メモリ
160  補助ストレージ
165  ネットワーク
170  Webサイトプロダクションサーバー
175  インターネットまたはイントラネット
310, 410, 600, 740  ワークエリア
320, 420, 610, 750  ステージングエリア
330, 430, 440, 620, 710, 760  エディション
400  メインブランチ
720  親ブランチ
725  最初のエディション
730  サブブランチ
【図１】
2007526543.tif 000002
【図２】
2007526543.tif 000003
【図３】
2007526543.tif 000004
【図４】
2007526543.tif 000005
【図５】
2007526543.tif 000006
【図６】
2007526543.tif 000007
【図７】
2007526543.tif 000008
【図８】
2007526543.tif 000009
【図９】
2007526543.tif 000010
【図１０】
2007526543.tif 000011
【図１１】
2007526543.tif 000012
【図１２】
2007526543.tif 000013
【図１３】
2007526543.tif 000014
【図１４】
2007526543.tif 000015
【図１５】
2007526543.tif 000016
【図１６ａ】
2007526543.tif 000017
【図１６ｂ】
2007526543.tif 000018
【図１７ａ】
2007526543.tif 000019
【図１７ｂ】
2007526543.tif 000020
【図１７ｃ】
2007526543.tif 000021
【図１８ａ】
2007526543.tif 000022
【図１８ｂ】
2007526543.tif 000023
【図１８ｃ】
2007526543.tif 000024
【図１８ｄ】
2007526543.tif 000025
【図１９】
2007526543.tif 000026
【図２０】
2007526543.tif 000027
【図２１ａ】
2007526543.tif 000028
【図２１ｂ】
2007526543.tif 000029
【図２２】
2007526543.tif 000030
【図２３ａ】
2007526543.tif 000031
【図２３ｂ】
2007526543.tif 000032
【図２４ａ】
2007526543.tif 000033
【図２４ｂ】
2007526543.tif 000034
【図２５】
2007526543.tif 000035
【図２６ａ】
2007526543.tif 000036
【図２６ｂ】
2007526543.tif 000037
【図２７】
2007526543.tif 000038
【図２８ａ】
2007526543.tif 000039
【図２８ｂ】
2007526543.tif 000040
【図２８ｃ】
2007526543.tif 000041
【図２９】
2007526543.tif 000042
【図３０ａ】
2007526543.tif 000043
【図３０ｂ】
2007526543.tif 000044
【図３１ａ】
2007526543.tif 000045
【図３１ｂ】
2007526543.tif 000046
【図３２】
2007526543.tif 000047
【図３３ａ】
2007526543.tif 000048
【図３３ｂ】
2007526543.tif 000049
【図３４】
2007526543.tif 000050
【図３５】
2007526543.tif 000051
【図３６ａ】
2007526543.tif 000052
【図３６ｂ】
2007526543.tif 000053
【図３７】
2007526543.tif 000054
【図３８】
2007526543.tif 000055
【図３９ａ】
2007526543.tif 000056
【図３９ｂ】
2007526543.tif 000057