前: Merging adds and removals, 上: Branching and merging


5.10 マージとキーワード

キーワードを含むファイルをマージすると (see Keyword substitution、 通常マージの間に数多くの衝突が起こります。なぜなら、キーワードはマージ 中のリビジョンで違う様に展開されているからです。

ですから、しばしばマージのコマンド行で `-kk' (see Substitution modes) スイッチを指定したいと思うでしょう。キーワードの展開された値を 展開するのでは無く、キーワードの名前だけを置換することによって、このオ プションはマージしているリビジョンがそれぞれ同じことを確実にして、見せ かけの衝突を回避します。

例えば、このようなファイルがあるとしましょう:

            +---------+
           _! 1.1.2.1 !   <-  br1
          / +---------+
         /
        /
     +-----+    +-----+
     ! 1.1 !----! 1.2 !
     +-----+    +-----+

そして、作業ディレクトリは現在幹 (revision 1.2) にあります。そうすると、 以下の結果をマージから得るでしょう:

     $ cat file1
     key $Revision: 1.2 $
     . . .
     $ cvs update -j br1
     U file1
     RCS file: /cvsroot/first-dir/file1,v
     retrieving revision 1.1
     retrieving revision 1.1.2.1
     Merging differences between 1.1 and 1.1.2.1 into file1
     rcsmerge: warning: conflicts during merge
     $ cat file1
     <<<<<<< file1
     key $Revision: 1.2 $
     =======
     key $Revision: 1.1.2.1 $
     >>>>>>> 1.1.2.1
     . . .

これで起こったことは、merge が 1.1 と 1.1.2.1 間の差分を作業ディレクト リにマージしようとした、ということです。キーワードはRevision: 1.1 から Revision: 1.1.2.1 へと変わっているので、cvs はそ の変更を作業ディレクトリにマージしようとして、それは作業ディレクトリが Revision: 1.2 を含んでいた、という事実と衝突をしました。

これは `-kk' を使用したときにに起こることです:

     $ cat file1
     key $Revision: 1.2 $
     . . .
     $ cvs update -kk -j br1
     U file1
     RCS file: /cvsroot/first-dir/file1,v
     retrieving revision 1.1
     retrieving revision 1.1.2.1
     Merging differences between 1.1 and 1.1.2.1 into file1
     $ cat file1
     key $Revision$
     . . .

ここでは、リビジョン 1.1 とリビジョン 1.1.2.1 の両方ともが Revision に展開され、それらの変更を作業コピーにマージすることは 何も変更しません。ですから、衝突は起こりません。

しかしながら、マージで `-kk' を使うことには一つ大きな注意がありま す。つまり、それは普通は cvs が使っていたであろうキーワード展開の 様式を上書きします。特に、これは、バイナリファイルのために様式が `-kb' であったときに問題になります。ですので、リポジトリにバイナ リファイルがあるときは、`-kk' を使用するよりは、衝突に対処する必 要があるでしょう。