こんにちは。
キャスレーコンサルティングのSI(システム・インテグレーション)部の長岡です。

前回のブログ「Git 初心者による EGit 入門」で触れたEGit で対応出来ないリファクタリング操作について、Git コマンドを使って初心者でも簡単に出来るようにご紹介します。

目次

  • SVN からGit への移行方法
  • 別のリポジトリをサブディレクトリに取り込む方法

SVN からGit への移行方法

SubversionのリポジトリからGitHubのリポジトリに移行したい場合は、下記の手順を行います。

前提条件

SVNリポジトリ、GitHubリポジトリは作成済みである事とします。

ローカルにsvn のcloneブランチ作成

SubversionのリポジトリをGitへ移行したい場合は、Git と Subversion を双方向にブリッジする git svnコマンドを使います。
git svn cloneを使って、svn のcloneブランチ作成します。
git svn cloneを使う場合は、–prefixオプションで接頭辞を付けましょう。

$ git svn clone -s --prefix svn/ <svnのURL>

$ cd <clone先ディレクトリ>

$ git branch -a
* master
  remotes/svn/tags/v1.0.0
  remotes/svn/trunk
  remotes/svn/v1.x

SVN側が標準ディレクトリ構成(Trunk, branches, tags)のリポジトリの場合はこれでよいが、標準的なディレクトリ名を使っていない場合は、-T/-t/-b(もしくは–trunk/–tags/–branches)で指定しましょう。

$ git clone -s --prefix svn/ -T dev -t release -b support <svnのURL>

git svnコマンドでfile://でローカルパスを設定する場合にドライブ文字に:を付けてはいけません。

# NG
$ git clone -s --prefix svn/ file:///C:/work/SVN/repository/tutorial

# OK
$ git clone -s --prefix svn/ file:///C/work/SVN/repository/tutorial

リモートリポジトリを設定

まだローカルリポジトリにあるだけなので、リモートリポジトリを追加します。

$ git remote add origin <GitHubのURL>

$ git remote -v
origin  <GitHubのURL> (fetch)
origin  <GitHubのURL> (push)

リモートリポジトリへプッシュ

後はpushをして完了です。

$ git push -u origin --all

別のリポジトリをサブディレクトリに取り込む方法

以下のリポジトリを

child-project
  |-folderA
  |-folderB
  |-.git

以下のようなディレクトリ構造にリファクタリングしたい。

parent-project
  |-.git
  |-  child-project
        |-folderA
        |-folderB

このようにリポジトリのサブディレクトリに、別のリポジトリを取り込みたい場合は、下記の手順を行います。

取込先にサブディレクトリを作成

取込先をcloneした後、clone先ディレクトリに移動し、サブディレクトリ(child-project)を作成します。

$ git clone <GitHubのURL>
$ cd <clone先ディレクトリ>
$ mkdir child-project

取込元をremoteに登録

取込元のリモートリポジトリを追加します。

$ git remote add child-project git@github.com:atomkun/child-project.git

$ git remote -v
child-project   <GitHubの取込元URL> (fetch)
child-project   <GitHubの取込元URL> (push)
origin  <GitHubの取込先URL> (fetch)
origin  <GitHubの取込先URL> (push)

取込元の情報をfetch

取込元「child-project」の情報をfetchします。

$ git fetch child-project

取込元と取り込み先をマージ

fetchして持ってきたchild-projectリポジトリのmasterブランチをchild-projectフォルダにマージ

$ git merge -X subtree=child-project child-project/master

# ログ履歴が反映されたか確認
$ git log --graph --pretty='format:%C(yellow)%h%Creset %s %Cgreen(%an)%Creset %Cred%d%Creset'

push

最後にpushをして完了です。

$ git push

最後に

如何でしたでしょうか?
開発を行っているとバージョン管理システムを変更しよう、リポジトリを統合しようという状況は必ず訪れると思います。
確実に身に着け、焦らず行いましょう!

それではここまで読んでいただきありがとうございました。