ここから本文です

たった3つで共存できる、Git/GitHubとSubversion(SVN)の連携、移行に関する基本操作

7/4(火) 7:55配信

@IT

 本稿では「Apache Subversion(SVN)との連携や移行」について、以下の3つの基本的な操作を順に解説していきます。

GitHub Importer


1. 「git svn」コマンドを使用して、GitからSubversionリポジトリへアクセスする
2. 「GitHub Importer」を使用して、SubversionからGitHubへの移行を実行する
3. SubversionクライアントからGitHubリポジトリへアクセスする)

○環境構築について

 本稿における作業に必要な環境を構築する手順は省略します。以下の環境を各自ご用意ください。

・「git svn」コマンドを実行できる環境
・「svn」コマンドを実行できる環境
・Subversionリポジトリ(一般的な構造である「trunk/」「branches/」「tags/」を採用したリポジトリ)

 「git svn」コマンドについては、本連載の第1回記事でGitのインストールが完了していれば、既に利用できるかと思います。「svn」のパッケージはこちらから入手できます。

 Subversionリポジトリは、sourceforgeなどのホスティングサービスを利用して作成できます。

●【1】「git svn」コマンドを使用して、GitからSubversionリポジトリへアクセスする

 「git svn」コマンドは、SubversionリポジトリとGitリポジトリの橋渡しを行ってくれるものです。

 このコマンドを使用すると、ローカルでGitの機能を活用した作業を行いつつ、その結果をSubversionリポジトリに反映できます。

 今回は、以下の3つの操作を行っていきます。

・Subversionリポジトリから、ローカルのGitリポジトリを作成する
・ローカルのGitリポジトリに変更を行い、Subversionリポジトリへ反映する
・Subversionリポジトリへの変更を確認する

○Subversionリポジトリから、ローカルのGitリポジトリを作成する

 作業用の適当なディレクトリに移動します。

――――――
$ cd /Users/hirayashingo/at-it-14/work-with-git-svn
――――――

 「git svn clone -s {Repository URL}」コマンドを使用して、Subversionリポジトリ全体をローカルのGitリポジトリにインポートします。今回使用したSubversionリポジトリはコミット数が10以下の大きさでしたが、インポートするのに1分ぐらいかかりました。

――――――
$ git svn clone -s svn+ssh://username@svn.code.sf.net/p/sample/code/
――――――

 インポートが完了すると、作業用ディレクトリ内にGitリポジトリが作成されているのを確認できます。

 今回試した環境の場合、この時点でのブランチは以下のようになりました。

――――――
$ git branch -a
* master
 remotes/origin/feature
 remotes/origin/tags/release-0.1
 remotes/origin/trunk
――――――

 「git checkout -b」コマンドを使用すると、リモートブランチを元にローカルにブランチを作成できます。

――――――
$ git checkout -b feature origin/feature
Switched to a new branch 'feature'

$ git branch
* feature
 master
――――――

 ここまでの操作によって、SubversionリポジトリからGitリポジトリをローカルに作成できました(このGitリポジトリからGitHubの新規リポジトリを作成すれば、SubversionリポジトリからGitHubへの移行を完了させることができます)。

○ローカルのGitリポジトリに変更を行い、Subversionリポジトリへ反映する

 次に、ローカルのGitリポジトリに変更を行い、その変更をSubversionリポジトリに反映します。

 ファイルを変更し、コミットします。
――――――
$ echo "Add text from git-svn" >> hoge.txt
$ git add hoge.txt
$ git commit -m "Update hoge.txt"
[master 48e1db7] Update hoge.txt
1 file changed, 1 insertion(+), 1 deletion(-)
――――――

 「git svn dcommit」コマンドを使用して、変更をSubversionリポジトリに反映します。
――――――
$ git svn dcommit
Committing to svn+ssh://username@svn.code.sf.net/p/sample/code/trunk ...
  M  hoge.txt
Committed r8
  M  hoge.txt
r8 = 1a255450e2c77a2d594daadbcbc1d583890f7608 (refs/remotes/origin/trunk)
No changes between 48e1db7dc129d38208928192c19ab41f76304588 and refs/remotes/origin/trunk
Resetting to the latest refs/remotes/origin/trunk
――――――

○Subversionリポジトリへの変更を確認する

 最後に、Subversionクライアントから、Subversionリポジトリの最新データを取得し、「git svn」コマンドによる変更がSubversionリポジトリに反映されていることを確認します。

 Subversionリポジトリの作業コピーが存在するディレクトリに移動します。

――――――
$ cd /Users/hirayashingo/at-it-14/svn-working-copy
――――――

 作業コピー更新し、ログを見ると「git svn」コマンドによる変更を確認できました。

――――――
$ svn update
$ svn log
------------------------------------------------------------------------

r8 | username | 2017-06-24 12:34:21 +0900 (Sat, 24 Jun 2017) | 1 line

Update hoge.txt

------------------------------------------------------------------------

....
――――――

 「git svn」コマンドを使用して、GitからSubversionリポジトリへアクセスする操作の解説は以上です。

●【2】「GitHub Importer」を使用して、SubversionからGitHubへの移行を実行する

 GitHubへの移行を行ってくれるツール「GitHub Importer」を使用して、Subversionリポジトリ上のコードをGitHubへ移行してみます。

 GitHub Importerを開きます。

 SubversionリポジトリのURL、新しく作るGitリポジトリの名前を入力し、「Begin import」をクリックします。

 移行処理が開始します。

 移行が終わると「Importing complete!」というメッセージが表示されます。

 そのメッセージの右に新規作成されたGitリポジトリへのリンクがあるので、そこをクリックします。

 Gitリポジトリのページを表示できました。

 「GitHub Importer」を使用して、SubversionからGitHubへの移行を実行する操作の解説は以上になります。

●【3】SubversionクライアントからGitHubリポジトリへアクセスする

 GitHubのリポジトリは、Subversionのクライアントからアクセスできます。

 本連載のこれまでの記事で作成してきた、GitHub上の「hello-github」リポジトリに対し、幾つかの操作をSubversionのクライアント「svn」から行ってみます。

○チェックアウトする

 まずは、「svn checkout」コマンドを使用して、GitHubのリポジトリをチェックアウトします。

 作業用の適当なディレクトリに移動します。

――――――
$ cd /Users/hirayashingo/at-it-14/work-from-svn-to-github
――――――

 「svn checkout」コマンドを使用して、リポジトリの空のチェックアウトを行います。
――――――
$ svn checkout --depth empty https://github.com/username/hello-github.git
Checked out revision 11.
――――――

 作成されるディレクトリに移動します。

――――――
$ cd hello-github.git
――――――

 「trunk」ブランチを取得します。通常、「master」ブランチが「trunk」ブランチにマッピングされます。

――――――
$ svn update trunk
Updating 'trunk':
A  trunk
A  trunk/ISSUE_TEMPLATE.md
A  trunk/PULL_REQUEST_TEMPLATE.md
A  trunk/README.md
Updated to revision 11.
――――――

 「branches」ディレクトリの空のチェックアウトを取得します。このディレクトリ内に作業用のブランチを作ることができます。

――――――
$ svn update --depth empty branches
Updating 'branches':
A  branches
Updated to revision 11.
――――――

○ブランチを作成する

 次に、ブランチを作成してみます。「svn copy」コマンドを使用して、新しいブランチを作成します。

――――――
$ svn copy trunk branches/more_awesome
A     branches/more_awesome
――――――

 「svn commit」コマンドを使用して、リモートに反映します。

――――――
$ svn commit -m 'Added more_awesome topic branch'
Authentication realm: <https://github.com:443> GitHub
Username: username@example.com
Password for 'username@example.com': ******************************

Adding     branches/more_awesome
Committing transaction...
Committed revision 13.
――――――

 ここまでの操作で、ブランチを作成し、そのブランチをGitHubのリポジトリに反映する作業が完了しました。

 GitHubのリポジトリページで、新しいブランチが作成されていることを確認できると思います。

○コミットを実行する

 最後に、ファイルの変更を行い、コミットを実行してみます。

 「README.md」ファイルに1行追加します。

――――――
$ echo "- [Support for Subversion clients](https://goo.gl/XnrvnR)" >> trunk/README.md
――――――

 「svn commit」コマンドを使用してコミットを実行します。

――――――
$ svn commit -m "Update README.md"
Sending    trunk/README.md
Transmitting file data .done
Committing transaction...
Committed revision 14.
――――――

 GitHubのリポジトリページで、今回追加したコミットを確認できるかと思います。

 SubversionクライアントからGitHubリポジトリへアクセスする操作の解説は以上です。

最終更新:7/4(火) 7:55
@IT