web-dev-qa-db-ja.com

履歴を失うことなくCVSからGitに移行する

コードをCVSソース管理からGitに移行する方法があるかどうかを知る必要がありますか?

はいの場合、コミットの履歴はどうですか?

36
Ahmed Alaa

私は個人的にCVSからGitへの変換を行っていませんが、Eric Raymondの cvs-fast-export が使用するツールであると信じています。彼はmanページを掲載しています herecvsps はEricが保守している別のツールですが、最近ではcvs-fast-exportの代わりに廃止されました。 cvs2git は、cvs2svnと同じ機械の一部で構築された別のツールです。後者は非常に熟達していたため、cvs2gitが同等に優れていることを期待しています。

注意すべき点が1つあります。CVSはかなり壊れたRCSです。 Gitに正確に反映できないコンテンツが含まれている可能性があります。 IOW、そこにはいくつかの不整合インピーダンスがありますが、ツールは可能な限り保存するために非常に一生懸命努力します。コンバージョンを確認し、結果に満足していることを確認してください。 Gitの履歴の一部を修正して、より受け入れやすいものにする必要があるかもしれませんが、そうする必要はないと思います。

17

cvs2git最新の安定版リリースはこちら を使用してSourceForge CVSリポジトリをGitに移行するために使用したプロセスを次に示しますが、IIRCではgithub開発バージョンを使用しました) Pythonであるため、コンパイルを必要としないWindowsとLinuxの両方:

Sourceforge CVSからgitにインポートする方法。
最初に、履歴全体を含むcvsリポジトリをダウンロード/チェックアウトする必要があります(HEAD/Trunkをチェックアウトするだけではありません):

rsync -av rsync://PROJECT.cvs.sourceforge.net/cvsroot/PROJECT/\* cvs  

次にcvs2gitを使用します(pythonスクリプト、すべてのプラットフォームで動作し、コンパイルは不要です):

python cvs2git --blobfile="blob.dat" --dumpfile="dump.dat" --username="username_to_access_repo" --options=cvs2git.options --fallback-encoding utf-8 cvs  

これにより、すべてのcvs履歴を含む2つのファイルblobとdumpが生成されます。テキストエディタでそれらを開いて、コンテンツが正しいように見えることを確認できます。

次に、別のフォルダー内でgitリポジトリを初期化します。

mkdir gitexport/
cd gitexport
git init  

次に、エクスポートされたcvs履歴をgitにロードします。

cat ../{blob,dump}.dat | git fast-import  

そして、git commitカーソルを履歴の最後に置きます:

git reset --hard  

最後に、オプションで、リモートgitリポジトリにプッシュできます:

git Push -u Origin master  

もちろん、git remote add Origin https://your_repo_urlの前に必要です

注:cvs2git.optionscvs2gitのJSON形式の構成ファイルで、作成者名などのさまざまなものの変換を指定できます(インポート後にニックネームが自動的にフルネームに変換されます)。 ドキュメントはこちら または サンプルオプションファイルの例 を参照してください。

また、この方法でリポジトリを所有する必要はありません、所有していないSourceForgeプロジェクトを移行できますチェックアウトですので、これはすべてのパブリックリポジトリで機能します)。

22
gaborous

se git-cvsimport CVSリポジトリをGitにインポートします。デフォルトでは、これはすべてのリビジョンをチェックアウトし、比較的完全な履歴を提供します。

オペレーティングシステムによっては、このサポートを個別にインストールする必要がある場合があります。たとえば、Ubuntuマシンでは、git-cvs パッケージ。

この回答 はさらに詳しく説明します。

11
Chris

私は最近(2016) reposurgeon Eric Raymondを使用して、sourceforgeからgitにCVSリポジトリをインポートしました。私はとてもうれしく驚き、とてもうまくいきました。 cvs2svnやその他のツールでの過去の経験の後、この種のタスクのためにためらうことなく再手術を勧めます。

エリックは簡単な移行ガイドを投稿しました here

3
crististm

gaborousanswergit fast-import 、ログメッセージで失敗する可能性がありますnot UTF-8でエンコードされています。

これは、Git 2.23(2019年第2四半期)でうまく機能します:The "git fast-export/import "ペアは、UTF-8以外のエンコーディングでログメッセージを使用したコミットを処理するように改善されています。

commit e80001fcommit 57a8be2commit ccbfc96commit 3edfcc6commit 32615ce を参照してください(2019年5月14日)by Elijah Newren(newren
浜野潤夫-gitster- in commit 66dc7b6 、2019年6月13日)

fast-export:要求された場合のみコミットメッセージの自動再エンコードを行います

コミットメッセージの自動再エンコード(およびエンコードヘッダーのドロップ)は、可逆的な履歴の書き換え(たとえば、sha1sum <-> sha256sumの遷移、一部のサブツリーの書き換え)の試行を傷つけ、fast-export出力を変更するために明示的なユーザー要求を要求する(例:--signed-tags=strip--tag-of-filtered-object=rewrite)。
--reencodeフラグは、ユーザーが指定するために使用でき、他の高速エクスポートフラグと同様に、デフォルトで 'abort'になります。

つまり、 Documentation/git-fast-export に含まれるもの:

 --reencode=(yes|no|abort)::

コミットオブジェクトでencodingヘッダーを処理する方法を指定します。

  • 'abort'(デフォルト)に問い合わせると、このプログラムはそのようなコミットオブジェクトに遭遇すると死にます。
  • 「yes」の場合、コミットメッセージはUTF-8に再エンコードされます。
  • 「no」を指定すると、元のエンコードが保持されます。

fast-export:再エンコードできない場合、エンコードヘッダーを削除しない

いつ fast-exportは、「エンコード」ヘッダーを含むコミットを検出し、UTF-8で再エンコードを試行し、エンコードヘッダーをドロップします。
ただし、UTF-8での再エンコードに失敗した場合、たとえばコミットメッセージの文字の1つが古いエンコードでは無効だった場合、元のエンコードを保持する必要があります。そうしないと、元のコミットメッセージの他のすべての(有効な)文字を理解するために必要な情報が失われます。

fast-import:「エンコード」コミットヘッダーをサポート

GitはUTF-8以外のエンコーディングのコミットメッセージをサポートしているため、fast-importコミットをインポートします。
これは、外部システムからのコミットメッセージを再エンコードしたくない場合に役立ちます。また、Gitリポジトリで可逆履歴の書き換え(sha1sum <-> sha256sum遷移またはサブツリー作業)を実現する場合にも役立ちます。コミット履歴で特殊なエンコーディングを使用しています。

Documentation/git-fast-import に含まれるもの:

エンコーディング `

オプションのencodingコマンドは、コミットメッセージのエンコードを示します。
ほとんどのコミットはUTF-8であり、エンコードは省略されますが、これにより、コミットメッセージを最初に再エンコードせずにgitにインポートできます。


そのテスト を表示するには、名前に非ASCII文字を含む著者を使用しますが、特別なコミットメッセージはありません。
サイズを確認することで、UTF-8への再エンコードが機能したことを確認します。

コミットオブジェクトは、再エンコードされない場合、240バイトになります。

  • encoding iso-8859-7\n "ヘッダーは20バイトをドロップします。
  • Pi文字π の再エンコード\xF0\360)iso-8859-7で\xCF\x80\317\200)UTF-8では、バイトが追加されます。

予想されるサイズを確認してください。

0
VonC

Sourceforgeからgithubにプロジェクトを複製するために、次の手順を実行しました。

PROJECT=some_sourceforge_project_name
GITUSER=rubo77
rsync -av rsync://a.cvs.sourceforge.net/cvsroot/$PROJECT/\* cvs
svn export --username=guest http://cvs2svn.tigris.org/svn/cvs2svn/trunk cvs2svn-trunk
cp ./cvs2svn-trunk/cvs2git-example.options ./cvs2git.options
vim cvs2git.options # edit run_options.set_project
cvs2svn-trunk/cvs2git --options=cvs2git.options --fallback-encoding utf-8

https://github.com/$GITUSER/$PROJECT.gitで空のgitを作成します

git clone [email protected]:$GITUSER/$PROJECT.git $PROJECT-github
cd $PROJECT-github
cat ../cvs2git-tmp/git-{blob,dump}.dat | git fast-import
git log
git reset --hard
git Push
0
rubo77