home / uni / cvscmd CVS - よく使うコマンド

●チェックアウト
$ cvs -d リポジトリ co -d ディレクトリ モジュール
 リポジトリからモジュールをチェックアウトし、指定されたディレクトリに展開する。ディレクトリはCVS管理下に入る。Microsoft Visual SourceSafe(以下MS-VSS)では最初にソースを取得する動作に相当する。この操作は最初にモジュールのソースを取得するときのみ行う。既にソースを取得してある場合、以後のファイル更新はアップデートで行うことになる。

 リポジトリはCVSROOT環境変数でも指定できるが、通常、チェックアウトの時だけしか指定しないのと、CVSROOT環境変数では複数のリポジトリを設定できないので、コマンドラインで指定したほうがよいだろう。ディレクトリを指定しないと指定したモジュール以下の構造がカレントディレクトリに生成されるが、これはあまり意図した動作ではないだろう。

 ローカルにあるリポジトリを使う場合はリポジトリのパスを指定すればよい。 他のホストにあるリポジトリを使う場合はいくつか書き方があるが、sshトンネルでアクセスする場合は環境変数CVS_RSHにsshを設定し、:ext:user@host:/path/to/repository の形で指定する。

●チェックイン
$ cvs ci
 カレントディレクトリ以下のファイルをチェックインする。コミットとも呼ばれる。MS-VSSのチェックインと同じ。ちなみに、CVSにはMS-VSSのチェックアウトという概念はない。リポジトリ他のデータはCVSというサブディレクトリに格納されているため、チェックインはこれだけでよい。

 CVSEDITOR環境変数で指定したエディタが立ち上がり、そこに変更されたファイルが書かれているので、これを参考にしてログメッセージを書き、メッセージを保存・エディタを終了すると、チェックイン動作が行われる。チェックイン動作を中断したい場合、メッセージを破棄・エディタを終了すると、どういう動作を行うかたずねられるので、[A](Abort)を選択すればよい。

●アップデート
$ cvs up
 カレントディレクトリ以下のファイルをアップデートする。MS-VSSで既にソースがある場合に最新版を取得したのと同じ動作になる。一度チェックアウトしていないと使えない。リポジトリ側に新たにディレクトリが増えた場合、そのディレクトリはデフォルトでは取得対象にならない。以下のように-dをつけてアップデートする。
$ cvs up -d
●どのファイルを変更したんだろう?(1)
$ cvs -q up
 とりあえずアップデートしてみればよい。アップデートを行うと作業を行ったファイル一覧が出力されるが、先頭にアルファベットなどが付いている。先頭がUなのはリポジトリから全体を取ってきたファイル、Pは一部を取ってきてパッチを当てたファイルで、Mがリポジトリの内容と異なるファイルである。-qを指定しておくと余計な出力が抑制され、多少出力が見やすくなる。

 ビルド時の中間ファイルなど、明らかに登録する必要のないファイルは、.cvsignoreというファイルにワイルドカードを使って書いておくとよい。 同様のファイルはいろいろな方法で指定できるが、作業ディレクトリに置くのが一番楽。 サブディレクトリにも置ける。 (06 Nov 2018)

●どこを変更したんだろう?
$ cvs diff -u [ファイル名] ...
 リポジトリ中の最新と、作業ディレクトリの内容の差分を見る。一人で作業している場合は前回のチェックインから何を変更したか? を見ることができる。-u は出力形式で、Unixのdiffコマンドと同じオプションを使う。個人的にはここで指定している -u が見やすいくてよいだろう。タグを指定することもできる(後述)。
●ファイル・ディレクトリの追加
$ cvs add [-kb] 追加するファイル等一覧
 指定したファイル・ディレクトリをリポジトリに追加する。カレントディレクトリが既にCVS管理下にある場合に用いる。カレントディレクトリがリポジトリ管理下にない場合はimportを使う。追加するファイル・ディレクトリは既に存在している必要がある。ファイルはその後、チェックイン操作を行うまでは実際にリポジトリに登録されないので注意。ディレクトリの場合はcvs addを実行するとCVSディレクトリが作成され、CVSの管理下に入る。cvs up で未登録ファイル一覧を吐き出させると楽。addの場合、ワイルドカードを使うとCVSIGNOREが効かないので注意。

 バイナリファイルを登録するときには-kbオプションを指定する。このオプションを指定しないとキーワード展開が起き、バイナリファイルが壊れることがあるので注意。

 なお、ディレクトリを追加する場合、リポジトリのあるマシンに直接アクセスできるなら、リポジトリ側に空ディレクトリを作ってチェックアウトや-d付きでupしてもよい。リポジトリのルートに何か追加する場合などはこの方が楽なことが多い。

●ファイルの削除
$ cvs remove 削除するファイル
 指定したファイルをリポジトリから削除する。削除するファイルはあらかじめ消しておく必要がある。ファイルはその後、チェックイン操作を行うまではリポジトリから削除されないので注意。実際にはリポジトリから削除されるのではなく、Atticというディレクトリに移動される。
●ディレクトリ構造のリポジトリへの登録
$ cvs -d リポジトリ import モジュール名 ユーザー名 start
 カレントディレクトリ以下のディレクトリ構造・ファイルをリポジトリに登録する。カレントディレクトリがCVS管理下にない場合、つまり、初めてモジュールを登録する場合に用いる。ユーザー名とstartはあまり重要ではない。このコマンドを実行しても、カレントディレクトリはCVS管理下にはならない。改めてチェックアウトを行う必要がある。
●ところで今どのリポジトリを使ってる? (27 Dec 2015)
 作業ディレクトリのCVS/Rootにリポジトリのルートが、CVS/Repositoryにそのリポジトリ内の位置がある。 CVS/Repositoryはフルパスになっている場合もあるので注意。
●ログ (04 Nov 2018)
$ cvs log ファイル名
 CVSのログはファイルごとに管理されているため、ログを見たいファイルを明示的に指定する必要がある。 全部のファイルのログをまとめてみたい場合はcvs2cl(CVS to ChangeLogの略)のようなツールに頼る必要がある。

home / uni / cvscmd タグ・ブランチ関係

●タグを付ける
$ cvs tag タグ名
 カレントディレクトリ以下のディレクトリ構造・ファイル全てにタグを付ける。
●どんなタグがある?
$ cvs log -h なるべく古いファイル
 コマンドの意味は「指定されたファイルのログを取得し、ヘッダ部分のみ表示する」という意味だが、ログのヘッダ部分にタグ一覧が入るため、これで目的が達成される。指定したファイルを追加した時点より後のタグしか表示されないため、全てのタグを表示したい場合は一番初期に追加したファイルを指定する必要がある。逆に、最近のタグだけを見たいならファイル名は適当でよい。

 なお、タグ名がタグなのかブランチなのかはレビジョンで判断する。1.3.0.6のように3つ目の数字が0になるのはブランチ名である。このブランチ上のレビジョンは1.3.6.12のようになり、ブランチ名についたレビジョンの4つ目の数字が、ファイルレビジョンの3つ目にくる。ブランチからブランチを生やすとさらに数字が2つ増えるが、見方は同じ。

●タグを指定して特定のバージョンを取得する
$ cvs -d リポジトリ co -d ディレクトリ -r タグ モジュール
 -rでタグを指定してチェックアウトすればよい。タグ名がブランチ名だった場合を除き、この方法で取得したファイルはチェックインできないことに注意。最新に戻すには cvs up -A を実行する。
((作業ディレクトリのルートに移ってから))
$ cvs up -r タグ

 こちらは作業ディレクトリの内容を指定したタグに切り替える。 作業ディレクトリのルートに移ってから実行しないと、ブランチが混ざった状態になるので注意。 よく分かっていないのなら別の場所にチェックアウトしてしまった方が安全。 (04 Nov 2018)

●差分を取る(パッチを作る)
$ cvs diff -u -r タグ [ファイル名] ...
$ cvs diff -u -r タグ1 -r タグ2 [ファイル名] ...
 一つ目は指定したタグと作業ディレクトリの内容を、二つ目は指定した二つのタグのファイルの内容を比較する。ファイル名を省略すればカレントディレクトリ以下全てのファイルの差分を取ってくれる。リダイレクトしてファイルにすれば、UnixやCygwinのpatchコマンドに渡すことができる(パッチファイル)。先方にちょっとした変更を適用してもらう場合に便利である。
●どのファイルを変更したんだろう?(2)
$ cvs -q diff -u -r タグ1 -r タグ2 | grep "^Index:"
 diff出力の各ファイルの先頭に、
Index: dir/filename.cpp
といった出力があることを利用した技。-qで不要なメッセージを抑制している。特定のバージョン間でどれくらいのファイルが変更されたかを調べる時に便利。
●ブランチを作る
$ cvs tag -b ブランチ名
$ cvs tag -b -r タグ名 ブランチ名
 前者はあらかじめブランチを切りたいバージョンを取得しておき、その作業ディレクトリで実行する。取得したバージョンを根とするブランチができる。後者は現在の作業ディレクトリの内容は関係ない。指定したタグの位置を根とするブランチができる。ブランチは後から任意の位置を根として作れる。このコマンドを実行したからといって作業ディレクトリがブランチに切り替わってしまうわけではないので注意。別の場所にブランチをチェックアウトしてから作業するのが確実。
●ブランチを取得する
$ cvs -d リポジトリ co -d ディレクトリ -r ブランチ モジュール
 タグ名がブランチ名になっただけ。どちらが指定されたかはCVSが自動的に判断してくれる。ブランチ名を指定すると、タグを指定した場合と異なり、1.そのブランチの最新版を取得する(ブランチの根が取得されるわけではない)、2.チェックインが可能な作業ディレクトリができる、という動作になる。

 タグと同様、cvs upで切り替えることもできる。 (04 Nov 2018)

●ブランチのログ (04 Nov 2018)
$ cvs log -rブランチ ファイル名
 -rとブランチ名の間にスペースを入れてはいけない点に注意。
●マージする
$ cvs up -j マージ開始タグ -j マージ終了タグ
 マージを適用したい作業ディレクトリで行う。タグは一つだけでもよく、その場合はマージ開始位置から開始タグのあるブランチの最新版までの差分が作業ディレクトリにマージされるが、マージ終了位置を明確にする意味でも、マージ元ブランチに一度タグを打ってから作業した方がよい。マージ終了位置は次のマージの時に必要になる(開始位置として指定することになる)。

 マージ結果は作業ディレクトリのみに反映される。どのようにマージされたかは cvs diff で分かる。コンフリクトするとファイル中にコンフリクトマーカーが現れるので、適切に修正し、動作に問題がなければ cvs ci でチェックインし、マージ結果をリポジトリに反映させる。

●ところで今どこのブランチにいる? (27 Dec 2015)
$ cvs stat 適当なファイル

 こんな表示が出る。

$ cvs stat index.htm
===================================================================
File: index.htm         Status: Up-to-date

   Working revision:    7.24.2.1
   Repository revision: 7.24.2.1        /usr/local/cvs/www/index.htm,v
   Sticky Tag:          tag_2015_oldsite (branch: 7.24.2)
   Sticky Date:         (none)
   Sticky Options:      (none)

 Sticky Tagにブランチ名が出ている。 何かファイルを指定しないとそのディレクトリにある全部のファイルのステータスを一気に表示するので注意。


Copyright (C) 2005-2018 akamoz.jp

$Id: cvs-cmd.htm,v 1.11 2018/11/06 03:19:24 you Exp $