SVN使いにはめっきり肩身が狭い今日この頃です。まぁ開発やってないんですが。。。
いろんなところで、SVNからGitに移行したいという話をよくききます。今回も例のごとく移行の依頼を受けて手順をまとめたのでメモを残します。
ぴぐろぐではエラーというエラーは発生せずに移行することができましたが、Web上の情報では環境に依存して(特にSVNのレイアウトによっては)エラーがでることがあるようなので実際に移行する場合はよく検証してから実施してくださいね。もちろんログ(履歴)も移行できます。
SVNリポジトリをGitに移行する最も簡単な方法
以下の環境で実施しています。
- SVNリポジトリ(CentOS)
- Gitリポジトリ(CentOS/GitLab)
Git は GitLab と BacklogのGit への移行を試しましたが、どちらも同じように移行できました。 - 作業用マシン(Windows10)
このマシンには、以下をインストールしておきます。それぞれバージョンを控えておくべきでしたが忘れました。。。
1.TortoiseGit
2.Git(&GitBash)
SVNをGitに移行する手順
おおよそ、以下の手順で実施していきます。
- SVNリポジトリを作業用マシンにgit svnでクローン
- Gitリポジトリに追加&プッシュ
以上、これだけ。イメージで表すと以下。
作業用マシンにクローンする
まずは、作業用マシンにリポジトリ用のフォルダを作成します。
適当なフォルダで、右クリックから 新規作成>フォルダ でOK。
作成したフォルダに GitBash で接続します。右クリックしたときのメニューに GitBash here が表示されていればそれでOK。表示されていなければGitBashを起動して、作成したフォルダに移動する。
クローンする際は、「git svn init」 +「git svn fetch」を利用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ git svn init --prefix=svn/ http://172.16.10.100/repos/REPOSITORY_NAME Initialized empty Git repository in D:/work/testrepo/REPOSITORY_NAME/.git/ $ git svn fetch Authentication realm: <http://172.16.10.100:80> Authorization Realm Authentication realm: <http://172.16.10.100:80> Authorization Realm A redmine_Backup.sh r1 = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (refs/remotes/svn/git-svn) M redmine_Backup.sh r2 = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (refs/remotes/svn/git-svn) M redmine_Backup.sh r3 = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (refs/remotes/svn/git-svn) Checked out HEAD: http://172.16.10.100/repos/REPOSITORY_NAME r3 |
既出の情報ですが「git svn clone」でも複製できます。が、エラーになった場合に途中から再開できない。init -> fetch で複製すると再開したいリビジョン番号を指定して再開できます。ぴぐろぐではエラーにならずにクローンできましたが、コマンドとしては以下でいけます。
1 |
$ git svn fetch -r xxxx:HEAD |
xxxxは再開したいリビジョン番号を指定します。例えば、リビジョン1000でエラーになって解決できない場合は、1000はあきらめて、1001から再開する、といった具合で使います。
空ディレクトリがあった場合
git svn fetch をすると以下のように "creating empty directory~" というメッセージが表示されることがあります。
1 2 3 4 |
$ git svn fetch : : creating empty directory: bin/hoge/foo/bar |
Gitでは空のフォルダ・ディレクトリを維持できません。なので、Gitリポジトリに追加する前に、”.gitkeep” または、”.gitignore”というファイルを作成しておくことで問題を回避できます。
両者ファイルの意味についてはこちらの説明がわかりやすかったです。
クローンしたはいいがSVNのステータスが緑にならない場合
リベースすると解決することがあります。ローカルのリポジトリとSubversionのリポジトリを同期する操作です(git pull相当)。
なので、git svn fetchが完了後に、フォルダに表示されるステータスのアイコンがすべて正常(緑のチェックマーク)なら不要かもしれません。やってみた結果は以下。
同期されている(更新がない)場合
1 2 |
$ git svn rebase Current branch master is up to date. |
同期されていなかった(更新がある)場合
1 2 3 4 5 |
$ git svn rebase A redmine_Backup.sh r4 = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx (refs/remotes/svn/git-svn) First, rewinding head to replay your work on top of it... Fast-forwarded master to refs/remotes/svn/git-svn. |
これでクローンが終わりです。
Gitリポジトリに追加
ローカル環境にクローンしたリポジトリをリモートのGitリポジトリに移行します。
まずは、Gitサーバ側でリポジトリを作成しておきます。作成したGitリポジトリのパスを控えておきます。
続いて、Gitリポジトリに追加&リモートにプッシュします。
GitBashでクローンしたフォルダに移動して、以下を実行します。Gitのパスは作成したGitリポジトリのパスを指定します。
1 |
$ git remote add origin http://192.168.20.200/repo/REPOSITORY_NAME.git |
うまくいけば、プロンプトには何も返ってきません。
続いて、プッシュします。
1 2 3 4 5 6 7 8 9 10 |
$ git push -u origin master Enumerating objects: 16, done. Counting objects: 100% (16/16), done. Delta compression using up to 4 threads. Compressing objects: 100% (16/16), done. Writing objects: 100% (16/16), 2.75 KiB | 705.00 KiB/s, done. Total 16 (delta 6), reused 0 (delta 0) To http://192.168.20.200/repo/REPOSITORY_NAME.git * [new branch] master -> master Branch 'master' set up to track remote branch 'master' from 'origin'. |
移行作業はこれで終わりです。TortoiseGit などで接続してみましょう。
まとめ
Web上にはいろいろやり方が紹介されていますが、今回の方法はGit初心者にも理解しやすくて作業項目的にも簡単かと思います。
Git のコマンド操作って日常的にGitを使っていないとなかなかイメージしずらいこともあると思いますが、この方法の場合はほとんどがWindowsのGUI操作なので、作業全体の流れも理解しやすいかと思います。
では、よいバージョン管理ライフをっ!
↓↓↓とりあえずコレよんどけ