
2つのラベルを同期させる
2つのラベルを一度に同期させるには
問題
2つのラベルを一度に同期させるには、どうすればよいでしょうか。
解決策
PERFORCEでは、ラベルはファイル名とリビジョンのリストです。
p4 sync @labelname の意味は、他のSCMシステムにおける「ラベルに基づいたチェックアウト」の意味とは異なります。
コマンドでファイル・パターンが指定されている場合を除き、p4 syncはワークスペース・ビュー全体を処理するため、p4 sync @labelname はラベルにリストされていないファイルを削除することも含め、ワークスペース全体をラベルと同期させます。
したがって、2つのラベルがある場合、連続して各ラベルにクライアント・ワークスペース全体を同期させても、2つのラベルが融合されるわけではありません。
単に、2番目のラベルに同期された状態になるだけです。
しかし、p4 sync コマンドでファイル・パターンを指定することにより、影響を受けるファイルを制限することができます。
例えば、
p4 sync //depot/projectA/...@label
とすると、//depot/projectA にあるファイルにのみ影響します。
ワークスペースからファイルを一切削除することなく、あるラベルが付けられたファイルと同期させたい場合は、@label,label の構文を使用します。
例えば、
p4 sync @label,label
とすると、label により指定されたファイルだけを同期し、他のクライアント・ファイルは処理しません。
繰り返しますが、p4 sync に @label 構文(@label,labelではなく)を使用して実行すると、ワークスペース内のファイルでラベルにリストされていないものは削除されます。
この動作は一貫していますが、他のSCMシステムを使い慣れているユーザには混乱を招くかもしれません。
このような疑問を起こさせる、典型的なシナリオを以下に示します。
プロジェクトAに従事しているユーザが自分たちのファイルにラベル(A42とする)を付けた
プロジェクトBに従事しているユーザが自分たちのファイルにラベル(B42とする)を付けた
「ビルド・プロセス」ではA42およびB42により指定されているファイルが必要である
プロジェクトAとプロジェクトBがディポ内の別々のディレクトリを占有している場合、次のコマンドで両方のラベルを一度に取得できます。
p4 sync //depot/projectA/...@A42 //depot/projectB/...@B42
しかし、プロジェクトAとプロジェクトBのディレクトリ編成によってこれが可能でない場合、ラベルA42とラベルB42とが融合されたラベルを作成することができます。
p4 labelsync -l both42 @A42
p4 labelsync -a -l both42 @B42
(-a(追加)オプションはリリース97.3でp4 labelに追加されています)
こうして、次のコマンドで両方のプロジェクトのラベル付けされたファイルと同期させることができます。
p4 sync @both42
融合されたラベルを作成するのとは別に、上述した @label,label 構文を使用する方法があります。
このシナリオでは、(任意で)ワークスペースを空にして、順番に各ラベルと同期させることができます。
例を示します。
p4 sync #none
p4 sync @A42,A42
p4 sync @B42,B42
ラベルやその他のリビジョン指定子にファイルを同期させるどの場合でも、編集目的で作業状態にされたファイルは処理されないことを覚えておいてください。
ラベルとPERFORCEについての議論は、アトミックな変更との関係に言及しなければ不完全といえるでしょう。
ほとんどのSCMシステムでは、アトミックな変更がサポートされていないためにラベルが使用されており、リビジョンにラベルを付けることが、特定のコード断面のスナップショットを表す唯一の方法です。
例えばほとんどのファイルが火曜日のものであるが特定のファイルは金曜日のものであるなど、整合しない断面を表している場合を除いて、PERFORCEでは、ラベルを使用する必要は全くありません。
上記で "@labelname" を用いて指定されたすべてのラベルは、チェンジ番号に置き換えることができます。
|