Mac
Git
svn
SourceTree
git-svn

macのSourcetreeでSVN

More than 1 year has passed since last update.
この記事ではmacOS Sierra バージョン10.12.6を使っています。
Sourcetreeのバージョンは2.6.3です。

SVNでバージョン管理しているプロジェクトに参加することになりましたが、自分のマシンはMacなので、Soucetreeとgit-svnを使うことにしました。(無料で使えるツールで良さそうなものがみつからなかった)
主に以下のことについて説明します。
(1)クローンの方法
(2)運用の手順

状況
・SVNリポジトリが膨大なコミットを含む(ただ過去のリビジョンは自分の作業には不要)
・リポジトリの構成はスタンダードなtrunk/branches/tagsというもの
・SVNリポジトリに自分のブランチを用意済み
・基本的に自分のローカルブランチでの作業をSVNの自分のブランチにコミットさえできれば、trunkへコミットできなくても良いが、trunkの新しい更新は自分のローカルブランチに随時反映したい。

準備

クローンの前に準備したことは以下です。
- Sourcetree のインストール
 - ATLASSIANアカウントを作成
 - BitBucket アカウントを作成
- Sourcetreeで使うgitをシステムのGitへ変更
 - Sourcetreeの環境設定>GitでシステムのGitを使用するに変更

クローン

ここからが本題です。
SVNサーバからソースをgit svn cloneするタイミングで直面した課題が大きく分けて二つありました。それに対する自分の理解を記載します。。

課題1 自分のブランチだけをクローンすることができるのか?
できます。trunkだけ(//svn.hoge.net/repo/trunk)、特定のブランチだけ(//svn.hoge.net/repo/branches/your-branch)をクローンすることも可能です。ただ、今回は自分のブランチで作業しながらtrunkへのコミットを随時マージしたかったのでその場合にはリポジトリ全体(//svn.hoge.net/repo)をクローンする必要がある。

課題2 クローンする途中で失敗して、プロセスが止まる。
リビジョンの数が膨大だと、クローンに何時間もかかるようです。途中で何かしらのエラーが起きたりもする。クローンをSourcetreeから行わず、ターミナルでオプションを用いてクローンする必要があるという結論に至りました。

以下のコマンドを用いてクローンに成功しました。オプションの詳細は以下

$ git svn clone -r 22500:HEAD <URL> --prefix svn/ -s

-r 22500:HEAD
リポジトリが巨大すぎてクローンに失敗したり、容量圧迫になるのを避けるために、クローンの対象を直近100リビジョンくらいに限定。22500(設定時の最新のリビジョンを確認して逆算してたもの)からHEADまでに限定したリビジョンをクローン。(Gitのように”HEAD~100:HEAD”という記述で直近100リビジョンを指定することはできないようです)
--prefix svn/
リモートブランチ(SVN)にsvn/という接頭辞をつける
-s(--stdlayout)
クローンしてくるsvnリポジトリがスタンダードな構成である場合にこれをつけると、ブランチやタグの情報も含んだローカルリポジトリを作成できる。ただし、-sオプションを利用する場合、Subversionリポジトリ内でブランチが「branches/」以下、タグが「tags/」以下、trunkが「trunk/」以下に作成されている必要がある。

ターミナルでの処理が終わったら、Sourcetreeへ移動して、
メニューバーのウィンドウメニューから、リポジトリブラウザを表示
ローカルとリモートの切り替えタブの右にある"新規"から既存のローカルリポジトリを追加を選びクローンしたリポジトリを指定するとSourcetreeで変更履歴が見られるようになります。

プロセスの途中でエラーが出て止まってしまった場合、Cloneではなくinit+fetchを使うこともできる。このやり方だとエラーが出た時に途中からやり直せるというメリットがあります。
リビジョンの範囲の指定はfetchコマンドで行います。

$ git svn init -s --prefix svn/ <URL>
$ git svn fetch -r 22682:HEAD

ローカルブランチの作成
ローカルでの作業用に、リモートの自分のブランチを元に自分のローカルブランチを作る必要があります。この作業もターミナルから行います。
例えばリモートのyour-nameブランチをlocal-your-nameという名前でローカルに作成する場合

$ git branch local-your-name your-name

運用

ローカルブランチに最新の更新を反映するタイミングで手作業によるパッチの作成・適用があるので少し不安ですが、この内容でなんとか始められそうという流れが以下です。

  • masterにチェックインtrunkの更新をプル
  • 前回の同期以降のリビジョンを確認してパッチを作成
  • ローカルブランチにチェックインしてパッチを適用
  • 作業を行なってコミット(どこからどこまでのリビジョンを含むかを書く)
  • リモートブランチへプッシュ

まとめ

SourcetreeでSVNを扱うことは可能ですが、ターミナルからの操作もできないと不便が多いかもしれません。とはいえMac用SVNクライアントは無料では使いやすそうなものは見つけられなかったので、Macでsvnを扱わないといけないけれど、全てをターミナルから行うのはちょっと、という方にはおすすめできます。

参考にさせていただいたサイト

http://sinsoku.hatenablog.com/entry/2014/02/26/231918
https://mag.osdn.jp/09/03/26/0834222
http://blog.endpoint.com/2010/05/continuing-interrupted-git-svn-clone.html