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


131

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

私は自分のGitリポジトリーで独自の機能を開発できるようにしたいのですが、Google Code Subversionリポジトリーと同期したいと思っています。Google Codeプロジェクト側からフィックスをフェッチする。

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

回答:


178

git-svnからのリモートブランチは、通常のGitリモートとほとんど同じです。したがって、ローカルリポジトリでgit-svnクローンを作成し、変更をGitHubにプッシュできます。Gitは関係ありません。git-svnクローンを作成し、まったく同じ変更をGitHubにプッシュすると、Google Codeリポジトリの非公式ミラーが作成されます。残りはバニラ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すると、これらのコミットが[remotes / origin / master]である GitHubにプッシュされますブランチに。そして、最初の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でプッシュする必要があります(クローンを作成した人の下から機能ブランチをプルします)。これを行うことは実際には大丈夫とは見なされていませんが、あなたが決心している場合、誰もあなたを止めることはできません。パッチが上流でわずかに作り直された形で受け入れられる場合など、いくつかのことも簡単になります。衝突をいじる必要がなくなるので、リベース-アップストリームパッチをスキップできます。とにかく、リベースは次のようになります:

git rebase master features

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

そして、あなたはそれをしなければならないでしょうgit push --force。なぜそれを強制する必要があるのか​​がわかります。歴史には、[リモート/オリジン/機能]から現在のリベース後の[機能]まで、古い古い分裂があります。

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


優れた指示をありがとう。(gitnoob here)簡単な質問。大規模なSVNリポジトリに対してこれを行ったところ、最大で141メガバイトになりました。私はそれをgithubにプッシュし、それを元に戻し、130メガバイトになりました。私はgit gc両方で走った。違いを説明できるものは何ですか?
mpontillo

... 理解した。必要でしたgit push origin --mirror
mpontillo 2011

魅力のように動作しましたが、今は元のgooglecode開発者にgithubを使用するように指示する必要があります:D
electblake

これは、の-sオプションでは機能しませんでしたがgit svn clone、それがなければ、残りは問題なく機能しました。
user1027169

15

svn2githubサービス

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

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

サービスのGithubユーザー(たとえば、「svn2github pushed to master at svn2github / haxe 5 hours ago」)の下にある既存のリポジトリを見ると、SVNリポジトリから定期的に変更をプルしているようです。Webサイトで誰がサービスを実行するかについての情報はないため、無期限に実行し続けることはできませんが、今のところ機能します(ダウンした場合でも、手動でフォークを更新できます)。

発射台

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

詳細については、LaunchpadヘルプのVCS Importsを参照してください。


10

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


2

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


この方法はもう存在しません
Magnetik 2013

代わりに今すぐimport.github.com/newを使用してください。help.github.com/articles/importing-from-subversionを参照してください。
Chris Arndt、2015年

1

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

次に、svn upとgit pushを使用して処理を行いました。もちろん、大きく分岐する場合は、手動でマージする必要があります。


Jaそうですが、.svnメタデータを避けたいので、gitがsvn reposをダウンストリームマスターとして使用できることを望んでいました
optixx

それでは、git-svnを使用してレポをチェックアウトし、githubにgit pushすることはできませんか?
Marcin Gil、

0

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


0

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

まず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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.