git-svnからのリモートブランチは、通常のGitリモートとほとんど同じです。そのため、ローカルリポジトリで、git-svnクローンを作成し、変更をGitHubにプッシュできます。Gitは気にしません。git-svnクローンを作成し、まったく同じ変更をGitHubにプッシュすると、Googleコードリポジトリの非公式ミラーが作成されます。残りはバニラGitです。
git svn clone http://example.googlecode.com/svn -s
git remote add origin git@github.com: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
ことが想像できます。ただし、機能ブランチには変更がありません。ここでの選択は、マスターを機能にマージするか、機能をリベースすることです。マージは次のようになります
git checkout features
git merge master
o [features]
/|
/ o [remotes/origin/features]
[master] o |
| o
o /
|/
o
|
o
次に、機能をGitHubにプッシュします。スペースを節約するためにマスター用のリモートを省略しました。それらは[マスター]と同じポイントにあります。
リベースのアプローチは少し邪悪です-プッシュは早送りのマージではないため、-forceでプッシュする必要があります(クローンを作成した人の下から機能ブランチをプルします)。これを行うことは実際にはOKとは見なされませんが、あなたが決心していれば誰もあなたを止めることはできません。パッチがわずかに作り直された形式でアップストリームで受け入れられる場合など、いくつかのことも簡単になります。競合をいじくり回す必要がなくなり、リベースするだけで、アップストリームされたパッチをスキップできます。とにかく、リベースは次のようになります。
git rebase master features
o [features]
|
o
| o [remotes/origin/features]
[master] o |
| o
o /
|/
o
|
o
そして、あなたはそれをしなければならないでしょうgit push --force
。なぜそれを強制する必要があるのかがわかります。歴史には、[リモート/オリジン/機能]から新しい現在のリベース後の[機能]までの大きな古い分裂があります。
これはすべて機能しますが、多大な労力を要します。定期的に寄稿する場合は、しばらくこのように作業し、パッチをアップストリームに送信して、Subversionへのコミットアクセスを取得できるかどうかを確認することをお勧めします。それができない場合は、変更をGitHubにプッシュしないでください。それらをローカルに保ち、とにかく上流で受け入れられるようにしてください。