ファイルの名前を変更したり、移動したり、削除したりする場合、ワークスペース管理ツールはこうした変更を記録し、ブリングオーバーやプットバックトランザクションでそれらのファイルがどのように扱われるかを把握しておこうとします。ワークスペース管理ツールはこれらのファイルを自動的に処理しますが、ユーザーはファイルの名前変更、移動、あるいは削除によるブランチのしくみをある程度知っておくと便利です。
ここでは説明上、「名前変更」と「移動」を同じ意味とみなし、用語としては「名前変更」のみを使用します。
ファイルの削除および名前変更を行う場合、バージョン管理ツールで使用できるコマンドを使用することをお勧めします。この節では、基本的な処理について説明します。
名前を変更したファイルに対してプットバックあるいはブリングオーバートランザクションを実行する場合、ワークスペース管理ツールはファイルが新たに作成されたものなのか、以前から存在していたファイルの名前が変更されたものなのかを判断しなければなりません。ファイルの名前を変更する場合は、g-ファイルおよび SCCS 履歴ファイルの名前も変更する必要があります。名前の変更は、ファイルの内容の更新や衝突に関する処理と同じ規則に従って、ワークスペース階層全体に伝達されます。
トランザクションの実行中、ファイルは個別に処理されます。ディレクトリの名前を変更すると、そのディレクトリ内のすべてのファイルが個別に名前を変更されたかのように、それぞれのファイルについて評価が行われます。
図 7-2 では、親ワークスペース内のファイル "C" の名前が "D" に変更されています。この場合、ワークスペース管理ツールはファイルを子ワークスペースにコピーする際に、次のいずれが正しいのかを判断しなければなりません。
"D" は親ワークスペースで新たに作成されたものか
子ワークスペースの "C" と同じファイルに新しい名前が付けられたものか
プットバック操作の場合も同様の判断が必要です。つまり、子ワークスペース内の "C" は新しいファイルなのか、それとも別のファイルの名前が変更されたものなのか、という判断です。
対象となるファイルが新規ファイルである場合と既存ファイルである場合とでは、処理の内容がかなり異なります。親ワークスペースの新規ファイルである場合、ワークスペース管理ツールは子ワークスペースにも新しいファイルを作成します。一方、親ワークスペース内で既存のファイルの名前を変更したものであれば、子ワークスペース内でファイルの名前を "C" から "D" に変更します。
ワークスペース管理ツールは、名前が変更された場合でもファイルを特定できるように、SCCS 履歴ファイルに情報を記憶します。ブリングオーバーおよびプットバックのトランザクションの出力を表示させると、次のようなメッセージが含まれています。
検査したファイル数:
ワークスペース管理ツールは、更新ブリングオーバーまたはプットバックトランザクションに関連するすべてのファイルをチェックし、名前の変更が行われていないことを確認した上でファイルの転送を開始します。
名前が変更されたファイルを検出すると、名前の変更を子 (ブリングオーバーの場合) または親 (プットバックの場合) に通知します。「トランザクション出力」ウィンドウに次のようなメッセージが表示されます。
名前変更 旧: old_filename 新: new_filename
ワークスペース管理ツールは、ファイルの名前に関する履歴情報を SCCS 履歴ファイルに格納します。名前履歴は、ファイルの作成以降、変更が加えられてきたワークスペース相対名をリストしたものです。この情報は、ワークスペース管理ツールが名前の変更されたファイルと新規ファイルとを識別するために使用します。ファイルの名前を変更すると、ワークスペース管理ツールはそのファイルを処理対象とする次のブリングオーバーまたはプットバックのトランザクションの実行時に、そのファイルの名前履歴を更新します。名前履歴が更新されると、「トランザクション出力」ウィンドウに次のようなメッセージが表示されます。
名前に関する詳細: 1 親の名前履歴を更新 1 子の名前履歴を更新
ごくまれではありますが、親ワークスペースと子ワークスペースで同時に同じファイルの名前が変更されることがあります。これを、名前変更の衝突と呼びます。たとえば、親ワークスペースでファイル "C" が "D" という名前に変更され、同時に子ワークスペースでは "E" に変更された場合です。
名前変更の衝突が発生した場合、ワークスペース管理ツールは親の "D" と子の "E" が実際には同じであることを判別します。このような場合、ワークスペース管理ツールは次のような処置を行います。
子のファイル名を使用して衝突があることを報告します。
子のファイル名を自動的に親のファイル名に変更して、この衝突を解決します。常に (プットバックトランザクションの場合でも)、親にあるファイルの名前が選択されます。
ワークスペース管理ツールが名前変更の衝突を検出すると、「トランザクション出力」ウィンドウに次のようなメッセージが表示されます。
名前の衝突です: name_in_child 名前変更 旧: name_in_child 新: name_in_parent
ワークスペースからファイルを削除するというワークスペース管理ツールでの操作は、一般的な削除の概念と少し異なります。ワークスペースからファイルを削除するときに rm コマンドを使用すると、ワークスペース管理ツールはそのファイルがワークスペースの親または子で新たに作成されたものであると見なします。
たとえば、次の例を考えてみましょう。ファイル "C" が rm コマンドで子ワークスペースから削除された後、更新ブリングオーバーを使用してこの子ワークスペースを更新する場合です。
ワークスペース管理ツールはまず 2 つのワークスペースを検査して、ファイル "C" が親には存在するが、子には存在しないことを確認します。そこで、ワークスペース管理ツールは子にファイル "C" を作成します。
このような動作をすることから、ワークスペース内のファイルを削除したい場合には、一定の規則をプロジェクト内で決めておきます。たとえば、削除するファイルには、その名前の先頭に .del- という接頭辞を付けるようにします。
example% mv module.c .del-module.c example% mv SCCS/s.module.c SCCS/s..del-module.c
この方法には、次のような利点があります。
SunOS のデフォルトのコマンド (たとえば、ls) でこのファイルを表示させることができなくなります。
ワークスペース管理ツールはこのファイルを再作成しません。
ワークスペース管理ツールはこの変更をワークスペース階層全体をとおして名前変更されたものとして扱い、結果的にワークスペース全体でこのファイルは削除されたものと同じことになります。
実際に削除されたわけではないので、後でこのファイルが関連するリリースの再作成に利用することができます。たとえば、ファイルがフリーズポイントの一部になっていた場合などです。フリーズポイントについては、第 4 章「プロジェクトの開始」および第 14 章「フリーズポイントツールの使用」を参照してください。