27 March 2015

SubversionをGitHubにクローン(コピー)する方法

Subversionリポジトリを、GitHubリポジトリに履歴構造を維持したまま一括コピーし、さらにSubversion側でアップデートが発生した場合差分をGitHubにコピーする方法。

20150327-svn2git-image.png

空のGitHubリポジトリにSubversionリポジトリをまるごとコピー

ローカル・ディスクにSubversionリポジトリをダウンロードする

$ git svn clone -s svn+ssh://USERNAME@example.com/svn/REPO_NAME  LOCAL_REPO_DIR

もしくは

$ git svn init -s svn+ssh://USERNAME@example.com/svn/REPO_NAME  LOCAL_REPO_DIR
$ git fetch

なお、上記の例ではSubversionのリポジトリの標準的なディレクトリ構成 trunk/, branches/, tags/ がちゃんと存在している場合。 -s または --stdlayout がそれを示している。

20150327-svn-dir.png

そうではなく、ルートディレクトリに直接trunkのソースコードを放り込んだリポジトリや、trunk/ではなく違うディレクトリ名を使ったものもあるかもしれない。そういう場合は次のようにディレクトリ名を強制指定する。

■ ルートディレクトリにtrunk/対象のソースコードをごっちゃに格納している場合

$ git svn clone --trunk=/ svn+ssh://USERNAME@example.com/svn/REPO_NAME  LOCAL_REPO_DIR

--trunk=/ または --trunk= を指定する。

ローカル・ディスクのリポジトリデータをGitHubにアップロードする

$ cd LOCAL_REPO_DIR
$ git remote add origin https://github.com/USER/REPO_NAME
$ git push origin --all
$ git push origin --tags

既にコピー済みのGitHubリポジトリに、Subversion側のアップデート分を追加

GitHubへ新規コピーの時と同じ手順で行えば、Git側で必要なアップデート分のみが適用される。

$ git svn clone -s svn+ssh://USERNAME@example.com/svn/REPO_NAME  LOCAL_REPO_DIR
$ cd LOCAL_REPO_DIR
$ git remote add origin https://github.com/USER/REPO_NAME
$ git push origin --all
$ git push origin --tags