SVNリポジトリからGITリポジトリにコードを移動し、開発者チームを移行してGITの使用を開始するための推奨される方法を知りたいです。
移行を行い、すべてのコミットをSVNリポジトリで保持できますか?
また、私たちのチームは現在SVNに満足していますが、GITでの分岐がSVNよりはるかに簡単であることを知りません。分岐におけるGITの力を証明する実用的な例を見つけることができますか?
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 」セクションを読んでください。 =」。
2014年4月の更新
Svn2Git と呼ばれるツールがあり、このプロセスを少し簡単にするのにかなり良い仕事をします。 Githubプロジェクトに関するドキュメントは非常に優れています。 (ルビーが必要です)
Git-svnのデフォルトでは、ブランチ、タグ、トランクではなく、指定したパスからのみプルすることに注意してください。 Svn2gitはその逆です。デフォルトでは、パスの下でトランク、ブランチ、タグを検索しますが、--nobranches
または--notags
を使用して、それらを検索しないように指示する必要があります(svn2gitの利点が無効になる場合があります)。
Gitに移動したら、全員を移動してGitを使用することをお勧めします。もっと複雑ですが、移行する価値があります。 Github.comは、Subversionクライアントを使用したレポジトリへのアクセスをサポートしています(ただし、Gitブランチのパワーを失う可能性があります)。
以下の方法を使用して移動すると、現在のコミットはすべてSubversionリポジトリに残ります。 Subversionリポジトリから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/trunk
、projectA/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リポジトリを読み取り専用にして、人々が古い場所にコミットしようとしないようにする必要があります。
git svn clone
を使用して、タグとすべてのブランチを含め、リポジトリを完全に変換できます。
タグを正しくするための調整が必要です。詳細については、 このリンク を参照してください。
このトピックについては、SOで少なくとも1回前に説明しました:
svnブランチとタグをgit-svnにインポートする方法
SvnからGitへの安全でスムーズな移行アプローチは、 SubGit -サーバー側Git/Svn同期ツールを使用することです。 SubGitをSubversionリポジトリにインストールし、移行プロセスが続く限りSubversionとGitの両方を同時に使用し続けることができます。
免責事項:私はすでに半年の間SubGitを喜んで使用しているSubGit開発者です。
John Albinはいくつかの優れたスクリプトを作成しました here および here これはあなたのために完全な変換(著者変換を含む)を行います。スクリプトは完璧ではありません(複数のブランチ、特にsvn外部のある接続がありました)。
Atlassianは実際に guide をsvnからgitへの移行に書きました(そして、それらのページにも良いチュートリアルがあります)。
gitは非常に強力ですが、注意点が1つあります。これまでのところ、gitはsvn:externalsほど簡単なものはありません。代替手段(gitサブツリーとgitサブモジュール)がありますが、svn externalsほど直感的に機能することはありません(ただし、別の質問です:stackoverflowを見て回ると、このトピックに関連する多くの質問が見つかります)
最初にSubversionに変換してからgitに変換することで、CVSリポジトリをgitに移行しました。適切なツールを使用すると、これはうまく機能しました。
Eclipseプロジェクトを含むCVSリポジトリをgitに変換する最も堅牢な方法?
また、完了したら、厳密にテストします。
Gitの分岐に関しては、それは賢い部分ではありません。利点は、ブランチをmergeする必要がある場合です。