web-dev-qa-db-ja.com

Google Code SubversionリポジトリをフォークしてGitHubに同期する

GitHubリポジトリへの書き込みアクセス権がないGoogle Code Subversionリポジトリをフォークして同期させるにはどうすればよいですか?

Gitリポジトリで独自の機能を開発できるようにしたいのですが、Google Code Subversionリポジトリと同期したいです。 Google Codeプロジェクト側から修正を取得します。

私はgit-svnを知っていて、それを使用して、完全に制御できるSubversionリポジトリにアップストリームおよびダウンストリームしました。しかし、Google Code Subversionリポジトリとの同期を維持する方法がわかりません。

131
optixx

Git-svnからのリモートブランチは、通常のGitリモートとほとんど同じです。したがって、ローカルリポジトリでgit-svnクローンを作成し、GitHubに変更をプッシュできます。 Gitは気にしません。 git-svnクローンを作成し、まったく同じ変更をGitHubにプッシュすると、Google Codeリポジトリの非公式のミラーが作成されます。残りはVanilla Gitです。

git svn clone http://example.googlecode.com/svn -s
git remote add Origin [email protected]:example/example.git
git Push Origin master

これができたら、ときどきSubversionリポジトリをGitと同期する必要があります。次のようになります。

git svn rebase
git Push

Gitkなどでは、これは次のようになります。

o [master][remotes/trunk][remotes/Origin/master]
|
o
|
o

git svn rebaseを実行すると、次のようになります。

o [master][remotes/trunk]
|
o
|
o [remotes/Origin/master]
|
o
|
o

そのため、git Pushを実行すると、これらのコミットがGitHubにプッシュされ、そこに[remotes/Origin/master]ブランチが追加されます。そして、最初のASCIIアートダイアグラムのシナリオに戻ります。

問題は、変更をどのようにミックスに反映させるかです。アイデアは、git-svn-rebase-ingとgit-pushingと同じブランチにコミットすることはありません。変更のために別のブランチが必要です。そうしないと、最終的にSubversionの変更に基づいて変更をリベースすることになり、Gitリポジトリのクローンを作成する人を混乱させる可能性があります。フォローしてください?ブランチを作成するので、「機能」と呼びましょう。そして、コミットを行い、それをGitHubの機能ブランチにプッシュします。 gitkは次のようになります。

o [features][remotes/Origin/features]
|
o
|
o [master][remotes/trunk][remotes/Origin/master]
|
o

ここで、Google Codeブランチに先立って機能ブランチをいくつかコミットしましたよね?それでは、Google Codeから新しいものを取り入れたい場合はどうなりますか?最初にgit svn rebaseを実行し、これを取得します:

                           o [features][remotes/Origin/features]
[master][remotes/trunk] o  |
                        |  o
                        o /
                        |/
                        o[remotes/Origin/master]
                        |
                        o

git Pushをマスターアウトすると、[remotes/Origin/master]がマスターと同じポイントにあることが想像できます。ただし、機能ブランチには変更がありません。選択肢は、マスターを機能にマージするか、機能をリベースすることです。マージは次のようになります

git checkout features
git merge master 

            o [features]
           /|
          / o [remotes/Origin/features]
[master] o  |
         |  o
         o /
         |/
         o
         |
         o

次に、機能をGitHubにプッシュします。スペースを節約するためにmasterのリモコンを省略しました。それらは[master]と同じポイントにあります。

リベースアプローチは少し悪です-プッシュは早送りマージではないため、-forceでプッシュする必要があります(クローンを作成した人の下から機能ブランチをプルします)。これを行うことは本当に大丈夫とは考えられていませんが、あなたが決心しているなら誰もあなたを止めることはできません。パッチを少し手直しした形でアップストリームに受け入れた場合など、いくつかのことも簡単になります。競合を台無しにする必要はありません。リベースするだけで、アップストリームのパッチをスキップできます。とにかく、リベースは次のようになります。

git rebase master features

         o [features]
         |
         o
         |  o [remotes/Origin/features]
[master] o  |
         |  o
         o /
         |/
         o
         |
         o

そして、あなたはgit Push --forceそれをしなければなりません。強制する必要がある理由がわかります。歴史には[remotes/Origin/features]から新しい現在のポストリベース[[features]までの大きな古い分裂があります。

これはすべて機能しますが、多くの努力が必要です。あなたが通常の貢献者になるなら、しばらくの間このように働き、いくつかのパッチをアップストリームに送って、Subversionへのコミットアクセスを取得できるかどうかを確認するのが最善策です。それに失敗したら、おそらく変更をGitHubにプッシュしないでください。それらをローカルに保ち、とにかく上流で受け入れてみてください。

178
richq

svn2githubサービス

Webサイト http://svn2github.com/ は、公開アクセス可能なSVNリポジトリをGithubにフォークするサービスを提供します( https://github.com/svn2github/projectname )。私はそれを試してみました; 「ミラーを作る」を押すと、明らかに数秒間何もせず、メッセージ「エラー」を表示しましたが、実際には機能していました。実際には、SVNリポジトリからのコードを含む新しいリポジトリが作成されました。

次に、作成するリポジトリをフォークし、独自のフォークで作業します。次に、バグトラッカーを使用して、上流プロジェクトに変更を送信します。

サービスのGithubユーザー(たとえば、「5時間前にsvn2github/haxeでマスターにプッシュされたsvn2github」)の既存のリポジトリを見ると、SVNリポジトリから定期的に変更が取り込まれているようです。ウェブサイトで誰がサービスを実行しているかについての情報はないので、無期限に実行し続けることに賭けるつもりはありませんが、今のところは機能します(そして、ダウンした場合でも、手動でフォークを更新できます)。

発射台

GitとGithubを使用するように設定されていない場合は、Launchpad.netを使用することもできます。 LaunchpadはSVN(またはCVS)リポジトリを個人のbzrブランチに自動的にインポートできます。これを行うには、Launchpadプロジェクトを作成してから、 新しいインポートページ に移動し、Subversionを選択してURLを入力します(例:http://projectname.googlecode.com/svn/trunk/)。プロジェクトのサイズによっては、最初のインポートに数時間かかる場合があります。後続のインポートは定期的に実行されます。

詳細なドキュメントについては、 LaunchpadヘルプのVCSインポート を参照してください。

15

Google CodeからGitHubに同期するためのウォークスルーは、 fnokd.com で入手できます。作成者は、常時接続のリモートサーバーとcronジョブを使用して同期を自動化し、「ベンダー」と呼ばれるGitHubブランチにSVNトランクを保持します。

10
akaihola

GitHubは、Subversionプロジェクトの直接インポートをサポートするようになりました( http://help.github.com/import-from-Subversion/ を参照)。新しいレポジトリを作成し、[次のステップ]画面で[Subversionからインポート]をクリックするだけです。しかし、それ以上の同期はサポートしていません:/。

2
nick black

うーん。私の会社ではほぼ同じことをしていました。同じディレクトリに.svnと.gitの両方のリポジトリを置くだけです(この作業コピーでsvn repoをチェックアウトし、gitリポジトリを作成します)。

次に、svn upとgit Pushを使用して問題を解決しました。もちろん、多くの分岐を行う場合は、手動でマージする必要があります。

1
Marcin Gil

あなたが何を望んでいるかはよくわかりませんが、もちろん、同じ作業コピーからSubversionリポジトリからプルし、Gitリポジトリにプッシュできます。また、git svn dcommit Subversionリポジトリに戻ります。ただし、GitHubリポジトリをSubversionリポジトリと同期させることはできません。また、作業コピーにまだSubversionリポジトリにないコミットがある場合、Subversionリポジトリが更新された場合はリベースする必要があり、強制的にgit Push --force GitHubへの「新しい」コミット。

0
Bombe

Yu-Jie Lin のブログでこれらの指示を見つけました。

最初にSubversionリポジトリのクローンを作成し、Gitにプッシュします。

git svn clone https://foo.googlecode.com/svn/ git-foo 
cd git-foo
git remote add git-foo [email protected]:username/foo.git 
git Push git-foo master

Subversionリポジトリでコミットした後、実行します

cd /path/to/git-foo
git svn fetch 
git svn rebase 
git Push git-foo master
0
Ellen Spertus