2009-05-25 20 views
27

私はGITとSVNクライアントの両方を使ってリポジトリにアクセスしたいと思います。私が想像したやり方は、自動双方向移行によるものです。ユーザがGITリポジトリにプッシュすると、SVNリポジトリにもCOMMITされ、その逆もあります。GITとSubversionのリポジトリを同期する方法はありますか?

これを行うのに役立つツールはありますか?

答えて

18

これを行う最も良い方法は、git svnをSubversionクライアントとして使用することです。これは、SubversionリポジトリとGitリポジトリとの間の双方向統合を提供します。 Gitリポジトリを取得したら、どこにでもリポジトリを公開して公開することができます。

私はこれを定期的に行います。職場では、「マスター」リポジトリであるSubversionリポジトリがあり、通常はgit svnを使用してアクセスします。時には、私がマージのようなより具体的なSubversionの機能を必要とすることをしている場合は、通常のsvnクライアントをリポジトリに対して使用します。

+12

これは1人のユーザーに有効ですが、チームの2つのリポジトリ間で実際のブリッジをセットアップしようとする人にとっては不十分です。 gitでローカルで行われた変更は、毎回git svn rebaseによって再適用され、その後のgit pushは別のgitリポジトリへと同じ変更を何度も何度も繰り返します。 –

1

これを行う簡単な方法は、メインリポジトリをSubversionにとどめて、git-svnをローカルで使用することです。

4

svn2gitは、svnをgitに簡単にインポートしてから、ミラールビーアプリケーションgit2svnを簡単にインポートすると考えられます。
詳細はthis questionです。
他の答えで述べたように、 'git svn'は必須ですが、それらのルビモジュールはGitの実際のディレクトリとして持っていないのに "Subversionブランチ/ディレクトリ"を尊重するのに役立ちます。

2

私は裸のgit中央レポ+ SVN-gitの橋がある - ブランチの現在 'と枝にGITリポジトリを追跡する「gitcentral」でSVNを追跡し、

をGitのSVNでレポそれから私は、更新後を使用そのような中央のgitリポジトリ内フック:

#!/bin/bash 

# Anything inserted into GIT - move it back to SVN 

echo 
echo '* Pushing data into SVN branch' 
cd /home/git/BRIDGE 
unset GIT_DIR 

# current - svn branch locally and central git branch on project.git repos 
# centralgit - unmodified centralgit branch 
git fetch /home/git/repositories/project.git/ master:centralgit || (echo "Error while pulling data into bridge repository"; exit 1) 
git checkout -b temp centralgit || exit 2 
git rebase current || exit 3 
git checkout current || exit 4 
git reset --hard temp || exit 5 
git svn dcommit || exit 6 
git branch -D temp || exit 7 

echo '* Pushed correctly data into SVN' 
exit 0 

ほとんどの時間だが、作品...

12

正確に何をしたい行い、新たな解決策があります--- SubGit。それは並行安全です(私はgit-svnベースのbashスクリプトについては同じことは言えません)。

+0

これは非常に有望ですね、ありがとうございます。 –

8

私たちのチームはまったく同じ問題を抱えていましたが、実験を少しして、チームのgitリポジトリと企業のSubversionリポジトリの間の変更を同期させるgit-Subversionブリッジを作りました。私たちのgitの使用法は、他のSubversionユーザーにとっては透過的です。

詳細については、https://github.com/mrts/git-svn-bridgeに記載されています。

このセットアップは、実稼動環境で1年以上使用されています。

セットアップの最大の注意点は、gitリポジトリがSVNトランク(または別の単一ブランチ)だけを追跡するということです。他のgitブランチは、マージトランク中に1つのコミットに押しつぶされます。これは問題ではありません。短命のタスクブランチを使用して、それらを1つのチャンクでメインラインに行く軽量で一時的な "作業単位"とみなし、ブランチ履歴をgitに保持します。

関連する問題