上一个: Merging adds and removals, 上层: Branching and merging


5.10 合并与关键字

如果你要合并的文件中包含关键字(参阅 Keyword substitution),你会得到一大堆冲突,这是因为关键字与合并的版本关联。

因此,你需要在合并的命令行里面指定 `-kk'(参阅 Substitution modes) 开关。 用只替换关键字名而不是其展开的值的办法,这个选项确保正合并的版本互相是是相同的,从而避免产生假的冲突。

例如,假定你有一个这样的文件:

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

你的工作目录当前在树干上(版本 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
     . . .

产生这些信息是由于合并尝试将 1.1 与 1.1.2.1 之间的差异合并到你的工作目录。 因为版本关键字从 Revision: 1.1 变为 Revision: 1.1.2.1cvs 试图把该改变合并进你的工作目录,而与你的工作目录里已包含 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,因此把它们之间的改变合并进工作目录不需要改变什么。 也就不会有冲突产生。

警告: 在 cvs 1.12.2 之前的版本中,合并时使用 `-kk' 会有严重的问题。 那就是 `-kk' 会跨越任何仓库中归档文件中设置的默认关键字扩展模式。 对一些用户很不幸,这会造成二进制文件(默认关键字扩展模式设置为 `-kb')的损坏。 因此,当仓库中包含二进制文件时,解决冲突必须使用手工修改的方法来替代合并命令中的 `-kk'。

cvs 1.12.2 之后的版本中,命令行对任何 cvs 命令提供的关键字扩展模式不再跨越为二进制文件设置的 `-kb' 关键字扩展模式,然而它还是将跨越其它默认关键字扩展模式。 现在即使仓库中包含二进制文件,你也可以在合并中安全地使用 `-kk' 来防止含有 RCS 关键字行的假性冲突。