▼CVS枝を取り込む▼

[CVS超入門] [枝の併合]

またの名をcvs update -jオプションの使い方。

$Id: cvsmerge.html,v 1.3 2012-10-19 00:25:51+09 kabe Exp $


枝を1回だけ併合する

	--- 1.8 --- 1.9 ----------------
	               \                \
	                1.9.2.1 ==取込==> -- (幹の作業領域)
	                 \
	                 (ORACLE)枝

枝を生やし、テストを行って とりあえず commit で枝を登録して伸ばしたあと、 幹に取り込みたいという場合。

cvs update に diff+patchをしてくれる -j オプションを使います。 -jは、

取り込んでくれます。上図だと共通の根元は 1.9。 なので
	# 幹にて作業中
	% cvs update -jORACLE tcpconn_
	RCS file: /home/kabe/CVSroot/munin.kit/tcpconn_,v
	retrieving revision 1.9
	retrieving revision 1.9.2.1
	Merging differences between 1.9 and 1.9.2.1 into tcpconn_
	rcsmerge: warning: conflicts during merge
	% _
で 1.9 から 1.9.2.1(現在のORACLE枝の先端) を作業領域(例:幹)にマージします。

$Id$ などは conflict となるので、できたファイルの中の 衝突マーカーを探して始末しておきます。

そのあと普通に commit すればできあがり。

失敗したら、cvs update -A -Cで幹の先端に戻せます。


枝を2回以上併合する

枝での開発が継続していたので、再度幹に取り込みたい (追っかけ)という場合。

	--- 1.8 --- 1.9 -----------------
	               \                 \
	                1.9.2.1 ==取込==> 1.10 ---- 1.11
	                 \                           \
	                  1.9.2.2     ====取込====>   (幹の作業領域)
	                   \
	                 (ORACLE)枝

上で1.11の状態から cvs update -jORACLE してしまうと、 共通の根元の 1.9 から 1.9.2.2 がマージされてしまい、1.9.2.1が 2重適用 になってしまいます。 仕方がないので、版番を明示して取り込みます。

	# 幹にて作業中
	% cvs update -j1.9.2.1 -jORACLE tcpconn_
	RCS file: /home/kabe/CVSroot/munin.kit/tcpconn_,v
	retrieving revision 1.9.2.1
	retrieving revision 1.9.2.2
	Merging differences between 1.9.2.1 and 1.9.2.2 into tcpconn_
	rcsmerge: warning: conflicts during merge
	% _
「最後に取り込んだ枝の版番」はCVSでは記録も計算もしていないので、 人間が記録しておかないといけません (タグ地図のすすめ)。

ファイル1つならともかく、複数の変更を版番明示で ちくちくと取り込むのは非常に大変ですので、

複数回取り込むかもしれない枝を1回目に取り込んだら、 取込元の枝側 にタグを打っておきます。

1回目の併合時に、たとえば cvs tag -rORACLE MERGE_TRUNK_1 とでもしておけば、2回目の併合では

	% cvs update -jMERGE_TRUNK_1 -jORACLE
だけで全ファイル取り込めます。
	--- 1.8 --- 1.9 ------------
	               \            \
	[MERGE_TRUNK_1] 1.9.2.1 ===> 1.10 ---- 1.11
	                 \                      \
	                  1.9.2.2     =======>   1.12 --- (幹)
	                   \
	                (ORACLE)枝

cvs import でベンダ枝を伸ばす際は、必ず点タグ(release-tags)も 要求されますが、要するにこういった幹への取り込みを やりやすくするためのものです。 人間は「最後に取り込んだベンダ枝の点タグ名」だけ覚えておけばよい。

そんなこといったってタグ打ってなかったよぉぉ

次回からは悔い改めるとして、
CVSの時刻で版を取り出す機能でなんとかします。 融通の利かないところもありますが。

◇まず、最後に枝を取り込んだ時刻を探します。

cvs log ファイル の出力を眺めて、いつ枝を取り込んだか 探します。普段からcommitコメントを入れていない人は懺悔しましょう。

	% cvs log -r1.10 tcpconn_

	RCS file: /home/kabe/CVSroot/munin.kit/tcpconn_,v
	Working file: tcpconn_
	...
	description:
	----------------------------
	revision 1.10
	date: 2006-07-07 04:41:44 +0000;  author: kabe;  state: Exp;  lines: +49 -12
	- merge ORACLE branch; ugly and messy
	=============================================================================

◇枝の、取り込み時刻以降の変更を併合するよう指示します

-jオプションは タグ名:時刻 で枝上の時刻での指定ができます。 この際はタイムゾーンも指定 すること。 CVSは内部的にはGMTで動いているので cvs rlog の出力は +0000 となっていますが、コマンドラインは何もなければ ローカル時刻で解釈されてしまいます。

-jを2つ指定して、 前回の取り込み時の枝の版と、現在の枝の先端までを 取り込みます。

	% cvs update -jORACLE:'2006-07-07 04:41:44 +0000' -jORACLE tcpconn_
	RCS file: /home/kabe/CVSroot/munin.kit/tcpconn_,v
	retrieving revision 1.9.2.1
	retrieving revision 1.9.2.2
	Merging differences between 1.9.2.1 and 1.9.2.2 into tcpconn_
	rcsmerge: warning: conflicts during merge
	% _

なお、この方法は、「前回併合した枝の版」から「幹に併合した時刻」 の間に枝が修正されていると取り込み損ねが生じます。


Next: ベンダ枝の怪


かべ@sra-tohoku.co.jp