【仕事】【ゲーム開発】SVN環境のプロジェクトでgit-svnを使わずに、自分だけSourceTree(Git)を使う方法

2020-09-23

◎はじめに
ここで解説する方法は、以下のような方向けです。
・Gitは問題なく使える(派生ブランチやマージ機能はもちろん、リベース等も理解している)
・SVNはあらかた使える(とりあえず、更新とコミットは出来る)
・git-svn機能は環境に問題があって使えなかった。

◎あらすじ
バージョン管理ツールには大きく分けてSVNとGitがあります。
その特徴は大雑把に言って以下の通りです。

・SVN:シンプルな構成。Gitと比較的かゆいところに手が届かない。
・Git:SVNよりも多機能。昨今の世界なメジャー。SVNと比較的複雑で学習コストが高い

このことから、SVNで慣れ親しんだ中堅エンジニアが多い、それなりの歴史がある会社で、
・SVNでも十分にバージョン管理できる
・そのため、Gitの習得と導入でコスト対効果を得られにくい
・結局Git導入を先送りにする
…という悪循環が生まれやすい。

僕が経験してきた派遣先プロジェクトは4件だが、
そのうち2件がこれに当てはまる。

結局のところ、Gitの欠点は学習コストが高いところだけなので、
僕のように、SVNもGitも両方使えるエンジニアからすれば、
「わざわざSVNを使う利点がない。使えるならGitを使いたい。」
という気持ちにさらされる。

そんな人の気持ちに応えてくれるのが git-svn だ!
なんと、リモートではSVNのままローカルでGitを使うことが出来る
夢のシステムなのだ!…

…が!
夢は夢に潰えることもある。
git-svnのシステムはやけに不具合が多い。

俺が体験したのはこんな感じ。
・SVNとgit-svnのバージョンが合わないことで起きる不具合がある。
・Windows環境のリポジトリ指定で、”File://”を使った時の挙動が怪しい
・mysys2等でunix環境を経由してリポジトリを落としても、
 SoruceTreeを使ってコミットやマージが出来ない(樹形図は見れた)

…とにかく、可視化できていない問題も多そうなので、
git-svnを使う方法はあまりお勧めできない。

無理にgit-svnを使って会社のリモートリポジトリをぶっ壊した!
…なんてことになったら、賠償問題にまで発展しかねない。
…とにかくやばい!

なので、今回お勧めする方法は、
「SVNもGitも両方使う。」という方法だ。
今回はこの方法について解説する。

使用環境は以下の通り。
・TortoiseSVN(SVN)
・SourceTree(Git)

先ほどお伝えしたgit-svnを利用する方法なら、
SVNリポジトリにGitでアクセスすることになるが、

今回の方法では【RemoteSVN~LocalSVN兼RemoteGit~LocalGit】というように
3段階にするので、git-svnの問題とおさらばできるというわけです。

フォルダの構成は以下のようにします。

・リモート共有のフォルダ
└RemoteSVN:プロジェクトメンバーで共有のSVNリモートリポジトリ

・ローカル環境のフォルダ
├・RemoteGIT:SourceTreeでマージチェックするためのリポジトリ
│└・LocalSVN:TortoiseSVN で RemoteSVN をチェックアウトしたフォルダ
└・LocalGIT:実際に作業するリポジトリ

◎チェックアウト手順
■ TortoiseSVN
① LocalSVN に RemoteSVN を チェックアウトします
■ SourceTree
② RemoteGIT を GITリポジトリとして登録します
③ RemoteGIT に svn/revブランチを作り、今の作業状態をコミットします
④ RemoteGIT の svn/revブランチから git/developブランチを派生させます
⑤ LocalGIT に RemoteGIT をクローンします
⑥ LocalGIT で RemoteGIT の git/developブランチをチェックアウトした git/local_developブランチを作成します

◎プル手順
■ TortoiseSVN
① LocalSVN に RemoteSVN の状態を更新します
■ SourceTree
② RemoteGIT の svn/revブランチに、今の作業状態(SVN更新分)をプッシュします
③ LocalGIT の git/local_developブランチを RemoteGIT の git/developブランチにリベースします

◎プッシュ手順
■ TortoiseSVN
① LocalSVN に RemoteSVN の状態を更新します
■ SourceTree
② RemoteGIT の svn/revブランチに、今の作業状態(SVN更新分)をプッシュします
③ LocalGIT の git/local_developブランチを RemoteGIT の git/developブランチにプッシュします
④ RemoteGIT の svn/revブランチに、git/developブランチをマージします
■ TortoiseSVN
⑤ RemoteGIT に LocalSVN の状態をコミットします

◎さいごに
SVNはリモートにのみリポジトリを持つシンプルな構成ですが、
コミットをする際に他の作業者とコンフリクトが発生したり、バグが発生することを考慮すると少し危険な構成です。

ローカルにもリポジトリを持てる、SourceTree(GIT)を利用できるスキルがあるならば、
そちらを利用すれば、ローカルでマージしてコンフリクトやバグの確認で、もしもの場合にバージョンを戻したり、
緊急の作業タスクが発生しても作業内容を退避させて、直ぐに対応に取り掛かれたりと、
歯がゆい作業をスマートにこなすことが出来るようになります。

SVNのまま、直接コミュニケーションをとってコンフリクトには十分に気を付けるというのも一つの手で、
GHealthプロジェクトではそれを推奨していますが、
それに+αで、コミュニケーションをとれない状況の回避策や、ヒューマンエラーの防止策として、
ローカルでGITを使うのはとても有効な手段です。

必要と言えるほどではないですが、リスクヘッジの観点において、
限られた環境の中でより良質な作業の実現を目指すならば、重要な話かと思います。

 

 

…しれっと【仕事】の記事を書いちゃった(てへぺろ)