131

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

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

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

4

7 に答える 7

178

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にプッシュしないでください。それらをローカルに保ち、とにかく上流で受け入れられるようにしてください。

于 2009-04-28T12:01:56.377 に答える
15

svn2githubサービス

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

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

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

発射台

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

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

于 2012-07-23T01:39:46.420 に答える
10

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

于 2009-12-10T08:05:35.787 に答える
2

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

于 2011-12-14T08:50:57.753 に答える
1

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

次に、svnupとgitpushを使用して処理を行いました。もちろん、多くの分岐がある場合は、手作業でマージする必要があります。

于 2009-04-28T09:43:12.343 に答える
0

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

于 2009-04-28T12:01:59.357 に答える
0

これらの手順は、Yu-JieLinのブログで見つかりました。

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

git svn clone https://foo.googlecode.com/svn/ git-foo 
cd git-foo
git remote add git-foo git@github.com: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
于 2013-10-25T23:38:13.187 に答える