製品情報
技術情報
  簡単に使ってみましょう(Windows)
  簡単に使ってみましょう(UNIX)
  よくある質問 (FAQ)
  テクニカルノート
  製品比較
  用語集
  ネットワーク上でのソフトウェア開発
  インターファイル・ブランチング
  ソフトウェア構成管理の
高度な実践方法・・・
  変更管理を通じた製品品質の向上
  PERFORCE−SOFTUNE
連携運用ガイド (Rev1.02)[PDF]
ライセンス情報
テクニカルサポート
ソフトウェア ダウンロード
マニュアル ダウンロード









 
テクニカルノート057 HOME製品PERFORCE 技術情報ノート


PERFORCEが反映すべきリビジョンを決定する方法


このテクニカルノートでは、ユーザが integrate コマンドを実行したとき、反映の対象とすべき反映元ファイルのリビジョンをPERFORCEがどのようにして決定しているのか、そして対応する反映先ファイルにおいて何が起きるのかを説明します。

ユーザが integrate を実行するにあたっては3つのケースがあり、それぞれについてどのようにリビジョンが選択されるかが異なります。
  1. これは、開始リビジョンと終了リビジョンを選択しないケースです。言い換えれば、ユーザはパスのみを指定し、PERFORCEが反映元リビジョンを選択するとき、開始リビジョンと終了リビジョンをピックアップします。例えば、次のように実行した場合です。:
    p4 integ source/... target/...
  2. これは、終了リビジョンのみを指定するケースです。例えば、反映元のパスに対して、反映元のパスにおけるチェンジリスト300までのすべての変更を反映する場合、次のように実行します。
    p4 integ source/...@300 target/...
    この場合、PERFORCEは開始リビジョンをピックアップします。

  3. これは、開始リビジョンと終了リビジョンの両方を指定するケースです。例えば、チェンジリスト300から 350までの変更を反映元のパスから反映先のパスへ反映する場合、次のように実行します。
    p4 integ source/...@300,@350 target/...
ユーザからの integrate コマンドを受け取った後、PERFORCEはまず初めに反映元ファイルと反映先ファイルのペアを作ります。それから、それぞれのファイルのペアに対して候補となるすべてのリビジョンをリストし、そして過去に反映済みのリビジョンを取り除きます。そこで残ったりビジョンのリストが、どのように反映先ファイルを作業状態にするか、またはしないか、さらに衝突解決をスケジュールするかどうかを決定するために使われます。


反映元ファイルと反映先ファイルをペアにする

PERFORCEは、反映元ファイルと反映先ファイルのペアを作るために、ユーザが指定した名前付きのブランチ・ビューか、もしくはユーザが指定した反映元および反映先のパスを使用します。これらのペアは、反映元/反映先ペアのリストを作るために並べられます。例えば、次のように実行した場合を考えます。
p4 integrate source/... target/...
ここで、"source/foo" と "target/foo" のうちの1つもしくは両方が存在するとすると、 "source/foo target/foo" のペアがリスト内のエントリに書き込まれます。

リスト内のそれぞれのペアに対して、次の2つのステップが独立して実行されます。


反映元リビジョンの候補をリスト

PERFORCEは、反映元ファイルのすべてのリビジョンを反映先へ反映するための候補として取り上げます。例えば、source/foo の最新リビジョンが #30 とすると、source/foo を target/foo へ反映するための候補リストは次のようになります。:
開始リビジョン: source/foo#1
終了リビジョン: source/foo#30
              

しかしながら、もしユーザが開始および/または終了リビジョンを指定した場合、PERFORCEはそれに従って候補のリビジョンを調整します。例えば、source/foo@300 が #2 で、source/foo@350 が #10 である場合、次のようになります。:
p4 integrate source@300 target
開始リビジョン: source#1
終了リビジョン: source#2

p4 integrate source@300,@350 target
開始リビジョン: source#2
終了リビジョン: source#10
              

さらに、もし開始から終了の範囲において反映元ファイルが削除されたり再追加されたりしていると、別の調整が行われます。すなわち、開始リビジョンは最も最近に "追加" されたリビジョンに引き上げられます。例えば、source#3 が "削除" され、source#4 が "追加" されていると、上記の例における調整された範囲は次のようになります。:
開始リビジョン: source/foo#4
終了リビジョン: source/foo#10
              


過去に反映済みのリビジョンを取り除く

PERFORCEの反映履歴には、過去に反映先ファイルへ反映した反映元ファイルのリビジョンが記録されます。反映先ファイルが反映元ファイルのリビジョンからブランチされたものだとすると、ブランチされたリビジョンを含む、それまでのすべての反映元リビジョンは、過去に反映されたものであると判断されます。そして、過去に反映済みのリビジョンは、候補リビジョンのリストから除外されます。例えば、もしsource#4、 source#5、source#9 がすでに反映済みであるとすると、上の例における最終的な反映のためのリビジョンは、次のように #6、#7、#8 および #10 となります。:
source#4
source#5
source#6 (開始リビジョン)
source#7
source#8
source#9
source#10(終了リビジョン)
              

これが、反映のための最終的なリビジョンのリストとなります。さらに、反映先ファイルがサブミットされたとき、この反映元−反映先ペアに対する反映履歴へ追加されるリビジョンのリストとなります。

ここからは、"#start" および "#end" として反映される開始リビジョンおよび終了リビジョンについて述べます。ただし、PERFORCEの中でこのような特別なリビジョン指定子があるわけではありません(これに対して、 "#head" および "#have" は、PERFORCEのコマンドの中で使用できる適正なリビジョン指定子です)。 "source#1" は反映元ファイルの最初のリビジョンを意味しますが、"source#start" は反映されるリビジョンのリストにおける開始リビジョンを意味します。そして、"source#head" はディポにおける反映元ファイルの最新リビジョンを意味しますが、"source#end" は反映されるリビジョンのリストにおける終了リビジョンを意味します。


反映先ファイルに何が起きるか?

いったんPERFORCEが、与えられた反映元−反映先ペアに対して反映されるリビジョンのリストを決定すると、反映先ファイルに対して何が起こるべきであるかを決定するためにいくつかのファクタをテストします。(一つのファクタは各リビジョンに関連するアクションであり、filelog コマンドによってこれらを見ることができます。)以下のような可能性があります。:
  • もし、反映先ファイルが存在せず、source#start のアクションが "branch" または "add" の場合、 PERFORCEは source#end を反映先ファイルにブランチします。反映先ブランチは "branch" 目的の作業状態となり、衝突解決はスケジュールされません。

    反映先ファイルをサブミットすることにより、次に示す双方向の反映履歴が作成されます。:
    一つは source#start から source#end までが反映先ファイルに反映されたことを示すエントリであり、もう一つは target#1 が反映元から反映されたことを示すエントリです。

  • もし、反映先ファイルが存在せず、source#start のアクションが "branch" でも "add" でもない場合、反映先ファイルは作業状態になりません。

    integrate -d を実行することによって、強制的に反映先ファイルを追加することもできます。-d オプションは、反映先ファイルをbranch目的で作業状態にし、衝突解決をスケジュールしません。(99.2より前のリリースでは、branch目的で作業状態にするのがデフォルトの動きでしたのでご注意ください。)

  • 反映元ファイルと反映先ファイルがともに存在し、target#head のアクションが "delete" で、かつ source#start のアクションが "branch" でも "add" でもない場合、反映先ファイルは作業状態になりません。

    integrate -d を実行することによって、削除リビジョンの次に、強制的に反映先ファイルを再追加することもできます。-d オプションは、反映先ファイルをbranch目的で作業状態にし、衝突解決をスケジュールしません。(99.2より前のリリースでは、削除リビジョンの次に、反映先ファイルを再追加するのがデフォルトの動きでしたのでご注意ください。)

  • 反映元ファイルと反映先ファイルがともに存在し、source#end のアクションが "delete" で、かつ反映元ファイルへまだ反映されていない "edit" または "integrate" のリビジョンが反映先ファイルに存在する場合、反映先ファイルは作業状態になりません。

    editリビジョンの次に、反映先ファイルを強制的に削除目的の作業状態にするには、 integrate -d を実行します。-d オプションを用いることによって、反映先ファイルを削除目的で作業状態にし、衝突解決はスケジュールされません。(99.2より前のリリースでは、editリビジョンの次で、反映先ファイルを削除目的の作業状態にするのがデフォルトの動きでしたのでご注意ください。)

  • 反映元ファイルと反映先ファイルがともに存在し、source#start のアクションが "edit" または "integrate" である場合、反映先ファイルは作業状態となり、衝突解決がスケジュールされます。衝突解決をする際、PERFORCEはベースとして開始リビジョンの親リビジョン(1つ前のリビジョン)を使って、3-ウェイ・マージを実行します。例えば、開始リビジョンが source#6 で終了リビジョンが source#10 の場合、3-ウェイ・マージは次のように各リビジョンを使用します。:
    	o "base" として source#5 
    	o "theirs" として source#10
    	o "yours" として target#have
            
    (99.2より前のリリースでは、たとえマージのためのベース・リビジョンが見つからなかったとしても、 PERFORCEは反映先ファイルを反映目的の作業状態にします。しかし、衝突解決をしたとき、3-ウェイ・マージのベースとして使用するリビジョン(開始リビジョンの親リビジョン)が見つかりませんので、PERFORCEは2- ウェイ・マージを実行しようとします。ご注意ください。)



戻る