プログラミングユーティリティ

sccs サブコマンド

ファイルのチェックインおよびチェックアウト

以下のサブコマンドは、バージョンを取り出したり変更をチェックインする際に使用します。

編集用のファイルをチェックアウトする : sccs edit

ソースファイルを編集するには、まず sccs edit を使用してファイルをチェックアウトする必要があります (sccs edit コマンドは、sccs get-e オプションを使用する場合と同じ結果になります)。

SCCS は、取り出したバージョンのデルタ ID と、変更をチェックインしたときに割り当てられる新しいデルタ ID を返します。

$ sccs edit program.c
1.1
new delta 1.2
87

取り出したファイルは、テキストエディタを使用して編集できます。ファイルの書き込み可能なコピーがある場合は、sccs edit はエラーメッセージを表示します。つまり sccs edit は、他のユーザーにもファイルへの書き込み権がある場合は、そのファイルを上書きしません。

新しいバージョンをチェックインする : sccs delta

ファイルをチェックアウトして編集が完了したら、sccs delta を使用して変更をチェックインできます。

ファイルをチェックインすることを、デルタを作成するということもあります。更新をチェックインする前に、コメントを入力するプロンプトが表示されます。コメントとして、変更についての要約を記述します。

$ sccs delta program.c
comments?

コメントは、後でそのファイルを使用する時のために、わかりやすい内容にする必要があります。

バックスラッシュ (¥) と復帰改行を入力することによって、コメントを 2 行以上に渡って記述することができます。

$ sccs delta program.c
comments? corrected typo in widget(), ¥ 
null pointer in n_crunch()
1.2
5 inserted 
3 deleted
84 unchanged

SCCS は、新しいバージョンの SID と、挿入された行数、削除された行数、変更されていない行数を表示します。変更された行数は、削除された行と挿入された行の合計になります。SCCS は、作業用のコピーを削除します。sccs get を使用して、読み取り専用バージョンを取り出すことができます。

バージョンをチェックインする際には注意が必要です。少量の編集を行うたびにデルタを作成していくと、デルタが多くなりすぎる場合があります。逆に長期間ファイルをチェックアウトしたままにすると、他のユーザーがそのファイルを編集できないので不便になる場合があります。

一般に使用されるモジュールをコンパイルまたはインストールする前に、変更したすべてのファイルをチェックインしてください。手順は以下のとおりです。

バージョンを取り出す : sccs get

ファイルの最新バージョンを取得するには、以下のコマンドを使用します。

sccs get filename

以下に例を示します。

$ sccs get program.c
1.2
86

この例では、program.c を取り出し、バージョン番号および取り出された行数が表示されています。取り出された program.c のコピーは、読み取り専用になっています。

SCCS は、ファイルをチェックアウトしない限り新しいデルタを作成しないため、この取り出した読み取り専用のコピーは変更 (編集) しないでください。取り出した読み取り専用のコピーをそのまま強制的に変更すると、他のユーザーが次に sccs get または sccs edit をそのファイルに対して実行したときに、そのファイルに加えた変更が無効になる場合があります。

保留中の変更を確認する : sccs diffs

チェックアウトしたバージョンの変更で、まだチェックインされていないものを、保留中の変更と呼びます。ファイルの編集中に、sccs diffs を使用して保留中の変更を確認できます。diffs サブコマンドは、diff(1) を使用して、作業用 (編集中) のコピーとチェックインされた最新のバージョンとを比較します。

$ sccs diffs program.c
------ program.c ------ 
37c37 
<        if (((cmd_p - cmd) + 1) == l_lim) { 
--- 
>        if (((cmd_p - cmd) - 1) == l_lim) { 

diff コマンドのほとんどのオプションを使用することができます。diff-c オプションを呼び出すには、sccs diffs-C という引数を使用します。

保留中の変更を削除する : sccs unedit

sccs unedit は、保留中の変更を取り消します。これは、ファイルの編集を間違ってしまったときに編集を最初からやり直す場合に便利です。unedit は、チェックアウトしたバージョンを削除し、履歴ファイルのロックを解除し、チェックインされている最新のバージョン (最後にチェックインしたバージョン) の読み取り専用コピーを取り出します。unedit を使用すると、ファイルをチェックアウトしなかったのと同じ状態になります。編集を再開するには、sccs edit を使用してファイルをもう一度チェックアウトします (「書き込み可能なコピーを修復する : sccs get -k -Gも参照してください)。

deltaget を組み合わせて実行する : sccs delget

sccs delget は、delta および get の動作を組み合わせて一度に実行します。sccs delget は、変更をチェックインし、 チェックインした新しいバージョンの読み取り専用コピーを取り出します。ただし、SCCSdelta の実行中にエラーが発生した場合は、get は実行されません。ファイル名のリストを (複数のファイルを一度に) 処理する際は、delget は可能なすべての delta を実行し、delta でエラーが発生した場合は、すべての get の処理を実行しません。

deltaedit を組み合わせて実行する : sccs deledit

sccs deledit は、delta を実行した後に edit を実行します。バージョンをチェックインした後、すぐに編集を再開することができます。

SID を指定してバージョンを取り出す : sccs get -r

-r オプションを使用すると、取り出す SID を指定できます。

$ sccs get -r1.1 program.c
1.1
87 

日時を指定してバージョンを取り出す : sccs get -c

必要なデルタの SID は不明でも、チェックインした日付ならわかるという場合があります。以下の形式で -c オプションと日時を指定して、その日時以前にチェックインされた最新のバージョンを取り出すことができます。

-cyy [mm [dd [hh [mm [ss ]]]]]

以下に例を示します。

$ sccs get -c880722120000 program.c
1.2
86

この例は、1988 年 7 月 22 日午後 12 時の時点で最新のバージョンを取り出します。年以外のフィールドは省略できます (デフォルトでは現在になります)。また、指定された箇所に区切りとして句切り文字を挿入できます。前述のコマンドは、以下のように書き換えることができます。

sccs get -c"88/07/22 12:00:00" program.c

注 -

2000 年問題について : SCCS は日付を表わす書式として 2 けたで年を表します。Sun は、年として 69 〜 99 の値が指定されている場合は 1969 〜 1999、00 〜 68 の場合は 2000 〜 2068 にそれぞれ解釈するという、X/Open グループにより提案された仕様 (XCU5) を採用しています。


書き込み可能なコピーを修復する : sccs get -k -G

sccs get -k -Gfilename は、新しいバージョンをチェックアウトせずに、テキストの書き込み可能なコピーを取り出し、-G で指定されたファイル名で保存します。このコマンドは、diff コマンドとテキストエディタを使用して、損傷した作業中のコピーを置き換えたりまたは修復したりする際に便利です。

ID キーワードを使用してバージョン固有情報を組み込む

前述のように、SCCS では、ID キーワード (SID) を使用して、チェックインするバージョンにバージョン固有の情報を組み込むことができます。ID キーワード (ファイル中に挿入します) は、変更をチェックインする際にそのバージョンに対応する情報に自動的に置換されます。SCCS ID キーワードは、以下のような形式になります。

%C%

ここで、C は大文字の一文字を表わしています。

たとえば、%I% は、最新デルタの SID に展開されます。%W% は、ファイル名、SID、一意の文字列 @(#) をファイルに取り込みます。この文字列 @(#) は、what コマンドによりテキストファイルと バイナリファイルの両方で検索されます。これによって、ファイルまたはプログラムがどのバージョンのソースから構築されたかを確認することができます。%G% キーワードは、最新のデルタの日付に展開されます。その他の ID キーワードとそれらが展開されたときの文字列については、表 5-1 を参照してください。


注 -

この方法で文字列を定義すると、C のオブジェクトファイルにバージョン情報が組み込まれます。この方法を使用して ID キーワードをヘッダー (.h) ファイルに組み込む場合は、ヘッダーファイルごとに異なる変数を使用してください。これにより、静的 (static) 変数を再定義しようとするエラーを防止できます。


バージョン固有の情報を C プログラムに取り込むには、以下のようにします。

static char SccsId[ ] = "%W%¥t%G%";

ファイル名が program.c の場合、この行はバージョン 1.2 が取り出されたときに以下のように展開されます。

static char SccsId[ ] = "@(#)program.c 1.2 08/29/80";

コンパイルされたプログラムで文字列が定義されているため、この方法によりコンパイルしたプログラムにソースファイルの情報を組み込むことができます。ソースファイルの情報は、以下のように what コマンドで確認することができます。

$ cd /usr/ucb
$ what sccs 
sccs
sccs.c 1.13 88/02/08 SMI

シェルスクリプトなどのスクリプトでは、ID キーワードをコメント内に含めることができます。

# %W%  %G% 
.  .  .

展開されたキーワードを含むバージョンをチェックインすると、バージョン固有の情報が更新されなくなります。これを通知するために、geteditcreate 実行時に ID キーワードを検出できないときには、以下のように SCCS は警告を表示します。

No Id Keywords (cm7)

さまざまな情報の確認

以下のサブコマンドは、ファイルまたはその履歴を問い合わせる際に便利です。

取り出されたバージョンを確認する : what コマンド

SCCS を使用することによって、ファイル履歴中の任意のバージョンを取り出すことができるため、ディレクトリ内にある作業中のコピーが必要なバージョンでないという可能性もあります。what コマンドは、ファイル中の SCCS ID キーワードを検査します。また、バイナリファイルでもキーワードを検査するため、どのバージョンのソースからプログラムがコンパイルされたかを確認できます。

$ what program.c program 
program.c:
      program.c 1.1 88/07/05 SMI; 
program: 
      program.c 1.1 88/07/05 SMI;

この例では、ファイルにはバージョン 1.1 の作業用のコピーが含まれています。

最新バージョンを確認する : sccs get -g

sccs get -g を使用すると、最新のデルタの SID を確認できます。

$ sccs get -g program.c
1.2

この例では、最新のデルタは 1.2 です。このバージョンは、前述の what の例でのバージョン 1.1 よりも新しいため、get を使用して最新のバージョンを取り出します。

ファイルをチェックアウトしたユーザーを確認する : sccs info

どのファイルが編集中であるかを確認するには、以下のように入力します。

$ sccs info

このサブコマンドは、編集中のすべてのファイルと、ファイルをチェックアウトしたユーザー名などの情報を表示します。同様に、以下のコマンドを使用できます。

$ sccs check

このコマンドは、編集されているファイルがある場合に、警告を出力せずにゼロ以外の終了ステータスを返します。このコマンドを makefile で使用して、ソースファイルがチェックアウトされている場合に make(1S) を強制的に停止することができます。

チェックアウトしたすべてのファイルをチェックインする場合は、以下のコマンドを使用できます。

$ sccs delta 'sccs tell -u'

tell は、編集中のファイルの名前だけを 1 行に 1 つずつ表示します。-u オプションを使用すると、tell を実行したユーザーがチェックアウトしたファイルの名前だけを出力します。-u の引数としてユーザー名を指定すると、そのユーザーがチェックアウトしたファイルの名前だけを出力します。

デルタのコメントを表示する : sccs prt

sccs prt は、SID、作成日時、各バージョンをチェックインしたユーザー名、挿入/削除/変更なしの行数、コメントが記録されているバージョンログ (デルタテーブルとも呼びます) のリストを出力します。

$ sccs prt program.c
D 1.2  80/08/29 12:35:31      pers  2 1 00005/00003/00084 
corrected typo in widget(), 
null pointer in n_crunch()

D 1.1  79/02/05 00:19:31      zeno  1 0 00087/00000/00000 
date and time created 80/06/10 00:19:31 by zeno

最新バージョンのコメントだけを表示するには、-y オプションを使用します。

デルタのコメントを追加する : sccs cdc

コメントに大切な情報を記述し忘れたなどの場合に、以下のコマンドを使用して、コメントに情報を追加できます。

sccs cdc -r sid

このコマンドを実行するには、最新のデルタ (または分岐中で最新のデルタ、「分岐」を参照) を指定する必要があります。また、そのデルタをチェックインしたユーザーであるか、履歴ファイルおよび SCCS サブディレクトリの両方に書き込み権を持つ所有ユーザーである必要があります。cdc は、コメントを入力するためのプロンプトを表示し、そこで入力された情報をコメントに追加します。

$ sccs cdc -r1.2 program.c
comments? also taught get_in() to handle control chars

prt を使用して新しいコメントを表示すると、以下のようになります。

$ sccs prt program.c
D 1.2  80/08/29 12:35:31       pers  2 1 00005/00003/00084
also taught get_in() to handle control chars 
*** CHANGED *** 88/08/02 14:54:45 pers
corrected typo in widget(),
null pointer in n_crunch()

D 1.1  79/02/05 00:19:31       zeno  1 0 00087/00000/00000 
date and time created 80/06/10 00:19:31 by zeno 

チェックインしたバージョンを比較する : sccs sccsdiff

チェックインした 2 つのバージョン、たとえば 1.1 と 1.2 の 2 つのデルタを比較するには、以下のコマンドを使用して、両者の違いを確認します。

$ sccs sccsdiff -r1.1 -r1.2 program.c

全履歴を表示する : sccs get -m -p

ファイルの変更内容および変更を行なったデルタをすべて表示するには、-m-p のオプションを使用します。

$ sccs get -m -p program.c
1.2 
1.2 #define L_LEN 256 
1.1
1.1 #include <stdio.h>
1.1
.  .  .  
84

特定のデルタに対応する行を抽出するため、出力を grep(1V) にパイプすることができます。

$ sccs get -m -p program.c | grep '^1.2'

-p だけを使用すると、取り出したバージョンの中身を (ファイルではなく) 標準出力に送ることができます。

レポートを作成する : sccs prs -d

prs サブコマンドと -d dataspec オプションを使用すると、SCCS が管理するファイルに関する情報を取り出し、それをレポートとして表示することができます。dataspec 引数には、履歴ファイルの一部分に対応するデータキーワードのセットを指定します。データキーワードは、以下の書式で指定します。

:X :

表 5-3 にデータキーワードのリストを示しています。引数 dataspec では、データキーワードを任意の回数使用できます。有効な dataspec は、テキストおよびデータキーワードで構成される文字列を二重引用符で囲んだものです。prs は、認識した各キーワードを履歴ファイルの適切な値に置換します。

データキーワードの値の形式は、1 行または複数行のいずれかです。前者の場合は、展開された値は単純な文字列になります。後者の場合は、展開された値に復帰改行が含まれます。

タブ¥t で、復帰改行¥n でそれぞれ指定します。

以下に例を示します。

$ sccs prs -d"Users and/or user IDs for :F: are:¥n:UN:" program.c 
Users and/or user IDs for s.program.c are:
zeno
pers
$ sccs prs -d"Newest delta for :M:: :I:.  Created :D: by :P:." -r program.c 
Newest delta for program.c: 1.3.  Created 88/07/22 by zeno.

確定した変更を削除する

デルタを置き換える : sccs fix

入力ミスなどの、修正する必要はあるけれども修正したファイルを新たなデルタとして追加する必要はない、というような小さなバグを含むデルタをチェックインしてしまうことがあります。または、ファイルの内容は正しいけれど、デルタのコメントが不完全であるあるいは誤っている場合があります。いずれの場合も、sccs fix を使用してファイルに対して変更を行い、最新のデルタに対応するバージョンログのエントリを置き換えることができます。

$ sccs fix -r 1.2 program.c

このコマンドは、program.c のバージョン 1.2 をチェックアウトします。修正後にこのファイルをチェックインすると、履歴ファイル中のデルタ 1.2 がファイルに加えた変更に置き換えられ、(新しい) コメントを入力するプロンプトが表示されます。sccs fix を使用するときには、-r オプションを使用して末端の (最新の) デルタの SID を指定する必要があります。

以前にチェックインしたデルタ 1.2 は実質的には削除されますが、SCCS はそれを削除されたデルタとして履歴ファイル中で記録します。

sccs fix を使用する前に、現在のバージョンのコピーを作成しておいてください。

デルタを削除する : sccs rmdel

最新のデルタを完全に削除するには、rmdel サブコマンドを使用します。-r を使用して SID を指定する必要があります。fix は削除されたデルタの記録を保持していますが rmdel は保持しないので (詳細は、sccs rmdel(1) を参照してください)、通常は rmdel よりも fix を使用することをお勧めします。

以前のバージョンに戻す

以前のバージョンの書き込み可能なコピーを取り出すには、get -k を使用します。このコマンドは、過去の複数のデルタを調べる必要がある場合に便利です。

以前のバージョンのデルタを使用して新しいデルタを作成するには、以下の手順に従います。

  1. sccs edit を使用して ファイルをチェックアウトします。

  2. get -k を使用して、以前のバージョンの書き込み可能なコピーを取り出します。

    sccs get -k -r sid -Goldname filename
    

    oldname にはファイル名、filename には取り出した以前のバージョンを一時に保存するファイルの名前 (元のファイル名 oldname とは異なる名前) を指定します。

  3. 現在のバージョンを以前のバージョンに置き換えます。

    mv oldname filename

  4. ファイルをチェックインします。

    特定のデルタを削除した方が簡単な場合があります。また、SCCS を使用してファイルの複数の更新を管理する方法については、「分岐」を参照してください。

取り出したバージョンからデルタを削除する

デルタ 1.3 で行なった変更が、次のバージョンである 1.4 には適切でないとします。編集用のファイルを取り出す際に、-x オプションを使用して、作業用のコピーからデルタ 1.3 を削除することができます。

$ sccs edit -x1.3 program.c

デルタ 1.5 をチェックインする際には、そのデルタにはデルタ 1.4 での変更が含まれますが、デルタ 1.3 での変更は含まれません。さらに、削除するデルタをコンマで区切ったリストを -x に指定したり、あるいはハイフンで削除するデルタの範囲を指定して、複数のデルタを削除することができます。たとえば、1.3 と 1.4 を削除する場合は、以下のコマンドを使用できます。

$ sccs edit -x1.3,1.4 program.c
$ sccs edit -x1.3-1.4 program.c

次の例では、SCCS は 1.3 からリリース 1 において現時点で最新のデルタまでを削除します。

$ sccs edit -x 1.3-1 program.c

-x を使用する場合は、バージョン間で衝突が生じることがあります。たとえば、特定の行について挿入と削除の両方が指定されている場合があります。この場合は、SCCS は影響のある行の範囲を示すメッセージを表示します。このメッセージを十分に確認して、SCCS が取り出したバージョンが正しいかどうかを確認してください。

各デルタは、(「変更のセット」として) 削除できるため、関連する変更を各デルタごとにまとめると便利です。

バージョンを結合する : sccs comb

comb サブコマンドは、選択したデルタを結合または削除して新しい履歴ファイルを構成する Bourne シェルスクリプトを生成します。comb サブコマンドは、ディスク容量を節約したい場合に便利です。


注 -

複数のデルタを結合する際には、comb で生成したスクリプトは、ファイルのバージョンログ (コメントを含む) の一部を削除します。


-psid オプションでは、スクリプト実行後の再構成で保存する最も古いデルタを指定します。

-c sid-list

このオプションを使用して、含めるデルタのリストを指定できます。sid-list には、各デルタをコンマで区切ったリストを指定します。2 つの SID をハイフン (-) で区切って、範囲を指定することができます。-p-c を同時に使用することはできません。-o オプションは、再構成に含めるデルタの個数を最小限にします。

-s オプションは、再構成後の履歴と元の履歴のサイズ (ブロック数) を比較するスクリプトを生成します。比較結果では、再構成後の履歴が元の履歴の何パーセントであるかが表示されます。


注 -

comb を使用する際は、元の履歴ファイルを保存してください。comb はディスク容量を節約するためのコマンドですが、節約されない場合もあります。場合によっては、生成された履歴ファイルが元の履歴ファイルよりも大きくなります。


オプションが指定されていない場合は、comb はそれまでの変更を保持するために必要な最小限の祖先を保存します。