英語 ▾ トピック ▾ 最新バージョン ▾ git-cvsserver は 2.44.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 アクセスには特別なセットアップは必要ありません。PATH に Git ツールがあるだけで十分です。CVS_SERVER 環境変数を受け入れないクライアントがある場合は、*git-cvsserver* を cvs に名前変更できます。

    注意: 新しい 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-shell* は cvs を *git-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. クライアントはプロジェクトをチェックアウトできるようになります。CVS の *モジュール* 名を使用して、どの Git の *ヘッド* をチェックアウトしたいかを示します。これは、-d <dir-name> で別に指定しない限り、新しくチェックアウトされたディレクトリの名前も設定します。例えば、これは *master* ブランチを project-master ディレクトリにチェックアウトします。

       cvs co -d project-master master

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

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

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

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

デフォルトでは、Git ディレクトリ内の gitcvs.<module-name>.sqlite という名前の 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. 利用可能な *モジュール* を参照します。リポジトリ内のヘッドのリストが表示されます。そこからツリーを参照することはできません。ヘッドのみです。

  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 クライアントに関する注意を参照)

  • TortoiseCVS

サポートされる操作

チェックアウト、差分、ステータス、更新、ログ、追加、削除、コミットなど、通常の利用に必要なすべての操作がサポートされています。

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

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

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

従来の監視操作 (編集、ウォッチ、関連するもの) はサポートされていません。エクスポートとタグ付け (タグとブランチ) はこの段階ではサポートされていません。

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