[目次へ][3章へ][3.8へ][3.10へ] 最終更新:$Date: 2002/08/22 09:56:02 $

題名変更。


■■3.9 作業を再開してみる(update)

updateコマンドは、他の作業コピーでおこなわれ、リポジトリに登録された変更を、手元の作業コピーに反映させるためのコマンドです。更新というより、同期(sync)と言った方が分かりやすい気がします。複数の人と協同して作業する時に真価を発揮しますが、まだ一人なので、それほどメリットを感じないかも知れません。ですが、作業の後、状態の確認のためだけにも、updateコマンドはよく使われます。ファイルの状態を示す記号については、3.10節にまとめておきます。

updateコマンドの書式を【図3.9.1】に示します。

【図3.9.1】updateコマンドの書式
▼
cvs update [-APdflRp] [-k 展開方法] [-r リビジョン|-D 日付] [-jリビジョン] [-I 無視対象] [-W パターン動作] [ファイル群...]
▲

オプションで今の段階で使うのは-dと-Pの2つのオプションです。それぞれ、ディレクトリの追加と削除に関係していますので、以下で詳しく見てみましょう。

■■■3.9.1 ディレクトリの追加と-d オプション

一人で作業しているときは、あまり気が付きませんが、作業コピーを2つ以上持っていたりすると、一方で作成したはずのディレクトリが他のものには反映されないということが起こります。これは、updateコマンドが、何も指定しないと、今いる作業コピーに既にあるディレクトリについてのみチェックするという挙動をするためです。

挙動を見てみるために、「newdir」というディレクトリを、cvstest2ディレクトリに1つ加えてみましょう【図3.9.2】。追加手順は、ファイルとちょっと違います。作成し、addコマンドをするといきなりリポジトリに反映されます。特にコミットする必要はありません。ちょっとびっくりですね。

【図3.9.2】ディレクトリを追加する。
▼
% mkdir newdir
% cvs add -m "New Directory" newdir
Directory /home/cvsroot/cvstest2/newdir added to the repository
▲

lsを使用して、この段階でリポジトリには新規に作成したnewdirが確かに追加されているのを確認することができます【図3.9.3】。

【図3.9.3】ディレクトリを追加する。
▼
% ls -F /home/cvsroot/cvstest2
Attic/  dir1/  newdir/  tmp2.txt,v
▲

次に別の作業コピーをどこかにチェックアウトして、そこに移動してください。ここで、updateコマンドを実行してみます【図3.9.4】。

 【図3.9.4】何もつけずにupdateコマンドを実行してみる
▼
% cvs update
cvs update: Updating .
cvs update: Updating dir1
cvs update: Updating dir1/dir2
% ls -F
CVS/  dir1/  tmp2.txt
▲

が、さっき言ったように反映されてません【図3.9.4 最終行】。こういうときには、-dオプションを使います【図3.9.5】。

 【図3.9.5】-dオプションをつけてupdateコマンドを実行してみる
▼
% cvs update -d
cvs update: Updating .
cvs update: Updating dir1
cvs update: Updating dir1/dir2
cvs update: Updating newdir
% ls -F
CVS/  dir1/  newdir/  tmp2.txt
▲

無事、別の作業コピーにも作業結果が反映されました【図3.9.5 最終行】。

■■■3.9.2 ディレクトリの削除と-Pオプション

ディレクトリの削除はちょっと特殊です。removeコマンドは、ファイルに対しては使うことができますが、ディレクトリを指定しても、何の意味もありません。リポジトリに一旦追加されたディレクトリは、実際には削除されることがありません。空であるかどうかだけが意味をもちます。

-Pオプションは、今現在の作業コピーに含まれる空ディレクトリを、一旦手元から削除するために用いるオプションです。つまり、ディレクトリが既に空であるなら、-Pオプションをつけてupdateコマンドを実行することにより、手元の作業コピーからその姿を消すことができます。やってみましょう【図3.9.6】。

【図3.9.6】ディレクトリを(作業コピーから)削除する
▼
% cvs update -P
cvs update: Updating .
cvs update: Updating dir1
cvs update: Updating dir1/dir2
cvs update: Updating newdir
% ls -F
CVS/  dir1/  tmp2.txt
▲

もちろん、‐Pオプションによって、リポジトリ内のディレクトリが削除されるということはありません。このため、上で紹介した-dオプションをつけてupdateコマンドを再度実行すると、空のディレクトリができてしまいます【図3.9.7】。なんだかややこしいですね。

【図3.9.7】ディレクトリがまたやってきた。
▼
% cvs update -d
cvs update: Updating .
cvs update: Updating dir1
cvs update: Updating dir1/dir2
cvs update: Updating newdir
% ls -F
CVS/  dir1/  newdir/  tmp2.txt
▲

■■■3.9.3 空じゃないディレクトリだけ残す方法は?

-dと-Pを同時に適用するとどうなるでしょう。テストしてみますが、その前に、ディレクトリnewdir2を作り、中にファイルを置いた状態をリポジトリに登録しておきましょう。そこで、空のディレクトリ、「newdir」が残っていてるが「newdir2」は存在しない状態の作業コピーに移動します。そこで、updateコマンドを-dと-Pの両方のオプションを同時に指定して実行してみます【図3.9.8】。

 【図3.9.8】newdir2/test.txtを追加して-dと-Pを同時に指定する
▼
% cvs add newdir2 newdir2/test.txt
Directory /home/cvsroot/cvstest2/newdir2 added to the repository
cvs add: scheduling file `newdir2/test.txt' for addition
cvs add: use 'cvs commit' to add this file permanently
% cvs commit -m "Second directory addition"
cvs commit: Examining .
cvs commit: Examining dir1
cvs commit: Examining dir1/dir2
cvs commit: Examining newdir
cvs commit: Examining newdir2
RCS file: /home/cvsroot/cvstest2/newdir2/test.txt,v
done
Checking in newdir2/test.txt;
/home/cvsroot/cvstest2/newdir2/test.txt,v  <--  test.txt
initial revision: 1.1
done

...(別の作業コピーに移動)...

% ls -F
CVS/  dir1/  newdir/  tmp2.txt
% cvs update -P -d
cvs update: Updating .
cvs update: Updating dir1
cvs update: Updating dir1/dir2
cvs update: Updating newdir
% ls -F
CVS/  dir1/  newdir2/  tmp2.txt
▲

すると、newdirがなくなり、newdir2が増えました。ちょっと、釈然としない気もしますが、両方指定すると具合が良いようですね。【図3.9.9】のように、リポジトリ内にディレクトリはずっと残り続けます。気持ち悪いかもしれませんが、CVSはそういう仕組みだと理解してください。

【図3.9.9】ディレクトリは永遠に残りつづける
▼
% ls -F /home/cvsroot/cvstest2
Attic/  dir1/  newdir/  newdir2/  tmp2.txt,v
▲

■■■3.9.4 WinCvsでのフォルダの追加と削除

WinCvsでのフォルダの追加と削除でもupdate時のオプションは重要です。具体的にその手順を見る前に、WinCvsからフォルダを追加するときに必要なエクスプローラの呼び出しについてみてみましょう。

■■■■ フォルダの追加とエクスプローラ

フォルダを追加するためにはエクスプローラを呼び出す必要があり、その方法がいくつかあると前節で述べました。前節ではエクスプローラタブから呼び出す方法を紹介しましたが、ここでは、モジュールタブやワークスペース上から呼び出す方法を紹介します。モジュールを操作しているときにはこちらを使うほうが標準的だと思います。

まず、モジュールタブやワークスペースで目的のフォルダを選んでください。次に、この選んだ状態でメニュー[問合せ]→[エクスプローラで表示]【図3.9.10】を選ぶか、または、[ファイル]バー の中のアイコンを選んでください。

【図3.9.10】 [エクスプローラで表示]メニュー

なんにしろ【図3.9.11】のようなエクスプローラが出てくれば成功です。

【図3.9.11】 選んだフォルダが出てきた

ここでフォルダを新規に作成して、WinCvsでフォルダの追加をおこなってください。上のコマンドラインでみたように、リポジトリへのフォルダの追加はaddコマンドの実行時におこなわれるので、コミットは必要ありません。このままだと空のままですから、新しく作成したフォルダの中にファイルを作成して追加しておいてください。【図3.9.12】にnewdirを作成して、test.txtを追加した状態を示します。

【図3.9.12】newdirの中にtest.txtができてるかな?

【図3.9.12】のようにうまく表示されたでしょうか。作ったはずのファイルやフォルダが現われない場合には、あわてず騒がず、最新の状態をWinCvsに教えてあげてください。ちょっと、このあたり鈍いみたいなので。これには、メニュー[表示]→[最新の状態に更新]【図3.9.13】やフィルタバーのリフレッシュアイコンを使用します。おかしいなぁと思ったら、その都度やってみてください。

【図3.9.13】 [表示]→[最新の状態に更新]メニュー

■■■■ 別作業コピーへのフォルダの取り出しと削除

上で述べたように、特に指定しなければ、追加したフォルダはすでにある別の作業コピーには現われません。別の作業コピーを例えば、wintest2として取り出すことを考えてみましょう。チェックアウトを開始した時に現われるダイアログ【図3.9.14】で「標準のディレクトリの名前(モジュール名)を上書き」チェックボックスにチェックをつけ、「ディレクトリ名」のところにwintest2として、[OK]ボタンを押してください。

【図3.9.14】 モジュール名とは別の名前で取り出してみる

【図3.9.15】のようにwintest2が新たにできれば成功です。

【図3.9.15】 似たようなのが2つできたよ

■■■■ WinCvsと-dオプション

このように、取り出し時に既に存在するフォルダは取り出されます。ここで、wintestの方にもうひとつフォルダを作成してみます。【図3.9.16】のようになるようにしてください。newdir2という名前でフォルダを作り、addコマンドで追加します。中に何かファイルも作って追加とコミットしておくのもお忘れなく。

【図3.9.16】 workcopyに新しいフォルダを作ろう

ここで、wintest2の方に更新をかけてみます。モジュールタブでwintest2を選んだ状態で、メニュー【図3.9.17】か、ブラウズバーの更新アイコンを選んでください。

【図3.9.17】 [修正]→[更新(Update)...]メニュー

このとき、オプション-dを指定しなければフォルダは出てきません。指定は更新時に現われるダイアログ【図3.9.18】でおこないます。-dオプションと書いてあるわけではないので、探しにくいですが、「リポジトリにあってローカルに存在しないディレクトリを作成」チェックボックスがそれです。ここにチェックをつけ、「OK」ボタンを押してください。

【図3.9.18】 -dオプションはどれ?

すると、アウトプット領域に【図3.9.19】のようなメッセージが表示されるかと思います。つけた覚えの無い-Pと指定した-dがオプションとして指定されているのが見て取れたりしますね。これについては、次で説明します。

【図3.9.19】
▼
cvs update -P -d (ディレクトリ C:\home\mika\workcopy\wintest2\ 内)
cvs update: Updating .
cvs update: Updating newdir
cvs update: Updating newdir2
U newdir2/test2.txt


*****CVS はコード 0 で終了しました*****

▲

これで、【図3.9.20】のようにフォルダが追加されれば成功です。何度かフォルダの追加をおこなって、チェックがついているときとついていないときの挙動を確かめてください。

【図3.9.20】 新しいフォルダは取れた?(要差し替え)

■■■■ WinCvsと-Pオプション

CVSでは一旦追加されてしまったフォルダを明示的に削除することはできませんでしたね。中身を空にして、オプション-Pで見えなくするだけだと、説明しました。WinCvsでのこのオプション設定は、「共通設定」タブでおこないます。更新時のダイアログにも出てきますが、設定メニューの中にも出てきます。【図3.9.20】の「空ディレクトリを削除」というチェックボックスがそれです。また、見てみるとわかるように最初からチェックがついた状態になっているはずです。ですので、【図3.9.19】で指定した覚えもないのについていたわけです。

【図3.9.20】 もうはじめから-Pオプションはつくようになってるのね…

空のフォルダが必要な場合には適宜このチェックボックスを設定してください。

■■■3.9.5 まとめ

ディレクトリを追加または削除した後で、作業コピーに反映させるには次のようにすればよいでしょう。追加や削除が自分の意識しないうちにおこなわれるような場合は、-dと-Pを常につけるようにしておいたほうがよいでしょう。

ディレクトリtarget_dirを追加または削除

別の作業コピーでの更新
cvs update -d -P