Git
Eclipse
Subversion
TortoiseGit
git-svn

SVNな現場で自分だけGitを使う方法

はじめに

SVNが使用されている現場でも、自分のローカル環境だけはGitを使う事ができます。
Gitは分散型リポジトリなので、リポジトリがローカルとリモートに分かれています。この特性を利用して、リモートリポジトリにSVNを使用したまま、ローカルのみGitのリポジトリを導入する事ができるのです。
この記事では、そんな環境を作るための手順と、運用していく上での注意点を記載します。

自分だけGitを使おうとした経緯は、↓の記事に書いてますので、こちらも見てみてください。
SVNな現場に何も問題を感じていなかった俺が、自分だけGitを使ってみることにした理由

完成イメージ

↓こんな感じの運用を想定します。
git-svn.png
リモートリポジトリは、プロジェクトでずっと使っているSVN。これはそのまま残し、自分以外のチームメンバは従来通りSVNを利用してコミットしてもらいます。
一方、自分のPCにはGitをインストールしてローカルリポジトリを構築。ソースを修正したら、まずこのローカルリポジトリにコミット。それをSVNに反映(DCommit)していく流れになります。
SVNへの反映は、SVNからすると普通のコミットとなんら変わらないので、他のチームメンバにもバレません。別にバレてもいいのですがw

環境

  • windows10
  • eclipse(Neon 4.6.1)
  • TortoiseGit(2.6.0.0)
  • Git for Windows(2.16.1.4)

環境構築手順

gitクライアントをインストール

windowsでGitを使うために、まずはGitクライアントをインストールします。
実際にGitを操作する時は、私はGUIが好きなのでTortoiseGitを使います。
↓からダウンロードしてインストールしてください。
https://gitforwindows.org/
↓が参考になります。
http://www.curict.com/software/Windows10/Windows10_git.html

TortoiseGitをインストール

↑というわけなので、TortoiseGitもインストール。
https://tortoisegit.org/download/
↓なんかも参考に
http://www.main-function.com/entry/2017/05/02/001640

リポジトリをクローン

環境ができたら、SVNのリポジトリをローカルにコピーする事から始めましょう。この操作の事を「クローン」と言います。
私の現場では、いつも直接コミットしているのが「develop」というブランチなので、そこだけ持ってきます。
ローカルリポジトリを作りたいフォルダに移動し、右クリックメニューを開くと、TortoiseGitの操作系がいくつかあるので、「Gitクローン(複製)」を選びます。
↓に注意しながらクローン対象のリポジトリを選択してください。

  • developだけクローンしたいので、リポジトリ内のdevelopブランチまでを含めたURLを指定する
  • 「From SVN Repository」にチェック
  • 「Trunks」、「Tags」等のチェックは全て外す(既にブランチの階層まで指定しているため)

clone.png

eclipseにプロジェクトを作成

最近のeclipseにはGitプラグインが最初から入っていますので、インストールする必要はありません。「俺のにはないんだけど」という人は別途インストールしてください。

  1. 「Gitパースペクティブ」で「このビューへ既存のローカルGitリポジトリを追加」を押す(右上にアイコンがあるはず)
  2. さっきクローンしてきたローカルリポジトリを選択して「完了」
  3. ビューにリポジトリが追加されるので、右クリック→プロジェクトをインポート→既存プロジェクトのインポート

これで、プロジェクト・エクスプローラにプロジェクトがインポートされ、ソースを修正する準備ができました。
次から、実際にソースを修正する時の流れを説明します。

開発からコミットまで

トピックブランチ作成

まず最初にやる事は、トピックブランチを作る事です。ソースを触る前に、必ずブランチを切っておく事が重要です。そうする事によって、他の案件での修正には全く影響を及ぼさない、この案件だけの開発環境を保つ事ができます。
ここで言う案件とは、1つのバグ修正、1つの機能追加といった小さな単位を指しています。
例えば、追加機能の開発中にバグを見つけ、そっちを先にリリースする必要が出てきたとします。こういう時には、追加機能の修正はいったんコミットしておいて、バグ用のトピックブランチを作ります。そっちには追加機能の修正は一切反映されていない状態だから、バグの改修に専念する事ができます。バグの改修が終わったら、ブランチを切り替えて、また追加機能の開発に戻ってきましょう。
SVNだと、ブランチの切り替えはファイルのダウンロードや入れ替えが発生し、長い時間がかかりがちですが、Gitではそんな事はありません。すぐに切り替えられます。

eclipseでは、「プロジェクトを右クリック -> チーム -> 切り替え -> 新規ブランチ」で作れます。

newBranch.png

トピックブランチの名前は、ITS等に登録したIDや案件名を使うと良いでしょう。
このとき、「ソース」をmasterにしておく事を忘れないように。masterとは、全てのトピックブランチの親となる統合的なブランチです。
混乱しないように気を付けてください、masterもローカルリポジトリです。masterブランチとトピックブランチは、下記の役割分担で運用していきます。

  • masterブランチ -> リモートSVNとのやり取り、全てのトピックブランチの親
  • トピックブランチ -> トピック(案件)ごとの開発

ここがキモですから、何度でも言います。
トピックブランチは開発に専念します。ここから直接SVNにつないではいけません。SVNとのやりとりは、masterに任せます。

コミット(トピックブランチ)

ソースを修正したらコミットします。
全ての修正が完了するまで待つ必要はありません。どんどんコミットしましょう。だって、これはローカルリポジトリです。誰にも迷惑をかける心配はありません。
それに、コミットしておけば、何か間違えた時にいつでも前のコミットに戻る事ができます。もちろんdiffだって取れますから、小さな作業単位でコミットしておいた方が何かと便利です。このあたりは、GitとSVNで文化が異なる部分ですね。
そうそう、SVNと違って「ステージング」という段階もあるので、事前に理解しておきましょう。

マージ

トピックブランチでの開発が完了したら、masterにマージします。

  1. masterブランチに切り替え
  2. 右クリックメニューから「チーム -> マージ」を選択
  3. 「ローカル」からマージ対象のトピックブランチを選択、マージオプションは「スカッシュ」を選択

merge.png

「スカッシュ」を選択しておく事で、何度もコミットした内容を1つにまとめてマージする事ができます。だから、トピックブランチにどんなにコミットしていても、masterにはきれいに1つのコミットだけを残す事ができます。

コミット(master)

マージした内容をコミットします。
混乱しないようにしてください。先の手順でコミットしたのは、トピックブランチへのコミット。ここでは、masterブランチにコミットします。どちらもローカルリポジトリの話です。
コミットコメントには、1行目にITSの課題番号を入れておきましょう。次の手順でいよいよSVNへ反映しますが、その時にはここで入れたコメントがそのまま使われるようです。

SVNにdcommit

SVNにGitのコミットを反映させる事を、dcommitといいます。
ここはeclipseではできないようなので、TortoiseGitを使ってやってみます。
TortoiseGitは、windowsのエクスプローラーに一体化しているので、エクスプローラーでプロジェクトのフォルダを右クリックしてみましょう。
「TortoiseGit」というカテゴリが出てきますので、そこから「ログを表示」を選択します。
おっと、その前にmasterブランチに切り替えておくのを忘れないように。eclipseで切り替えてあれば、TortoiseGitでも切り替えた状態になっています。切り替えてなければ、TortoiseGitでも右クリックメニューから「切り替え」で切り替える事ができます。

tortoiseGitLog.png

「git-svn」と印がついているリビジョンが、現在のSVNのバージョン。「master」は、もちろんmasterブランチのリビジョンです。
「master」リビジョンを選択し、下部ペインでリソースごとの差分を確認。OKなら右クリックメニューから「SVNへコミット(リモートへ反映)」を選んでdcommitします。
SVNを使ってコミットした場合と同じように、SVNにはリビジョンが追加されます。

その他の運用

リモートsvnに変更が入ったら

リモート側のSVNは、自分以外の人もコミットしますから、ローカルのGitにないリビジョンがどんどん増えていきます。これはローカル側にも取り込む必要があります。SVNでは「更新」していましたね。
ローカルのみGitを使っている今回のモデルでは、リベースを使います。

  1. masterブランチに切り替え
  2. エクスプローラーでプロジェクトのフォルダを右クリック
  3. TortoiseGit -> SVNリベース(ローカルへ反映)を選択

リベースとは、本来なんぞや?という疑問は、他に良い解説記事があると思いますから、そちらに譲ります。

さらにトピックブランチへ取り込む

SVNリベースは、masterブランチだけで実施した方が良いようです。
リモートSVNとのやり取りは、masterブランチの担当でしたね。これを守らないと、リビジョンの関係性が複雑になり、最悪リポジトリが壊れる事があるようです。
トピックブランチに最新のリビジョンを取り込むには、SVNリベースしたmasterからリベースします。

  1. トピックブランチに切り替え
  2. eclipseでプロジェクトを右クリック -> チーム -> リベース
  3. リベースのダイアログから、ローカル -> masterを選択
  4. 「リベース」ボタンを押下

rebase.png

未コミットの変更はスタッシュする

コミットしていない変更がある状態で、ブランチの切り替えやリベースをすると、変更が失われてしまいます。
コミットをしてから切り替えるのが基本ですが、中途半端な状態で切り替えたくない場合もあるでしょう。
そんな時はスタッシュです。
スタッシュをしておくと、未コミットの変更を一時的に保存してくれるので、そのブランチにまた戻ってきた時に元に戻す事ができます。
実際には、特に意識しなくても大丈夫。切り替えやリベースをしようとした時にeclipseが警告してくれるので、指示に従うだけでスタッシュできます。

参考になったサイト

git-svnを使うときのベストプラクティス
Eclipse EGit の使い方