GitHubリポジトリへの書き込みアクセス権がないGoogle Code Subversionリポジトリをフォークして同期させるにはどうすればよいですか?
Gitリポジトリで独自の機能を開発できるようにしたいのですが、Google Code Subversionリポジトリと同期したいです。 Google Codeプロジェクト側から修正を取得します。
私はgit-svnを知っていて、それを使用して、完全に制御できるSubversionリポジトリにアップストリームおよびダウンストリームしました。しかし、Google Code Subversionリポジトリとの同期を維持する方法がわかりません。
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にプッシュしないでください。それらをローカルに保ち、とにかく上流で受け入れてみてください。
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インポート を参照してください。
Google CodeからGitHubに同期するためのウォークスルーは、 fnokd.com で入手できます。作成者は、常時接続のリモートサーバーとcronジョブを使用して同期を自動化し、「ベンダー」と呼ばれるGitHubブランチにSVNトランクを保持します。
GitHubは、Subversionプロジェクトの直接インポートをサポートするようになりました( http://help.github.com/import-from-Subversion/ を参照)。新しいレポジトリを作成し、[次のステップ]画面で[Subversionからインポート]をクリックするだけです。しかし、それ以上の同期はサポートしていません:/。
うーん。私の会社ではほぼ同じことをしていました。同じディレクトリに.svnと.gitの両方のリポジトリを置くだけです(この作業コピーでsvn repoをチェックアウトし、gitリポジトリを作成します)。
次に、svn upとgit Pushを使用して問題を解決しました。もちろん、多くの分岐を行う場合は、手動でマージする必要があります。
あなたが何を望んでいるかはよくわかりませんが、もちろん、同じ作業コピーからSubversionリポジトリからプルし、Gitリポジトリにプッシュできます。また、git svn dcommit
Subversionリポジトリに戻ります。ただし、GitHubリポジトリをSubversionリポジトリと同期させることはできません。また、作業コピーにまだSubversionリポジトリにないコミットがある場合、Subversionリポジトリが更新された場合はリベースする必要があり、強制的にgit Push --force
GitHubへの「新しい」コミット。
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