100

私は、cvs を使用するプロジェクトのコードについて、他の人々と共同で作業する予定です。私たちは分散型 VC を使用して作業を行いたいと考えており、作業が終了したとき、またはたまにコードとすべてのリビジョン履歴を cvs にコミットしたいと考えています。プロジェクトの cvs リポジトリへの書き込みアクセス権がないため、頻繁にコミットすることはできません。リビジョン履歴を cvs にエクスポートするには、どのツールを使用できますか? 現在、git または mercurial を使用することを考えていましたが、エクスポートが簡単になる場合は、別の分散 vcs を使用できます。

4

3 に答える 3

237

幸いなことに、まだCVSの使用を余儀なくされている私たちにとって、gitは、あなたがやりたいことを正確に実行するための非常に優れたツールを提供します。私の提案(そしてここで$ workで行うこと):

初期クローンの作成

git cvsimportCVSリビジョン履歴をgitリポジトリに複製するために使用します。次の呼び出しを使用します。

% git cvsimport -d $CVSROOT -C dir_to_create -r cvs -k \
  -A /path/to/authors/file cvs_module_to_checkout

この-Aオプションはオプションですが、CVSからインポートされたリビジョン履歴をよりgitのように見せることができます(man git-cvsimportこれがどのように設定されているかについての詳細はを参照してください)。

CVSリポジトリのサイズと履歴によっては、この最初のインポートには非常に長い時間がかかります。何かが実際に起こっているという安心感が必要な場合は、上記のコマンドに-vを追加できます。

このプロセスが完了すると、masterCVSのHEADを反映するブランチが作成されます(ただし、git cvsimportデフォルトでは、途中で終了したコミットをキャッチしないように、最後の10分間のコミットは無視されます)。その後git log、友人を使用して、最初からgitを使用していたかのように、リポジトリの履歴全体を調べることができます。

構成の微調整

将来、CVSからの増分インポート(およびエクスポート)を容易にするいくつかの構成の調整があります。これらはgit cvsimportmanページに記載されていないため、予告なしに変更される可能性があると思いますが、FWIW:

% git config cvsimport.module cvs_module_to_checkout
% git config cvsimport.r cvs
% git config cvsimport.d $CVSROOT

これらのオプションはすべてコマンドラインで指定できるため、この手順を安全にスキップできます。

インクリメンタルインポート

後続git cvsimportは、最初の呼び出しよりもはるかに高速である必要があります。ただし、cvs rlogすべてのディレクトリ(にファイルしかないディレクトリでもAttic)で実行されるため、数分かかる場合があります。上記の推奨構成を指定した場合、実行する必要があるのは次のとおりです。

% git cvsimport

デフォルトを指定するように構成を設定していない場合は、コマンドラインでそれらを指定する必要があります。

% git cvsimport -r cvs -d $CVSROOT cvs_module_to_checkout

いずれにせよ、覚えておくべき2つのこと:

  1. gitリポジトリのルートディレクトリにいることを確認してください。あなたが他の場所にいるなら、それcvsimportは再び永遠にかかるであろう新鮮なことをしようとします。
  2. master変更をローカル/トピックブランチにマージ(またはリベース)できるように、ブランチにいることを確認してください。

ローカル変更を行う

master実際には、常にブランチに変更を加え、それらの変更をCVSリポジトリにエクスポートする準備ができたときにのみマージすることをお勧めします。ブランチでは好きなワークフロー(マージ、リベース、スカッシュなど)を使用できますが、もちろん標準のリベースルールが適用されます。他の誰かがブランチに変更を基づいている場合は、リベースしないでください。

変更をCVSにエクスポートする

このgit cvsexportcommitコマンドを使用すると、単一のコミットをCVSサーバーにエクスポートできます。単一のコミットID(またはで定義されている特定のコミットを説明するものman git-rev-parse)を指定できます。次に、差分が生成され、CVSチェックアウトに適用され、(オプションで)実際のcvsクライアントを使用してCVSにコミットされます。トピックブランチで各マイクロコミットをエクスポートすることもできますが、通常は、最新のマージコミットを作成し、masterその単一のマージコミットをCVSにエクスポートするのが好きです。マージコミットをエクスポートするときは、差分を生成するために使用するコミット親をgitに指示する必要があります。また、マージが早送りの場合(早送りマージman git-mergeの説明については、の「マージの仕組み」セクションを参照)は機能しないため、を使用する必要があります。--no-ffマージを実行するときのオプション。次に例を示します。

# on master
% git merge --no-ff --log -m "Optional commit message here" topic/branch/name
% git cvsexportcommit -w /path/to/cvs/checkout -u -p -c ORIG_HEAD HEAD

これらの各オプションの意味は、git-cvsexportcommitのマニュアルページで確認できます。gitconfigでオプションを設定する-wオプションがあります。

% git config cvsexportcommit.cvsdir /path/to/cvs/checkout

何らかの理由でパッチが失敗した場合、私の経験では、(残念ながら)変更されたファイルを手動でコピーし、cvsクライアントを使用してコミットする方がおそらく良いでしょう。masterただし、トピックブランチをにマージする前にCVSが最新であることを確認した場合、これは発生しないはずです。

何らかの理由(ネットワーク/権限の問題など)でコミットが失敗した場合は、エラー出力の最後に端末に出力されたコマンドを取得して、CVS作業ディレクトリで実行できます。通常、次のようになります。

% cvs commit -F .msg file1 file2 file3 etc

次にgit cvsimport(少なくとも10分待って)実行すると、エクスポートされたコミットのパッチがローカルリポジトリに再インポートされたことがわかります。CVSコミットは異なるタイムスタンプを持ち、場合によっては異なるコミッター名を持つため、それらは異なるコミットIDを持ちます(上記の最初に作成者ファイルを設定したかどうかによって異なりますcvsimport)。

CVSクローンのクローンを作成する

を実行する必要のある人が複数いる場合cvsimportは、cvsimportを実行する単一のgitリポジトリを用意し、他のすべてのリポジトリをクローンとして作成する方が効率的です。これは完全に機能し、複製されたリポジトリは上記のようにcvsexportcommitsを実行できます。ただし、注意点が1つあります。CVSコミットが異なるコミットIDで戻ってくる方法(上記のとおり)により、複製されたブランチが中央のgitリポジトリを追跡することは望ましくありません。デフォルトでは、これがgit cloneリポジトリの構成方法ですが、これは簡単に修正できます。

% git clone [CENTRAL_REPO_HERE]
% cd [NEW_GIT_REPO_DIR_HERE]
% git config --unset branch.master.remote
% git config --unset branch.master.merge

これらの構成を削除した後、中央リポジトリから新しいコミットをプルするときに、どこから何をプルするかを明示的に指定する必要があります。

% git pull origin master

全体として、このワークフローは非常に管理しやすく、完全にgitに移行する場合の「次善の策」は実用的ではないことがわかりました。

于 2009-02-25T14:42:02.517 に答える
22

cvsimportをやみくもに信頼して、インポートされたツリーが CVS リポジトリにあるものと一致するかどうかを確認するべきではありません。Eclipse CVS のプラグインを使用して新しいプロジェクトを共有することでこれを行いましたが、矛盾があることがわかりました..

(誤って削除されたファイルを元に戻すために) 同じコミット メッセージで 1 分以内に行われた 2 つのコミットは、1 つの大きなコミットにグループ化され、その結果、ツリーからファイルが失われました。

「fuzz」パラメーターを 1 分未満に変更することで、この問題を解決できました。

例:

% git cvsimport -d $CVSROOT -C dir_to_create -r cvs -k \
  -A /path/to/authors/file cvs_module_to_checkout -z 15

結論:インポート後にツリーを確認してください

于 2010-06-28T15:12:42.337 に答える
3

Brian Phillips の回答に加えて、CVS サーバーのように機能するgit-cvsserverもありますが、実際には git リポジトリにアクセスします...ただし、いくつかの制限があります。

于 2009-02-25T20:43:34.113 に答える