SYNOPSIS

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

Usage:

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

DESCRIPTION

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

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

テストは、 CLI CVSクライアントと、 Eclipse CVSプラグインの両方を使用して行われました。 ほとんどの機能は、これらのクライアントの両方で正常に機能します。

OPTIONS

これらのオプションはすべて、サーバー側で適用された場合にのみ意味があります。 これらは、 git-daemon(1) オプションにできるだけ似るように実装されています。

--base-path <path>

要求された CVSROOT の前に「path」を追加します

--strict-paths

サブディレクトリへの再帰を許可しない

--export-all

構成で gitcvs.enabled をチェックしないでください。 このオプションを使用する場合は、許可されるディレクトリのリスト(list of allowed directories)(下記参照)も指定する必要があります。

-V
--version

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

-h
-H
--help

使用法を出力して終了(exit)します

<directory>

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

LIMITATIONS

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

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

INSTALLATION

  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

    デフォルトでは、匿名(anonymous)アクセスのみが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 など)を使用して、適切な場所に貼り付け(paste)します。

    次に、pserverメソッドを介してあなたのパスワードを入力します。以下に例を示します:

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

    PATHにGitツールを含める以外に、SSHアクセスに特別な設定は必要ありません。 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-shellcvsgit-cvsserver と理解して、相手側が本当の cvs より良いものを実行していると見せかけているからです。

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

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

    注意: git-cvsserver を呼び出す各ユーザーが、ログファイルとデータベースへの書き込みアクセス権を持っていることを確認する必要があります(Database Backend を参照してください)。SSH経由の書き込みアクセスを提供する場合は、 もちろん、ユーザーはGitリポジトリ自体への書き込みアクセス権も必要です。

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

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

       [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

DATABASE BACKEND

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

(git-cvsserver を使用するのではなく、)コミットが git を使用して直接行われる場合、アクセス方法や要求された操作に関係なく、 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サンドボックスを疑う必要があります。

以下の構成変数を使用してデータベースバックエンドを構成できます:

Configuring database backend

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 を設定する場合にのみ役立ちます。 変数置換(variable substitution)をサポートします(下記参照)。

gitcvs.dbPass

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

gitcvs.dbTableNamePrefix

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

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

Variable substitution

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

%G

Gitディレクトリ名

%g

Gitディレクトリ名。英数字 と .- を除くすべての文字が _ に置き換えられます(これにより、ディレクトリ名をファイル名として使用することが容易になります)。

%m

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

%a

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

%u

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

ENVIRONMENT

これらの変数により、状況によってはコマンドラインオプションが不要になり、git-shellを使用して使用を制限しやすくなります。

GIT_CVSSERVER_BASE_PATH

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

GIT_CVSSERVER_ROOT

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

これらの環境変数が設定されている場合、対応するコマンドライン引数は使用されない場合があります。

ECLIPSE CVS CLIENT NOTES

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

  1. メニューの "Create a new project → From CVS checkout"

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

  3. 利用可能な「モジュール」を参照します。 リポジトリ内のヘッドのリストが表示されます。 そこからツリーを閲覧することはできません。 表示されるのはヘッドだけです。

  4. チェックアウトする ブランチ/タグ を尋ねられたら、 HEAD を選択します。 .project ファイルのコミットを回避するには、「launch commit wizard」のチェックを外します。

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

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

動作が確認されているクライアント

  • CVS 1.12.9 on Debian

  • CVS 1.11.17 on MacOSX (from Fink package)

  • Eclipse 3.0, 3.1.2 on MacOSX (「Eclipse CVS Client Notes」参照)

  • TortoiseCVS

OPERATIONS SUPPORTED

checkout, diff, status, update, log, add, remove, commit を含む、通常の使用に必要なすべての操作がサポートされています。

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

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

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

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

CRLF Line Ending Conversions

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

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

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

cvsとの一貫性を最大限に保つには、 gitcvs.usecrlfattr をtrueに設定し、 gitcvs.allBinaryguess に設定して、デフォルトをオーバーライドするのがおそらく最善です。

DEPENDENCIES

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

GIT

Part of the git(1) suite