Git
日本語 ▾ トピック ▾ 最新バージョン ▾ 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 <パス>

リクエストされた CVSROOT に *パス* を追加します

--strict-paths

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

--export-all

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

-V
--version

バージョン情報を表示して終了します

-h
-H
--help

使用方法を表示して終了します

<ディレクトリ>

残りの引数は、ディレクトリのリストを提供します。ディレクトリが指定されていない場合は、すべてが許可されます。 これらのディレクトリ内のリポジトリは、`--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-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 ユーザーは、*git-shell* が `cvs` を *git-cvsserver* を意味すると理解し、相手側が実際の *cvs* をより適切に実行していると見せかけるため、CVS_SERVER でデフォルトをオーバーライドする必要はありません (また、オーバーライドすべきではありません)。

  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" です。次の設定例では、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 <ディレクトリ名>` で別の指示をしない限り、これにより新しくチェックアウトされたディレクトリの名前も設定されます。たとえば、これは *master* ブランチを `project-master` ディレクトリにチェックアウトします

       cvs co -d project-master master

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

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

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

つまり、読み取りアクセスのみを提供する場合 (pserver メソッドを使用するなど) でも、*git-cvsserver* はデータベースに書き込みアクセスできる必要があります (そうでない場合は、*git-cvsserver* が実行されるたびにデータベースが最新であることを確認する必要があります).

デフォルトでは、Git ディレクトリに `gitcvs.<モジュール名>.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* プロトコルを選択し、設定 → チーム → 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 refspec(タグ、ブランチ、コミット ID など)もサポートします。ただし、デフォルト以外のブランチの CVS リビジョン番号はうまくエミュレートされず、cvs ログにはタグやブランチがまったく表示されません。(メインブランチ以外の CVS リビジョン番号は、表面上は CVS リビジョン番号に似ていますが、実際にはブランチポイントからのリビジョン数を表すのではなく、git コミット ID を直接エンコードしています。)

特定のブランチをチェックアウトするには、2 つの方法があることに注意してください。このページの elsewhere で説明されているように、cvs チェックアウトの「モジュール」パラメータはブランチ名として解釈され、メインブランチになります。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" 、または任意のバイト値の2桁の16進数(通常はASCII番号、またはUTF-8でエンコードされた文字の一部)。

レガシー監視操作はサポートされていません(編集、監視など)。 エクスポートとタグ付け(タグとブランチ)はこの段階ではサポートされていません。

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