SEワンタンの独学備忘録

IT関連の独学した内容や資格試験に対する取り組みの備忘録

【Git】SVNリポジトリをGitリポジトリに移行する

ここしばらく、バージョン管理ツールに関する勉強を行っていますがその続きで、SVNリポジトリからGitリポジトリへの移行をおこないます。

今回やりたいこと

タイトルの通りですが、VirtualBox(Linux)に構築したSVNリポジトリを新規作成するGitリポジトリへ移行します。

f:id:wantanBlog:20191015231041p:plain

↓↓↓↓

f:id:wantanBlog:20191015231110p:plain

繰り返しになりますが、メインはLinux上のSVNからGitへの移行。
Widnows側についてはおまけでやれるとこまでやります。
SVNリポジトリにはバツをつけてますが、特に廃棄等せずにそのまま残し続けます。

なにがやりやすいかなぁって少し調べたところ、若干手抜きですが準備が整っているホストマシン経由でやる方法にしようと思います。
SVNリモートリポジトリ→(クローン)→Gitローカルリポジトリ→(プッシュ)→Gitリモートリポジトリって流れです。

後から思いましたが、この方法はSVNリポジトリが既に十分に使用されリビジョンが積まれている場合、ホストとサーバ間のクローンとプッシュが重くてあまり現実的じゃないのかもしれません。

Linux上にGitリポジトリを作成する

まずは移行先となるGitリポジトリを作成からです。

ちなみに私の場合はGit自体はLinuxにインストール済みです。
インストールは以下の記事で行っています。

www.wantanblog.com

Gitリポジトリの作成自体も上記の記事で行った操作になぞって復習がてら新規リポジトリを作成します。

任意の名前でGitリポジトリを作成する。

mkdir /home/wantan/work/svngit.git

作成したGitリポジトリをカレントディレクトリにする(移動)。

cd /home/wantan/work/svngit.git

共有リポジトリの作成

git init --bare --shared

SVNリポジトリからホストマシンにクローンする

この操作に関しても前回の操作でやってますね。詳細は以下参照です。

www.wantanblog.com

WidnowsにGitとTortoiseGitがインストールされているのが前提です。

TortoiseGitを用いてSVNリポジトリからローカルリポジトリへのクローン。

f:id:wantanBlog:20191015235056p:plain

クローンの完了を待ちます。

f:id:wantanBlog:20191015235240p:plain

ふむ、一回やってるだけあってスムーズに進みます。

ローカルリポジトリからGitリモートリポジトリにプッシュする

ここからは初めての操作です。

ローカルリポジトリの最上階層でTortoiseGitでプッシュを選択します。

f:id:wantanBlog:20191015235956p:plain

入力画面で宛先となるGitリポジトリを指定してとりあえず実行してみます。

f:id:wantanBlog:20191016000458p:plain

ユーザ名(Linuxの)とパスワードを入力して。

やった!うまくいかない。

f:id:wantanBlog:20191016000656p:plain

git.exe push --progress "ssh://192.168.56.102/home/wantan/work/svngit.git" master

Enumerating objects: 349, done.
Counting objects: 100% (349/349), done.
Delta compression using up to 8 threads
Compressing objects: 100% (300/300), done.
remote: fatal: Unable to create temporary file '/home/wantan/work/svngit.git/./objects/pack/tmp_pack_XXXXXX': 許可がありません
fatal: sha1 file '' write error: Broken pipe
error: remote unpack failed: index-pack abnormal exit
error: failed to push some refs to 'ssh://192.168.56.102/home/wantan/work/svngit.git'


gitは正常に終了しませんでした (終了コード 1) (16984 ms @ 2019/10/16 0:13:42)

なんだろうとワクワクしながら調べましたが実にくだらない原因でした。
Linux上でGitリポジトリをrootユーザで作成してしまったため権限がなかった だけです。

リポジトリの所有者をまるっと変更したらあっさり。。

f:id:wantanBlog:20191016004353p:plain

なくてもいいミスでしたね。

リモートリポジトリを確認したら、プッシュに成功している様子。

Eclipseの参照リポジトリをSVNからGitへ切り替える

今の状態はEclipseのワークスペースのソースがVirtualBox上のSVNリポジトリとリンク(?リンクっていうのが正しいのかは分からない)している状態です。

Eclipse上でのワークスペースのソースを残して、SVNリポジトリから切断→Gitローカルリポジトリと接続みたいなことをやろうとしたのですが、いまいちやり方が分からず断念しました。

なので今回は元々あるSVNリポジトリに接続したものはそのままに(プロジェクト名が被るので名前で変更した)Gitリモートリポジトリからクローンで妥協したいと思います。


今回はGitリモートリポジトリにリンクさせます。
若干イメージを勘違いしていたのですが、EclipseではGitリモートリポジトリを指定して、ここでEclipse用のローカルリポジトリを作成するイメージですかね。

Eclipseのメニューのファイル>インポートを選択します。
ここでGitからプロジェクトを選択。

f:id:wantanBlog:20191017002451p:plain

ここではクローンURIを選択しました。状況によっては他のものでももちろんできると思います。

f:id:wantanBlog:20191017002609p:plain

まずはURIにsshプロトコル形式でリモートリポジトリ(.git)を指定します。

f:id:wantanBlog:20191017002925p:plain

下部のポート番号やユーザ情報を入力するとURIは自動で補完してくれるようです。
ユーザは普通にLinuxユーザの情報で大丈夫です。

f:id:wantanBlog:20191017003118p:plain

今はmasterブランチしかないのでそのままです。

f:id:wantanBlog:20191017003317p:plain

ディレクトリーやリモート名は任意です。
注意点は「サブモジュールのクローン」の部分でしょうか。

私は当該プロジェクトがMavenプロジェクトですがチェックをつけずにインポートするとうまくプロジェクトとして構築されませんでした。プロジェクトの種類というよりはGitリポジトリの構成の問題でしょうか。
そのままインポートすると、svngitが最上位階層(プロジェクト)と認識され本来のプロジェクトがその下のサブフォルダという構成でインポートされました。なので私の場合ここはチェックをつけました。

f:id:wantanBlog:20191017003931p:plain

ここは既存プロジェクトを選択、検証しきれてないので求める構成によって違うかもしれません。

f:id:wantanBlog:20191017004013p:plain

ここはデフォルトのままでいきました。

f:id:wantanBlog:20191017004146p:plain

プロジェクト構成も問題なくインポートできてそうです。

f:id:wantanBlog:20191017004521p:plain


かるーく動作確認。

適当なファイルを修正して、右クリックのチームから索引へ追加→コミット。

ローカルリポジトリへのコミットは正常に完了。

今度はプッシュします。
Gitリポジトリのビューから対象のローカルリポジトリで右クリックしてブランチのプッシュを選択します。

ここでもコミットがされていることが確認できます。プレビューを押下します。

f:id:wantanBlog:20191017005246p:plain

内容を確認して問題ないようならいざプッシュ!

f:id:wantanBlog:20191017005439p:plain

プッシュ完了しました!問題ありません!!


お疲れ様でした。
とりあえずここまでで、SVN絡みでGitのやりたいことはだいたいできたので次回はGitHubについてかな。またはGitの操作についてもう少し詳しく。