SVNリポジトリをGitLabリポジトリに移行
今回はバージョン管理システムをSVN(Subversion)から、GitLabに移行する手順について調べたので、まとめていきたいと思います。
SVNで管理しているプロジェクトを、Gitのバージョン管理システムに乗り換えたいと考えている方は、ぜひ参考にしてみてください。
SVNとGitの違いは?
SVNは**「集中型リポジトリ」**と呼ばれ、サーバーにインストールしたリモートリポジトリのみが、バージョンを管理します。
そのため開発は、自分のローカル環境にリモートリポジトリをチェックアウト(ダウンロード)して、変更したい差分をリモートリポジトリへコミットをするといった流れになります。
一方Gitは**「分散型リポジトリ」**と呼ばれ、開発環境それぞれでローカルリポジトリを作成し、そのローカルリポジトリでバージョンを管理します。
開発は、自分のローカル環境にリモートリポジトリをクローン(コピー)してローカルリポジトリを作り、ローカルリポジトリに変更した差分をコミット後リモートリポジトリにプッシュするといった、二段構造になります。
SVNと違ってGitの何がいいの?
SVNとGitを比較する記事はたくさんありますが、大きなメリットはコミットとブランチにあります。
SVNだと、コミット=変更の反映となってしまうので、全ての変更が完了しないとコミットできず、コミット単位が大きくなってしまうという問題があリます。(確認作業が大変)
一方Gitは自分のローカルリポジトリのため、変更したら一部分でもコミットでき、開発のしやすさという点で大きなメリットがあります。
また、作業ごとにブランチを簡単にきれるので(SVNでもブランチはきれるが制約やらなんやらで大変らしい)、リモート開発環境に影響を与えず自由にコードを変更できるという点も大きなメリットです。
GitHubとGitLabの違いは?
詳しく言及しませんが、GitHubとGitLabのどちらかを導入するにあたっての大きな違いの一つに、ホスティングがあります。
GitHubでは、GitのリモートリポジトリがGitHubのサーバーになり、そこでコードを保管していくことになります。
一方Gitlabでは、自社でサーバーをたててソースコードを管理するセルフホストが可能なので、ソースコードは自社サーバーに保管できます。
**「セキュリティの問題でGitHubは使えないけど、バージョン管理のシステムは導入したい」**といった企業がGitLabを利用しているようです。
他にもGitLabでは、プライベートでの公開設定が無料などの違いもあります。
SVNリポジトリ構築とWebDaV設定
ここからは具体的な導入方法の手順に関して、まとめていきたいと思います。
まずは、SVNリポジトリ構築とWebDaVの設定をしていきます。
WebDaVについては、前回の記事でまとめたので、パスワード設定などをしたい方はこの記事を参考にしてみてください。
SVNインストール
まず、Gitlbabに移行するためのSVNのリポジトリを、apache導入済みのCentOS7のサーバーに作成します。
SVNをインストール
# yum install subversion
確認
# svnserve --version
SVNリポジトリ・ディレクトリ作成
次にSVNリポジトリを作成し、そのリポジトリにディレクトリを3つ作成していきます。
またテスト用としてディレクトリ下にテキストファイルを作成します。(GitLab移行時に空のディレクトリのあるものは、git svn fetchで認識されなくなるため)
その後Apacheプロセスが、SVNのリポジトリにアクセスできるように、/svn_repo/test_repo/の権限設定を変更します。
作業ディレクトリを作成
# mkdir /svn_repo/test_repo/
リポジトリを作成
# svnadmin create --fs-type fsfs /svn_repo/test_repo/repo
リポジトリのディレクトリ作成
# svn mkdir file:///svn_repo/test_repo/repo/code -m "create"
# svn mkdir file:///svn_repo/test_repo/repo/document -m "create"
# svn mkdir file:///svn_repo/test_repo/repo/operation -m "create"
テストテキストファイル作成(document,operationディレクトリも適当に名前を変えて作成)
# echo "test">test.txt
# svn import test.txt file:///svn_repo/test_repo/repo/code/test.txt -m "import" --username test1
# svn list file:///svn_repo/test_repo/repo/code
apacheプロセスに権限を設定し確認
# chown -R apache:apache /svn_repo/test_repo/
# ls -l /svn_repo/test_repo/
SVN設定ファイル作成
次にSVNの設定ファイルを編集し、認証されたユーザーはファイルの読み込み・書き込みを可能にします。
SVN設定ディレクトリに移動
# cd /svn_repo/test_repo/repo/conf
設定ファイルを編集
# vi svnserve.conf
# 認証されたアクセスは読み書き可能
[general]
anon-access = none
auth-access = write
# ACLファイル
authz-db = authz
ACLファイルを編集
特定のユーザやグループに対して権限を設定する(アクセスをコントロールする)ACLファイルを作成し、編集します。
# cd /svn_repo/test_repo/repo/conf/
# vi authz
# ここでは全員読み書き可で設定
[/]
* = rw
ApacheのWebDav設定
SVNのWebDavモジュールインストール後、ドキュメントルート下のローケションの設定などをし、WebDAVの機能をONにします。
その後、apacheを再起動。
# yum install mod_dav_svn
# vi /etc/httpd/conf.d/dav_svn.conf
<Location /svn_repo>
DAV svn
SVNPath /svn_repo/test_repo/repo
AuthzSVNAccessFile /svn_repo/test_repo/repo/conf/authz
</Location>
# systemctl restart httpd
ドキュメントルートを修正しSVN起動
/svn_repo/test_repo/repoとURLに打ち込むのは長いので、SVNのドキュメントルート(仮想ルート)を修正します。
そしてSVNを起動し、http;//SVNアドレス/svn_repoに、WebDav形式の表示がされていたら成功です。
# vi /etc/sysconfig/svnserve
# 既存のものをコメントアウトもしくは消す
# OPTIONS="-r /var/svn"
OPTIONS="-r /svn_repo/test_repo/repo/"
# systemctl enable svnserve
# systemctl start
SVNリポジトリをGitLabリポジトリに移行
ようやくここから本題である、構築したSVNリポジトリをGitLabリポジトリに移行する手順に関してまとめていきます。
自分のローカル環境にGitインストール
まず自分のローカル環境にgitをインストールし、確認します。
$ brew update
$ brew install git
$ git --vesion
ローカル環境にSVNリポジトリをクローンする
ローカル環境に新しくフォルダを作成し、SVNリポジトリをクローンします。
また変更情報の各リビジョン(コミット情報)もfetchで取得。
$ mkdir svn_repo
$ cd svn_repo
$ git svn init --prefix=svn/ http://SVNリポジトリ名
$ git svn fetch
GitLabに空のリポジトリ作成
手動でGitLabにログインし、新しく空のリポジトリ(Project)を作成します。
GitLabリポジトリーにSVNリポジトリをプッシュ
先ほど作成したフォルダ(ローカルリポジトリ)で、GitLabで作成したリポジトリ情報を取得します。
GitLabのリポジトリ情報は、GitLabのCloneタブをクリックし、SSHかHTTPSかを各環境に合わせて選び、URLをコピーしてください。
そして、ローカル環境内のSVNリポジトリをプッシュします。
$ git remote add origin GitLabクローンURL
$ git push -u origin master
成功したら、GitLabのページにいき、リポジトリやコミット履歴が反映されているのか確認してください。
無事反映されていたら、SVNリポジトリからGitLabリポジトリに移行完了です。
参考文献
SVN、Git、GitHub、GitLabについて
https://qiita.com/YusukeHosonuma/items/14c59f3878d640a401a1
https://www.ricksoft.jp/blog/archives/9483/
http://blog.livedoor.jp/tallgeese7/archives/52957242.html
https://developers.gnavi.co.jp/entry/gitlab
https://tech-camp.in/note/technology/44434/
SVN構築について
https://qiita.com/y-araki-qiita/items/486c9c52cda0cfa4ce0c
https://qiita.com/ohuron/items/d902ee3b8037abe8f09b
GitLabリポジトリ移行について
https://pig-log.com/migration-git-svn/