日本語 ▾ トピック ▾ 最新バージョン ▾ git-cvsserver は 2.50.0 で最終更新

名前

git-cvsserver - Git 用の CVS サーバーエミュレータ

概要

SSH

export CVS_SERVER="git cvsserver"
cvs -d :ext:user@server/path/repo.git co <HEAD_name>

pserver (/etc/inetd.conf)

cvspserver stream tcp nowait nobody /usr/bin/git-cvsserver git-cvsserver pserver

使用方法

git-cvsserver [<options>] [pserver|server] [<directory> …​]

説明

このアプリケーションは、Git 用の CVS エミュレーションレイヤーです。

非常に高機能です。ただし、すべてのメソッドが実装されているわけではなく、実装されているメソッドについてもすべてのスイッチが実装されているわけではありません。

CLI CVS クライアントと Eclipse CVS プラグインの両方を使用してテストが行​​われました。ほとんどの機能は、これらの両方のクライアントで問題なく動作します。

オプション

これらのオプションはすべて、サーバー側で強制された場合にのみ意味を持ちます。これらはgit-daemon[1]のオプションになるべく似るように実装されています。

--base-path <path>

要求された CVSROOT に path をプレフィックスとして追加します。

--strict-paths

サブディレクトリへの再帰を許可しません。

--export-all

設定内の gitcvs.enabled をチェックしません。このオプションを使用したい場合は、許可するディレクトリのリスト (下記参照) を指定する必要もあります。

-V
--version

バージョン情報を出力して終了します。

-h
-H
--help

使用方法の情報を出力して終了します。

<directory>

残りの引数はディレクトリのリストを提供します。ディレクトリが指定されていない場合、すべてが許可されます。これらのディレクトリ内のリポジトリは、--export-all が指定されていない限り、引き続き gitcvs.enabled 設定オプションが必要です。

制限事項

CVS クライアントは、タグ付け、ブランチ、または Git マージを実行できません。

git-cvsserver は Git ブランチを CVS モジュールにマッピングします。これは、CVS モジュールが通常は1つ以上のディレクトリを表すため、ほとんどの CVS ユーザーが期待するものとは大きく異なります。

インストール

  1. pserver 経由で CVS アクセスを提供する場合、/etc/inetd.conf に次のような行を追加します。

       cvspserver stream tcp nowait nobody git-cvsserver pserver

    注意: 一部の inetd サーバーでは、実行可能ファイルの名前を argv[0] の値 (つまり、プログラムが実行されたと想定する名前) とは独立して指定できます。この場合、/etc/inetd.conf の正しい行は次のようになります。

       cvspserver stream tcp nowait nobody /usr/bin/git-cvsserver git-cvsserver pserver

    pserver はデフォルトでは匿名アクセスのみを提供します。コミットするには pserver アカウントを作成する必要があります。cvsserver に書き込みを許可したいリポジトリの設定ファイルに gitcvs.authdb 設定を追加するだけです。たとえば、次のようになります。

       [gitcvs]
    	authdb = /etc/cvsserver/passwd

    これらのファイルの形式は、ユーザー名の後に暗号化されたパスワードが続くものです。たとえば、次のようになります。

       myuser:sqkNi8zPf01HI
       myuser:$1$9K7FzU28$VfF6EoPYCJEYcVQwATgOP/
       myuser:$5$.NqmNH1vwfzGpV8B$znZIcumu1tNLATgV2l6e1/mY8RzhUDHMOaVOeL1cxV3

    これらのファイルを作成するには Apache に付属している htpasswd 機能を使用できますが、-d オプション (またはシステムがサポートしている場合は -B) のみを使用できます。

    パスワードハッシュの作成を管理するプラットフォーム固有のユーティリティ (例: Linux の mkpasswd、OpenBSD の encrypt、NetBSD の pwhash) を使用し、正しい場所に貼り付けることを推奨します。

    次に、pserver メソッドを介してパスワードを提供します。たとえば、次のようになります。

       cvs -d:pserver:someuser:somepassword@server:/path/repo.git co <HEAD_name>

    SSH アクセスには、Git ツールが PATH に含まれていること以外に特別な設定は必要ありません。CVS_SERVER 環境変数を受け入れないクライアントがある場合、git-cvsservercvs に名前変更できます。

    注意: 新しい CVS バージョン (>= 1.12.11) は、CVSROOT に直接 CVS_SERVER を指定することもサポートしています。例は次のとおりです。

       cvs -d ":ext;CVS_SERVER=git cvsserver:user@server/path/repo.git" co <HEAD_name>

    これにより、CVS/Root ファイルに保存され、常に正しい環境変数を設定することを心配する必要がなくなります。git-shell に制限された SSH ユーザーは、CVS_SERVER でデフォルトをオーバーライドする必要はありません (すべきではありません)。git-shellcvsgit-cvsserver を意味すると理解し、相手側が実際の cvs をよりうまく実行していると見せかけます。

  2. CVS からアクセスできるようにしたい各リポジトリについて、リポジトリの設定を編集し、以下のセクションを追加する必要があります。

       [gitcvs]
            enabled=1
            # optional for debugging
    	logFile=/path/to/logfile

    注: git-cvsserver を呼び出す各ユーザーがログファイルとデータベースに書き込みアクセスできることを確認する必要があります (「データベースバックエンド」を参照)。SSH 経由で書き込みアクセスを提供したい場合、ユーザーはもちろん Git リポジトリ自体にも書き込みアクセスが必要です。

    cvs commit が動作するためには、各リポジトリが「bare」(Git インデックスファイルなし) であることを確認する必要もあります。gitcvs-migration[7]を参照してください。

    すべての構成変数は、特定アクセス方法ごとにオーバーライドすることもできます。有効なメソッド名は「ext」(SSH アクセス用)と「pserver」です。次の構成例は、pserver アクセスを無効にしながら、SSH 経由でのアクセスは引き続き許可します。

       [gitcvs]
            enabled=0
    
       [gitcvs "ext"]
            enabled=1
  3. CVSROOT/CVS_SERVER をチェックアウトコマンドで直接指定せず、CVS/Root ファイルに自動的に保存しない場合は、環境変数で明示的に設定する必要があります。CVSROOT は通常通り設定する必要がありますが、ディレクトリは適切な Git リポジトリを指すようにする必要があります。上記と同様に、git-shell に制限されて*いない* SSH クライアントの場合、CVS_SERVER は git-cvsserver に設定する必要があります。

       export CVSROOT=:ext:user@server:/var/git/project.git
       export CVS_SERVER="git cvsserver"
  4. コミットを行うSSHクライアントの場合、サーバー側の.ssh/environmentファイル(または特定のシェルに応じて.bashrcなど)が、GIT_AUTHOR_NAME、GIT_AUTHOR_EMAIL、GIT_COMMITTER_NAME、およびGIT_COMMITTER_EMAILに適切な値をエクスポートしていることを確認してください。ログインシェルがbashであるSSHクライアントの場合、.bashrcが合理的な代替手段になるかもしれません。

  5. クライアントはこれでプロジェクトをチェックアウトできるはずです。チェックアウトしたい Git head を示すために CVS の module 名を使用します。-d <dir-name> で別の名前を指定しない限り、これは新しくチェックアウトされたディレクトリの名前も設定します。たとえば、これは master ブランチを project-master ディレクトリにチェックアウトします。

       cvs co -d project-master master

データベースバックエンド

git-cvsserver は、一貫した CVS リビジョン番号を維持するために、リポジトリに関する情報を保存するために Git head (つまり CVS モジュール) ごとに 1 つのデータベースを使用します。データベースは、コミット後 (つまり、書き込み後) に毎回更新される必要があります。

コミットが (git-cvsserver を使用するのではなく) git を直接使用して行われた場合、更新は、アクセス方法と要求された操作に関係なく、git-cvsserver による次のリポジトリアクセス時に行われる必要があります。

つまり、読み取り専用アクセス (例: pserver メソッドを使用) を提供する場合でも、git-cvsserver はデータベースに書き込みアクセスできる必要があり、信頼性高く動作します (そうしないと、git-cvsserver が実行されるたびにデータベースが最新であることを確認する必要があります)。

デフォルトでは、Git ディレクトリ内の SQLite データベースを使用し、ファイル名は gitcvs.<module-name>.sqlite です。SQLite バックエンドは書き込み時にデータベースファイルと同じディレクトリに一時ファイルを作成するため、git-cvsserver を使用するユーザーにデータベースファイルへの書き込みアクセス権を与えるだけでは、ディレクトリへの書き込みアクセス権も与えない限り、十分ではない場合があることに注意してください。

追跡しているブランチが変更された後では、データベースを整合性のある形式で確実に再生成することはできません。例: マージされたブランチの場合、git-cvsserver は開発の 1 つのブランチのみを追跡し、git merge 後に増分的に更新されたデータベースは、ゼロから再生成されたデータベースとは異なるブランチを追跡する可能性があり、CVS リビジョン番号の不整合を引き起こします。git-cvsserver は、マージ前に増分的に実行されていた場合にどのブランチを選択したかを知る方法がありません。したがって、データベースを完全にまたは部分的に (古いバックアップから) 再生成する必要がある場合は、既存の CVS サンドボックスに注意する必要があります。

以下の設定変数でデータベースバックエンドを設定できます。

データベースバックエンドの設定

git-cvsserver は Perl DBI モジュールを使用します。これらの変数を変更する場合は、特に DBI->connect() についてそのドキュメントも読んでください。

gitcvs.dbName

データベース名。正確な意味は、選択されたデータベースドライバに依存し、SQLite の場合はファイル名です。変数置換をサポートします (下記参照)。セミコロン (;) を含めることはできません。デフォルト: %Ggitcvs.%m.sqlite

gitcvs.dbDriver

使用される DBI ドライバー。利用可能な任意のドライバーを指定できますが、動作しない可能性があります。cvsserver は DBD::SQLite でテストされ、DBD::Pg で動作することが報告されており、DBD::mysql では動作しないことが報告されています。これを実験的な機能とみなしてください。コロン (:) を含めることはできません。デフォルト: SQLite

gitcvs.dbuser

データベースユーザー。SQLite にはデータベースユーザーの概念がないため、dbDriver を設定する場合にのみ役立ちます。変数置換をサポートします (下記参照)。

gitcvs.dbPass

データベースパスワード。SQLite にはデータベースパスワードの概念がないため、dbDriver を設定する場合にのみ役立ちます。

gitcvs.dbTableNamePrefix

データベーステーブル名のプレフィックス。変数置換をサポートします (下記参照)。アルファベット以外の文字はすべてアンダースコアに置き換えられます。

すべての変数は、アクセス方法ごとに設定することもできます。上記を参照してください。

変数置換

dbDriverdbUser では、以下の変数を使用できます。

%G

Git ディレクトリ名

%g

Git ディレクトリ名。英数字、.、および - を除くすべての文字が _ に置き換えられます (これにより、必要に応じてディレクトリ名をファイル名で使いやすくなります)。

%m

CVS モジュール/Git ヘッド名

%a

アクセス方法 (「ext」または「pserver」のいずれか)

%u

git-cvsserver を実行しているユーザーの名前。名前が決定できない場合、数値の uid が使用されます。

環境変数

これらの変数により、特定の状況でコマンドラインオプションが不要になり、git-shell を介した制限付き使用が容易になります。

GIT_CVSSERVER_BASE_PATH

この変数は --base-path の引数を置き換えます。

GIT_CVSSERVER_ROOT

この変数は単一のディレクトリを指定し、<directory>... 引数リストを置き換えます。--export-all が指定されていない限り、リポジトリには引き続き gitcvs.enabled 設定オプションが必要です。

これらの環境変数が設定されている場合、対応するコマンドライン引数を使用することはできません。

Eclipse CVS クライアントに関する注意

Eclipse CVS クライアントでチェックアウトするには

  1. 「新規プロジェクト → CVS からのチェックアウト」を選択します。

  2. 新しい場所を作成します。適切なプロトコルの選択方法の詳細については、以下の注を参照してください。

  3. 利用可能な modules を参照します。リポジトリ内のヘッドのリストが表示されます。そこからツリーを参照することはできません。ヘッドのみです。

  4. チェックアウトするブランチ/タグを尋ねられたら HEAD を選択します。「コミットウィザードを起動」のチェックを外して、.project ファイルのコミットを回避します。

プロトコルに関する注意: pserver 経由で匿名アクセスを使用している場合は、それを選択するだけです。SSH アクセスを使用している場合は ext プロトコルを選択し、Preferences→Team→CVS→ExtConnection ペインで ext アクセスを設定します。CVS_SERVER を「git cvsserver」に設定します。ext を使用している場合、パスワードのサポートは良くありませんので、SSH キーの設定を強くお勧めします。

または、Eclipse が提供する非標準の extssh プロトコルを使用することもできます。その場合、CVS_SERVER は無視され、サーバー上の cvs ユーティリティを git-cvsserver に置き換えるか、または .bashrc を操作して、cvs の呼び出しが実質的に git-cvsserver を呼び出すようにする必要があります。

動作確認済みクライアント

  • Debian の CVS 1.12.9

  • MacOSX の CVS 1.11.17 (Fink パッケージから)

  • MacOSX の Eclipse 3.0, 3.1.2 (Eclipse CVS Client Notes を参照)

  • TortoiseCVS

サポートされる操作

チェックアウト、diff、status、update、log、add、remove、commit など、通常の用途に必要なすべての操作がサポートされています。

CVS タグまたはリビジョン番号を読み取るほとんどの CVS コマンド引数 (通常は -r) は機能し、任意の git refspec (タグ、ブランチ、コミット ID など) もサポートします。ただし、デフォルト以外のブランチの CVS リビジョン番号はうまくエミュレートされず、cvs log はタグやブランチをまったく表示しません。(メインブランチ以外の CVS リビジョン番号は superficially CVS リビジョン番号に似ていますが、実際にはブランチポイントからのリビジョン数を表すのではなく、git コミット ID を直接エンコードしています。)

特定のブランチをチェックアウトする方法は2つあることに注意してください。このページの他の場所で説明されているように、cvs checkout の「module」パラメータはブランチ名として解釈され、メインブランチになります。たとえ cvs update -r で一時的に別のブランチを固定しても、特定のサンドボックスではメインブランチのままです。あるいは、-r 引数は、モジュールが依然として「メイン」ブランチであるにもかかわらず、実際にチェックアウトする別のブランチを示すことができます。トレードオフ (現在の実装): 新しい「モジュール」ごとに、指定されたモジュールの履歴を持つ新しいデータベースがディスク上に作成され、データベースが作成された後、そのメインブランチに対する操作は高速です。または、-r は追加のディスクスペースを占有しませんが、cvs update のような多くの操作では著しく遅くなる可能性があります。

CVS で許可されていない文字を持つ Git refspec を参照したい場合、2つの選択肢があります。まず、Git refspec を適切な CVS -r 引数に直接指定するだけでうまくいく場合があります。一部の CVS クライアントは、引数の健全性チェックをあまり行わないようです。2番目に、それが失敗した場合、CVS タグで有効な文字のみを使用する特殊文字エスケープメカニズムを使用できます。4文字または5文字のシーケンスで (アンダースコア ("_")、ダッシュ ("-")、1文字または2文字、そしてダッシュ ("-")) の形式で、1文字または2文字に基づいて様々な文字をエンコードできます。"s" はスラッシュ ("/")、"p" はピリオド (".")、"u" はアンダースコア ("_")、または任意のバイト値 (通常は ASCII 番号、または UTF-8 エンコード文字の一部) のための2桁の16進数です。

レガシーモニタリング操作はサポートされていません (edit、watch および関連)。エクスポートとタグ付け (タグとブランチ) はこの段階ではサポートされていません。

CRLF 改行コード変換

デフォルトでは、サーバーはすべてのファイルに対して -k モードを空白のままにします。これにより、CVS クライアントはファイルをテキストファイルとして扱い、一部のプラットフォームでは改行コード変換の対象となります。

gitcvs.usecrlfattr 設定変数を設定することで、サーバーが改行コード変換属性を使用してファイルの -k モードを設定するようにできます。改行コード変換の詳細については、gitattributes[5]を参照してください。

あるいは、gitcvs.usecrlfattr 設定が有効になっていないか、属性がファイル名の自動検出を許可しない場合、サーバーはデフォルト設定に gitcvs.allBinary 設定を使用します。gitcvs.allBinary が設定されている場合、特に指定されていないファイルはデフォルトで -kb モードになります。それ以外の場合、-k モードは空白のままになります。しかし、gitcvs.allBinary が「guess」に設定されている場合、正しい -k モードはファイルの内容に基づいて推測されます。

cvs との最高の整合性を保つには、gitcvs.usecrlfattr を true に、gitcvs.allBinary を「guess」に設定して、デフォルトをオーバーライドするのがおそらく最善です。

依存関係

git-cvsserver は DBD::SQLite に依存します。

GIT

git[1]スイートの一部

scroll-to-top