[cvs-jp-info 160] Re: ブランチを利用したプログラムの保守について

アーカイブの一覧に戻る

Shun-ichi GOTO gotoh****@taiyo*****
2003年 7月 3日 (木) 14:17:03 JST


>>>>> at Thu, 03 Jul 2003 11:09:24 +0900,
>>>>> "Norihiro M." <ryokk****@hi-ho*****> said,

>  どうやらマージした後に、ブランチの最新リビジョンにタグを付け直
> しておいた方がよさそうですね。

それはその通りですが、

>  つまるところ、updateコマンドのマージ機能はあてにならんってこと
> でしょうかね。(^^;

これは違うと思いますよ。

問題となった操作は 
cvs update -j branch-name
かと思うのですが、1回目のmerge でも 2回目のmerge でも上記の
-j オプションを1つだけ指定してmerge していませんか?
## 以降はその場合の話です

この場合だと、1回目でmerge 済みの差分を2回目でも含めてしまって
いるのが問題です。なので2回目は

trunk にて cvs update -j last-merged-rev -j branch-name

とすべきかと思います。

2回目のmerge において、-j が1つだった場合と2つだった場合の具体的な
違いはオリジナルに対する (1)変更して(2)戻した == 変化なし
という操作をmerge することと (2) 戻した
という操作をmerge することの違いです。

-j を1つ指定したmerge の動作は、2つの流れの共通部分に遡った、その共通rev 
のファイルと、-j で指定されたrev と、ローカルファイルと、の3者を使って行
なわれますが、-j 2つ指定した場合は指定rev 間の差分をとり作業ファイルに適
用する、ということをしてくれます。

## なので、branch の発生した起点を示すタグは必ずしも必要ではありません。
## でも付けておいた方が、差分を調べたりする時には便利なのでお奨めします。

残念ながらcvs のmerge 機能はどこまでmerge 済みかを管理してはくれないので、
こういうことがおきます。なので、上記のようなupdate 作業を行なえるように、
branch 上でmerge 済みのrevを示すためのタグを付けておく(例えば 
"last-merged-point" など)と良いでしょう。『これ以前はtrunk にmerge 済み』
ということを示すものを。タグは固定の名称で良く、merge する度に指し示す
rev が移動するようにしておいた便利かと思います。


今回の例でいえば操作はこんな感じ?

(1) ブランチファイルに行を追加、コミット
    edit file.txt
    cvs ci -m "Added a line" file.txt
(2) トランクファイルにマージ、コミット
    cd ../tranck
    cvs update -j branch
    cd ../branch-dir
    cvs tag -F last-merged-point
(3) (1)で追加したブランチファイルの行を削除、コミット
    edit file.txt
    cvs ci -m "Reverted"
(4) トランクファイルにマージ
    cd ../trunk
    cvs update -j last-merged-point -j branch
    cvs ci -m "merged again"

--- Regards,
 Shun-ichi Goto  <gotoh****@taiyo*****>
   R&D Group, TAIYO Corp., Tokyo, JAPAN




CVS-JP-info メーリングリストの案内
アーカイブの一覧に戻る