web-dev-qa-db-ja.com

GitでCVSリポジトリをインポートして更新し続けるにはどうすればよいですか?

CVSには中央リポジトリがあります。Gitでローカルに使用し、変更をCVSに送り返します。

毎日何を達成できますか?

私が達成したいタスクは次のとおりです。

  • 枝のインポート、
  • gITのような形式で履歴を取得する
  • 変更/コミットを中央サーバーにエクスポートして戻す

ところで、私は CVSでgitを使用するためのベストプラクティス も調べました。しかし、それはうまくいかず、私が見逃したか間違ったことを理解できませんでした。

34
Jatin Ganhotra

私が過去にしたことは:

CVSリポジトリをインポートする

を使用して:

$ git cvsimport -C target-cvs -r cvs -k -vA authors-file.txt -d $CVSROOT module

どこ:

  • target-cvsは、リポジトリのローカルコピーを保持するディレクトリです。
  • cvsは、リモートリポジトリの参照に使用する名前です。したがって、cvs/mastercvs/HEADなどがmasterによってローカルにポイントされます。
  • authors-file.txtは、CVSアカウントとName + emailの一致を含むファイルです。各行にはuserid=User Name <useremail@hostname>が含まれます
  • $CVSROOTはCVSリポジトリサーバーです。いくつかのsourceforgeリポジトリから匿名クローンを使用する場合、次を使用します::pserver:anonymous@project_name.cvs.sourceforge.net:/cvsroot/project_name
  • moduleは、複製するリポジトリ内のモジュールです。リポジトリにモジュールが1つしかない場合、project_nameと同じになる可能性があります。

リポジトリを更新する

以前に書いたコマンドを繰り返すことは可能です。その特定の例では、target-cvsの親ディレクトリで実行する必要があります。将来的に簡単にするために、いくつかの変数を設定することをお勧めします(の回答で詳細を読むことができます) 変更履歴をMercurialまたはgitからcvsにエクスポートする方法? "

$ git cvsimport

gitのローカルリポジトリをCVSのリモートリポジトリと同期するには、これで十分です。

日々の仕事

これ以降、すべての変更はローカルのgitブランチに移動する必要があります。 1つの機能、1つのブランチ。このために、「成功したGit分岐モデル」で説明されているワークフローを使用します。唯一の違いは、masterがCVSを指していることですが、概念的には同じワークフローをここで適用できます。これは単なる慣例です。

コミットがCVSにプッシュされると、次の更新でマスターに戻ります(git cvsimport)。その後、その機能を実装したローカルブランチを削除できます。

(ローカルブランチで)進行中の作業については、マスターに対してrebaseする必要があります。機能が分離されているため、競合を解決する方が簡単です。トリッキーな部分は、一部のブランチが他のブランチに依存しているが、依然として管理可能である場合です。マイクロコミットは非常に役立ちます(Gitワークフローと同様)。

すべてのローカルブランチがリベースされ、マスターが更新されない場合は、git cvsexportcommitが機能するはずです。 1回のコミットで機能することを忘れないでください。少し面倒ですが、何もないよりはましです。前の例を考えると、コマンドは次のようになります。

$ git cvsexportcommit -vc commit-id

リモートCVSへの読み取り専用アクセス権しかない場合は、パッチをメールで送信するか、gitリポジトリを公開して、コミッターがパッチを取得して適用できるようにします。この場合、CVSの通常のワークフローと何の違いもありません。繰り返しますが、次の更新では、masterの変更が表示されます。

46
gpoo

最新バージョンでは、cvspstool incompatibility のため、git cvsimportが壊れています。

したがって、cvsps-2.1をインストールする必要があります。

OSXでは次のことができます(brewを持つ):

brew tap homebrew/versions
brew install cvsps2
brew unlink cvsps
brew link --overwrite cvsps2

そして、いつものように空のgitリポジトリーにインポートします、例:

git cvsimport -C RepoName -r cvs -o master -k -v -d:pserver:[email protected]:/cvsroot/path ModuleName

CVSリポジトリをgitに変換できる cvs2git ツールを使用することもできます。ただし、CVSROOTディレクトリにアクセスする必要があります。

インストール手順については cvs2git documentation を確認してください。

使用例:

cvs2git --blobfile=git-blob.dat --dumpfile=git-dump.dat --username=cvs2git /path/to/cvs/repo

これにより、git fast-import形式の2つの出力ファイルが作成されます。これらのファイルの名前は、オプションファイルまたはコマンドライン引数によって指定されます。この例では、これらのファイルの名前はcvs2git-tmp/git-blob.datおよびcvs2git-tmp/git-dump.datです。

これらのファイルは、次の方法で空のgitリポジトリにインポートできます。

cat git-blob.dat git-dump.dat | git fast-import

次に、TAG.FIXUPブランチを削除し、gitk --allを実行して、変換の結果を表示します。

cvs2git --helpを実行して、詳細を確認します。

7
kenorb

あなたの場合、レシピを使用する準備はできていないと思います。ただし、次のことを試すことができます。

  • CVSデータをGitと手動で同期するか、そのためのスクリプトを記述します。 CVSから情報を取得してGitに送信します。これにより、Gitのある種の履歴が得られます。完全にクリーンではなく、完全に使用可能ではありませんが、それでもです。
  • tools like git cvsimportを使用して、CVSリポジトリをGitに移行します。 git cvsserverを使用して、Gitに他の開発者のCVSのふりをするように依頼します。
2
shytikov