SVNリポジトリをGitLabリポジトリに移行する勧め

# 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については、[前回の記事](https://qiita.com/rui-watanabe/items/ef15f4fe97a55c0f51f3)でまとめたので、パスワード設定などをしたい方はこの記事を参考にしてみてください。



##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/