ここしばらく、バージョン管理ツールに関する勉強を行っていますがその続きで、SVNリポジトリからGitリポジトリへの移行をおこないます。
- 今回やりたいこと
- Linux上にGitリポジトリを作成する
- SVNリポジトリからホストマシンにクローンする
- ローカルリポジトリからGitリモートリポジトリにプッシュする
- Eclipseの参照リポジトリをSVNからGitへ切り替える
今回やりたいこと
タイトルの通りですが、VirtualBox(Linux)に構築したSVNリポジトリを新規作成するGitリポジトリへ移行します。
↓↓↓↓
繰り返しになりますが、メインはLinux上のSVNからGitへの移行。
Widnows側についてはおまけでやれるとこまでやります。
SVNリポジトリにはバツをつけてますが、特に廃棄等せずにそのまま残し続けます。
なにがやりやすいかなぁって少し調べたところ、若干手抜きですが準備が整っているホストマシン経由でやる方法にしようと思います。
SVNリモートリポジトリ→(クローン)→Gitローカルリポジトリ→(プッシュ)→Gitリモートリポジトリって流れです。
後から思いましたが、この方法はSVNリポジトリが既に十分に使用されリビジョンが積まれている場合、ホストとサーバ間のクローンとプッシュが重くてあまり現実的じゃないのかもしれません。
Linux上にGitリポジトリを作成する
まずは移行先となるGitリポジトリを作成からです。
ちなみに私の場合はGit自体はLinuxにインストール済みです。
インストールは以下の記事で行っています。
Gitリポジトリの作成自体も上記の記事で行った操作になぞって復習がてら新規リポジトリを作成します。
任意の名前でGitリポジトリを作成する。
mkdir /home/wantan/work/svngit.git
作成したGitリポジトリをカレントディレクトリにする(移動)。
cd /home/wantan/work/svngit.git
共有リポジトリの作成
git init --bare --shared
SVNリポジトリからホストマシンにクローンする
この操作に関しても前回の操作でやってますね。詳細は以下参照です。
WidnowsにGitとTortoiseGitがインストールされているのが前提です。
TortoiseGitを用いてSVNリポジトリからローカルリポジトリへのクローン。
クローンの完了を待ちます。
ふむ、一回やってるだけあってスムーズに進みます。
ローカルリポジトリからGitリモートリポジトリにプッシュする
ここからは初めての操作です。
ローカルリポジトリの最上階層でTortoiseGitでプッシュを選択します。
入力画面で宛先となるGitリポジトリを指定してとりあえず実行してみます。
ユーザ名(Linuxの)とパスワードを入力して。
やった!うまくいかない。
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ユーザで作成してしまったため権限がなかった だけです。
リポジトリの所有者をまるっと変更したらあっさり。。
なくてもいいミスでしたね。
リモートリポジトリを確認したら、プッシュに成功している様子。
Eclipseの参照リポジトリをSVNからGitへ切り替える
今の状態はEclipseのワークスペースのソースがVirtualBox上のSVNリポジトリとリンク(?リンクっていうのが正しいのかは分からない)している状態です。
Eclipse上でのワークスペースのソースを残して、SVNリポジトリから切断→Gitローカルリポジトリと接続みたいなことをやろうとしたのですが、いまいちやり方が分からず断念しました。
なので今回は元々あるSVNリポジトリに接続したものはそのままに(プロジェクト名が被るので名前で変更した)Gitリモートリポジトリからクローンで妥協したいと思います。
今回はGitリモートリポジトリにリンクさせます。
若干イメージを勘違いしていたのですが、EclipseではGitリモートリポジトリを指定して、ここでEclipse用のローカルリポジトリを作成するイメージですかね。
Eclipseのメニューのファイル>インポートを選択します。
ここでGitからプロジェクトを選択。
ここではクローンURIを選択しました。状況によっては他のものでももちろんできると思います。
まずはURIにsshプロトコル形式でリモートリポジトリ(.git)を指定します。
下部のポート番号やユーザ情報を入力するとURIは自動で補完してくれるようです。
ユーザは普通にLinuxユーザの情報で大丈夫です。
今はmasterブランチしかないのでそのままです。
ディレクトリーやリモート名は任意です。
注意点は「サブモジュールのクローン」の部分でしょうか。
私は当該プロジェクトがMavenプロジェクトですがチェックをつけずにインポートするとうまくプロジェクトとして構築されませんでした。プロジェクトの種類というよりはGitリポジトリの構成の問題でしょうか。
そのままインポートすると、svngitが最上位階層(プロジェクト)と認識され本来のプロジェクトがその下のサブフォルダという構成でインポートされました。なので私の場合ここはチェックをつけました。
ここは既存プロジェクトを選択、検証しきれてないので求める構成によって違うかもしれません。
ここはデフォルトのままでいきました。
プロジェクト構成も問題なくインポートできてそうです。
かるーく動作確認。
適当なファイルを修正して、右クリックのチームから索引へ追加→コミット。
ローカルリポジトリへのコミットは正常に完了。
今度はプッシュします。
Gitリポジトリのビューから対象のローカルリポジトリで右クリックしてブランチのプッシュを選択します。
ここでもコミットがされていることが確認できます。プレビューを押下します。
内容を確認して問題ないようならいざプッシュ!
プッシュ完了しました!問題ありません!!
お疲れ様でした。
とりあえずここまでで、SVN絡みでGitのやりたいことはだいたいできたので次回はGitHubについてかな。またはGitの操作についてもう少し詳しく。