LoginSignup
60
89

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-04-12

はじめに

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 の使い方

60
89
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
60
89