web-dev-qa-db-ja.com

コミット履歴を失うことなくSVNからGITにコードを移行する方法は?

SVNリポジトリからGITリポジトリにコードを移動し、開発者チームを移行してGITの使用を開始するための推奨される方法を知りたいです。

移行を行い、すべてのコミットをSVNリポジトリで保持できますか?

また、私たちのチームは現在SVNに満足していますが、GITでの分岐がSVNよりはるかに簡単であることを知りません。分岐におけるGITの力を証明する実用的な例を見つけることができますか?

71
simo

Eric Raymond(esr)は、 reposurgeon 、「バージョン管理履歴でトリッキーな編集操作を実行するためのコマンドインタープリター」を作成しました。ツールには、VCS変換の結果のクリーンアップなど、さまざまな目的のスクリプトが含まれています。 https://gitlab.com/esr/reposurgeon から確認してください。

バージョン2.0の時点では、Git、Mercurial、etc。への完全かつ慣用的な翻訳のためのSVNダンプファイルの読み取りのサポートが含まれています。詳細については、 http://esr.ibiblio.org/?p=4071 を参照してください。 Reposurgeonは、Emacsを含むいくつかの大きなプロジェクトをGitに変換するために使用されています。Emacsは、リポジトリが大きく、ブランチ構造が複雑で、CVSリポジトリとしての生活を開始するのに十分なほど古いものです。 Subversionプロジェクトのバックヒストリに潜む最もuい翻訳問題のいくつかは、cvs2svnによって生成される奇妙なSubversion操作シーケンス(ブランチコピー操作の組み合わせを含む)であるため、最後の部分が重要です。

(Gitに含まれているgit-svnツールは、ブランチを含む多くのSubversionリポジトリを処理します。特にGitがSubversionクライアントとして動作できるため、変換を行っているチームで非常によく使用されます。しかし、ESRを参照してください。 git-svn! でsvn-to-gitリポジトリ変換をしないでください。変換ツールとしてのsvn。)

2番目の質問については、Gitの力が非常に役立つ場所には分岐していません(ただし、Gitは少なくともこの点でSubversionと同じくらい強力です)。 Gitが輝くのはマージブランチになるときです。 Git Community Book 、特に第3章の「 Basic Branching and Merging 」セクションと第7章の「 Advanced Merging 」セクションを読んでください。 =」。

48
J. C. Salomon

git-svn で作業している人が既にたくさんいるので、それは非常に可能だと思います。次のコマンドはよく知られています:

git svn clone -s http://svn/repo

manual (ローカルで検証済み)によると、これは「トランク、タグ、ブランチ」を保持します。

19
l0b0

2014年4月の更新

Svn2Git と呼ばれるツールがあり、このプロセスを少し簡単にするのにかなり良い仕事をします。 Githubプロジェクトに関するドキュメントは非常に優れています。 (ルビーが必要です

Git-svnのデフォルトでは、ブランチ、タグ、トランクではなく、指定したパスからのみプルすることに注意してください。 Svn2gitはその逆です。デフォルトでは、パスの下でトランク、ブランチ、タグを検索しますが、--nobranchesまたは--notagsを使用して、それらを検索しないように指示する必要があります(svn2gitの利点が無効になる場合があります)。


Gitに移動したら、全員を移動してGitを使用することをお勧めします。もっと複雑ですが、移行する価値があります。 Github.comは、Subversionクライアントを使用したレポジトリへのアクセスをサポートしています(ただし、Gitブランチのパワーを失う可能性があります)。

Subversionリポジトリを保持できますか?

以下の方法を使用して移動すると、現在のコミットはすべてSubversionリポジトリに残ります。 SubversionリポジトリからGitリポジトリへの一方向の同期を実行できる場合がありますが、逆方向に移動すると非常に複雑になります。どちらの方法でも同期して、全員を一度だけ移動することはお勧めしません。

Gitの何が強力ですか?

Gitの分岐は強力ですが、Gitだけではありません。完全な履歴をローカルに保持するということは、Subversionでできることはすべて行えるが、サーバーに接続する必要がないことを意味します。履歴の確認と検索、変更の取り消し、ローカルでのコミット、ローカルでの分岐は非常に高速になります。 Gitはデータも圧縮するため、Subversionチェックアウト(最新のリビジョンのみを含む)は、Gitチェックアウト(完全な履歴を含む)とほぼ同じサイズになります。また、データは転送時に圧縮されるため、プッシュおよびプルもはるかに高速です。 Gitのブランチをプッシュするだけでなく、Gitに関するすべてを配置します。

git svnメソッドを使用してレポジトリを移動する方法。

まず、Subversionリポジトリのクローンを作成します。これにはしばらく時間がかかる場合があります。

git svn clone http://www.example.com/svn-repo/projectA/trunk/

http://www.example.com/svn-repo/はSubversionリポジトリへのURL、projectA/trunk/はGitにコピーするパスです。

projectA/trunkprojectA/branches/projectA/tags/などの標準レイアウトがある場合は、--stdlayoutを追加して、このようなディレクトリからクローンを作成できます

git svn clone --stdlayout http://www.example.com/svn-repo/projectA/  projectA.git-svn

また、上記とは異なる名前のトランク、ブランチ、タグフォルダーがある場合は、それぞれにgit svn cloneカスタム名を付けます。

git svn clone --trunk my-trunk --branches my-branches --tags my-tags http://www.example.com/svn-repo/projectA/  projectA.git-svn

完了したら、--mirrorを使用してリモートgitリポジトリにプッシュするだけです。

cd projectA.git-svn
git Push --mirror [email protected]:Account/projectA.git

この時点で、Subversionリポジトリを読み取り専用にして、人々が古い場所にコミットしようとしないようにする必要があります。

11
Nate

git svn cloneを使用して、タグとすべてのブランチを含め、リポジトリを完全に変換できます。

タグを正しくするための調整が必要です。詳細については、 このリンク を参照してください。

このトピックについては、SOで少なくとも1回前に説明しました:
svnブランチとタグをgit-svnにインポートする方法

5
eckes

SvnからGitへの安全でスムーズな移行アプローチは、 SubGit -サーバー側Git/Svn同期ツールを使用することです。 SubGitをSubversionリポジトリにインストールし、移行プロセスが続く限りSubversionとGitの両方を同時に使用し続けることができます。

免責事項:私はすでに半年の間SubGitを喜んで使用しているSubGit開発者です。

2

John Albinはいくつかの優れたスクリプトを作成しました here および here これはあなたのために完全な変換(著者変換を含む)を行います。スクリプトは完璧ではありません(複数のブランチ、特にsvn外部のある接続がありました)。

Atlassianは実際に guide をsvnからgitへの移行に書きました(そして、それらのページにも良いチュートリアルがあります)。

gitは非常に強力ですが、注意点が1つあります。これまでのところ、gitはsvn:externalsほど簡単なものはありません。代替手段(gitサブツリーとgitサブモジュール)がありますが、svn externalsほど直感的に機能することはありません(ただし、別の質問です:stackoverflowを見て回ると、このトピックに関連する多くの質問が見つかります)

1
Chris Maes

最初にSubversionに変換してからgitに変換することで、CVSリポジトリをgitに移行しました。適切なツールを使用すると、これはうまく機能しました。

Eclipseプロジェクトを含むCVSリポジトリをgitに変換する最も堅牢な方法?

また、完了したら、厳密にテストします。

Gitの分岐に関しては、それは賢い部分ではありません。利点は、ブランチをmergeする必要がある場合です。