はじめに
今回はなんだかんだで未だ需要の多いSubversion連携についてです。リポジトリにはGoogle Code を用いますが、GitHubと異なりAndroid StudioにはGoogle Code固有の連携機能はありません。単なるSubversionのリポジトリとして扱いますので、自分が試す環境に適時読み替えてください。
今回も第3回 で紹介したサンプルコードを題材に説明していきます。
事前準備
Subversionは中央型リポジトリなので、何かしらのリポジトリサーバを準備しておいてください。
Subversion連携機能はAndroid Studioに組み込まれているため、Subversion1.7以下のリポジトリを扱うのであれば svn
コマンドを準備する必要がありません。
企業ネットワーク内などプロキシを越えてインターネット上のリポジトリにアクセスする場合は「Preferences / Version Control / Subversion」のNetworkタブの「Use Android Studio general proxy settings as default for Subverion」をONにします。
図1 「 Preferences / Version Control / Subversion」設定画面(Networkタブ)
この設定により、Subversion連携時にAndroid Studioのプロキシ設定 が有効になります。一般にSubversionのリポジトリがインターネット上にある事は稀なので、多くの場合この設定は不要です。今回はGoogle Code上のリポジトリを利用するため必要な設定になります。
なお、Google Code上のSubversionリポジトリは初期状態で図2 のような構成になっています。
図2 Google Code上のSubversionリポジトリの初期状態
[コラム]Subversion1.8について
Android Studioは自身にSubversion連携機能を内蔵していますが、サポートしているバージョンは1.6と1.7です。1.8形式のワーキングコピーを扱いたい場合は、別途svn
コマンドが必要になります。
主にWindowsでTortoiseSVN を使っている場合は特に注意が必要です。ご存じの通り、Subversionの最新バージョンは1.8です。それに対応するようにTortoiseSVNも最新バージョンは1.8系になっています。TortoiseSVNの上位バージョンは下位バージョンのワーキングコピーを扱えませんので、Android Studioと併用を考えている場合は、Android Studio側にあわせてTortoiseSVNのバージョンを下げるか、別途 1.8用のsvn.exe
を用意するかを決めてください。
なお、TortoiseSVNにはsvn.exe
は付属していないので、subversion.apache.org などから入手してください。
Android Studioでの設定は「Preferences / Version Control / Subversion」のGeneralタブにある「Use command line client」をONにして、隣のテキストフィールドに svn
コマンドのパスを指定します。
図3 「 Preferences / Version Control / Subversion」設定画面(Generalタブ)
Android StudioのベースとなったIntelliJ IDEAの次期バージョン(ver.13)では、Subversion1.8のネイティブサポートを宣言しています。原稿執筆時点のIDEA13βではまだ対応していませんが、この原稿が公開される頃にはAndroid StudioでもSubversion1.8をネイティブサポートしているかもしれませんね。
プロジェクトをリポジトリに登録する
Subversionの流儀にしたがえば、登録したいプロジェクトをリポジトリにインポートするところから始めるのですが、それは大変面倒なのでやめます。Android Studioでオススメの方法はメニューバーから「VCS → Import into Version Control → Share Project (Subversion)...」を実行することです。
コマンドを実行すると「Select Share Target」ダイアログが表示されます。Android Studioで初めてSubversionを使うときは「Point to repository location」には何も表示されていないので「+」アイコンを押してSubversionリポジトリを指定します。
図4 「 Select Share Target」ダイアログ
「Define share target」には、リポジトリにどのようにプロジェクトを登録するかを指定します。Google Code上のリポジトリにはすでに「/trunk, /braches, /tags
」といったお決まりのディレクトリが作成済みですが、今回のプロジェクト用に改めてディレクトリを作成したいので、3番目のラジオボタンを選択します。
3番目のラジオボタンを選択すると「ついでに /tags, /branches
も作るか?(Create /tags and /branches) 」というチェックボックスが選択できるようになるので、こちらもONにします。
なお「Define shara target」で指定したリポジトリURLがすでに存在している場合、その後の公開処理に失敗するので注意してください。図4 の例だと https://masanobuimai.googlecode.com/svn/MyFirstAppProject
はリポジトリ上に存在してないことが条件になります。
「Commint Comment Prefix」は空欄でも構いません。ラベル名が「~ Prefix」と意味ありげですが、何の事は無い普通のコミットログのことです。
「Share」ボタンを押すと「Subversion Working Copy Format」ダイアログが表示されます。これから今のプロジェクトをSubversionの作業コピーとするのですが、そのフォーマットのバージョンを決定します。Google CodeのSubversionリポジトリは 1.6 なので、それにあわせて「1.6 format」を選択します(ここは各自の環境に合わせて好きなのを選んでください) 。
図5 「 Subversion Working Copy Format」ダイアログ
その後、Subversionへの認証処理を経てプロジェクトの公開が完了します。この操作が内部的に行っている作業はおおよそ以下の通りです。
指定したリポジトリにプロジェクト用のディレクトリを作成する。
作成したディレクトリを、今のプロジェクトにチェックアウトする(これで、プロジェクトがSubversionのワーキングコピーになりました) 。
プロジェクトにあるファイルをsvn add
してコミット候補にあげておく。
図6 "Share Project (Subversion)..."の概要
結果、図7 のようなお決まりの構造をもったプロジェクトをリポジトリに登録されます。
図7 リポジトリに登録したプロジェクトの構造
余談になりますが、Gitの時に使った"Enable Version Control Integration... "はSubversionではほとんど役に立ちません。「 Enable Version Control Integration」ダイアログの選択肢に「Subversion」はありますが、それを選択したからといって何がどうなるわけでもないです(ホントウは何からの変化はあるのですが、些細な話なので後の回で改めて説明します) 。
リポジトリ登録直後のプロジェクトの状態
"Share Project (Subversion)... "が完了すると「Projectツールウィンドウ」上でみえてる範囲 のすべてのファイルがsvn add
された状態になっています。
図8 "Share Project (Subversion)..."実行直後の様子
※すべてのファイルがコミット対象となっているため「Unversioned Files」が存在しない。
このままでは、リポジトリに登録して欲しく無いものもコミットしてしまうので、一旦すべてを無かった事にします。リポジトリ操作を無かった事にする(svn revert
)はGitの"Revert "操作 と全く同じで、「 Changesツールウィンドウ」で「Default」を選択して、ツールバーの「Revert( )を押すのがもっとも手っ取り早いです。
"Revert "を実行することで、未登録のファイルだけが存在しているワーキングコピーとなりました。
【オススメはしません】プロジェクトをリポジトリにインポートする
はじめに断っておきますが、お作法に則ったSubversionリポジトリへのプロジェクト登録は、それなりに面倒です。古式ゆかしいお作法では、以下の手順で登録を行います。
プロジェクトをリポジトリにインポートする
リポジトリから別ディレクトリにプロジェクトをチェックアウトする
図9 Subversionのインポートの流れ
タダでさえ面倒な作業なのですが、Android Studioから行うと、さらに輪をかけて面倒です。一応、解説しますが、興味が無い/ミスリードしたら困るという方は読み飛ばしてください。
登録したいプロジェクトを開いている状態で、メニューバーから「VCS → Import into Version Control → Import into Subversion...」を実行します。
"Import into Subversion... "を実行すると図10 のような「Import into Subversion」ダイアログが表示されます。先ほどの「Select Share Target」ダイアログと同じく、対象とするリポジトリを選択します。
図10 「 Import into Subversion」ダイアログ
「Import」ボタンを押すと、インポートするプロジェクトを選択する「Import Directory」ダイアログが表示されるので、今開いているプロジェクト(<PROJECT_HOME>
)を指定してインポートを実行します。
図11 「 Import Directory」ダイアログ
これでインポート処理は完了するのですが、困った事に指定したディレクトリの内容を丸ごと インポートします。つまり、buildディレクトリなどの余計なファイルもインポートすることになります。事前に不要なファイルやディレクトリを削除してからインポートを行えばよいのですが、一部のディレクトリやファイルはAndroid Studioから操作できないものもあります。
発想を切り替えると、先ほどの「Import Directory」ダイアログでAndroid Studioで開いてない プロジェクトを指定する事もできるのですが、そこまでしてインポート操作をAndroid Studioで行うメリットはほとんどありません。
唯一意味があるとすれば、Android Studioを単なるSubversionクライアントとして扱う場合でしょう。WindowsはTortoiseSVNという非常にすぐれたクライアントツールがあるのですが、Mac版で、特に無償となるとすぐ思いつくツールがありません。だいぶ無理がありますが「そういう使い道もあるのか」程度に覚えておいてください。
リポジトリにファイルを追加する(除外ファイルの設定)
Android Studioが作成するプロジェクトはSubversion用の除外ファイル設定がされていないので、ファイルを追加する前にまず除外ファイルの設定をします。
Subversionの除外ファイル設定(svn:ignore
)は気が遠くなりそうなほど面倒な作業なので、まず最初にAndroid Studioに対して除外ファイルの設定を行います。
除外ファイルに登録するファイルやディレクトリは .gitignore
に準じます(リスト1 ) 。
リスト1 Android Studioが作成したプロジェクトに付属する.gitignoreの内容
.gradle
local.properties
.idea/workspace.xml
.DS_Store
MyFirstApp/build/
「Changesツールウィンドウ / Localタブ」の「Configure Ignored Files( ) 」アイコンをクリックして、除外ファイルやディレクトリを登録していきます。登録する内容は表1 のとおりです。この設定ダイアログの内容は「Preferences / Version Control / Ignore Files」と同じものです。
図12 「 Configure Ignored Files」ダイアログ(クリックすると動きがわかります)
表1 「 Configure Ignored Files」ダイアログの設定例
タイプ 設定値
Ignore specified file <MODULE_NAME>.iws
(実際実際の値は MyFirstApp.iws
)
Ignore specified file .idea/workspace.xml
Ignore specified file local.properties
Ignore all files under .gradle/
Ignore all files under <MODULE_NAME>/build/
(実際の値は MyFirstApp/build
)
正規表現によるパターンを指定できる「Ignore all files matching」はファイル名にしか有効になりません(ディレクトリを指定できない) 。複数のモジュールが存在するようなプロジェクトでは、モジュールごとに build/
ディレクトリを除外設定する必要があります。
除外ファイルの設定が済んだのなら、プロジェクトの内容をリポジトリに追加します。Gitの時と同じく「Changesツールウィンドウ / Localタブ」の「Unversioned Files」から追加してみます。"Share Project (Subversion)... "の後に"Revert "したので、おそらく「Unversioned Files」は図13 のようになっていると思います。
図13 ワーキングコピーの状態
閾値は不明ですが「Unversioned Files」に属するファイル群がある程度以上の数になると、ファイルそのものは表示されず、ファイルの総数と「Click to browse」リンクが表示されます。これは連携するバージョン管理システムに関係なく、非バージョン管理下のファイルの数で決まりますが、リポジトリへの初期登録時以外にお目にかかる事はそう無いでしょう。
「Click to browse」リンクをクリックすると図14 のような「Unversioned Files」ダイアログが表示されます。バージョン管理対象にしたいファイルやディレクトリを選択し、ツールバーの「+」アイコンをクリックして登録を行います。
図14 「 Unversioned Files」ダイアログからファイルを追加する(クリックすると動きがわかります)
リポジトリにコミットする
ファイルの登録が一通り完了したので、"Commit Changes "を実行して、それらをリポジトリにコミットします。
図16 「 Commit Changes」ダイアログ
画面右側にある「Before Commit」はONにしておくと、コミット時にごちゃごちゃ言ってくるので、とりあえず全部OFFにしてコミットを実行します。
「Commit」ボタンのブルダウンが気になる方は「Preferences / Appearance」の「Allow merging buttons on dialogs」をOFFにしてください。
図17 「 Allow merging buttons on dialogs」をOFFにした場合
Subversionの除外ファイル設定をする(svn:ignore)
Android Studioの除外ファイル設定とバージョン管理システムごとに固有の除外ファイル設定は連動していません。Android Studioからしかリポジトリ操作をしないのであれば先ほどの設定で十分ですが、他のSubversionクライアントと併用するのであれば、Subversionの除外ファイル設定(svn:ignore
)を設定しておいたほうが良いでしょう。
Subversion側の除外ファイル設定はある程度ファイルをコミットしてからのほうが設定しやすいため、このタイミングで設定します。
除外ファイルの設定方法は2通りあります。ひとつは「Projectツールウィンドウ」上で除外したいファイルを選択し、コンテキストメニューから「Subversion → Ignore」を実行して登録していきます。ただし、この方法はどういうわけか感度が悪く、よくメニューが選択不能になります。
もうひとつが、同じく「Projectツールウィンドウ」のコンテキストメニューから「Subversion → Set Property」を実行して、直接 svn:ignore
プロパティを登録します。
図18 コンテキストメニューからSubversionのプロパティを設定する
すでに登録済みのプロパティを編集したい場合は"Edit Properties "を実行します。このコマンドを実行すると、ダイアログではなく図19 のような「SVN Propertiesツールウィンドウ」が表示されます。
図19 「 SVN Propertiesツールウィンドウ」
このツールウィンドウ上でプロパティの追加・編集・削除ができるので"Set Property "より、こちらを覚えた方が便利かも知れません。
.gitignore
の設定に倣って svn:ignore
を設定すると、図20 のようになります。
図20 svn:ignoreの設定例
[補足]
svn:ignore
が設定していれば、Android Studioの除外ファイル設定がなくても「Changesツールウィンドウ」や「Projectツールウィンドウ」上で、svn:ignore
の対象ファイルは「無視ファイル」として扱われます。その逆(Android Studioの除外ファイル設定だけで、svn:ignore
は設定してない)も然りです。
図21 svn:ignoreだけでも無視ファイルは有効になる
そこまでできるのであれば、バージョン管理システム固有の除外ファイル設定とAndroid Studioの除外ファイル設定を相互変換できるようにして欲しいのですが、そこまでには至ってないようです。実にもどかしい話です。
リポジトリのコミットログをみる
無事にコミットができたなら、そのログを確認してみましょう。コミットログは「Changesツールウィンドウ」の「Repository」タブで確認することができます。
図22 「 Changesツールウィンドウ / Repositoryタブ」
何も表示されていない/内容が古いなどの場合は、ツールバーのRefreshボタン( )を押してください。場合によっては「VCS History Cache Settings」ダイアログが表示されますが細かい事は気にせず「OK」ボタンを押せば、コミットログが表示されます。
図23 「 VCS History Cache Settings」ダイアログ
Subverion連携時の「Changesツールウィンドウ」はまた独特のインターフェイスを持ちます。詳しくは次回紹介します。
リポジトリからチェックアウト
すでにプロジェクトはSubversionリポジトリのワーキングコピーになっているので、わざわざチェックアウトする必要はないのですが、別のPCもしくは別のディレクトリにワーキングコピーを作るために、リポジトリからチェックアウトする方法を紹介します。
Subversionリポジトリのチェックアウトは、Android Studioのウェルカム画面の「Quick Start」にある「Checkout from Version Control」から「Subversion」を選択して実行します。すでにプロジェクトを開いている場合は、メニューバーの「VCS → Checkout from Version Control → Subversion」を実行してください。
図24 「 Checkout from Version Control」からチェックアウト
この頃にはすでにリポジトリURLはAndroid Studioに登録済みになっているはずなので「Checkout from Subversion」ダイアログからチェックアウトしたい対象を選択して「Checkout」ボタンを押します。
図25 「 Checkout from Subversion」ダイアログ
その後チェックアウト先(「 Destination Directory」ダイアログ) 、チェックアウト方法(「 SVN Checkout Options」ダイアログ) 、ワーキングコピーのフォーマット(「 Subversion Working Copy Format」ダイアログ。プロジェクト登録時に紹介したものと同じ)と立て続けに問い合わせてきます。
図26 「 Destination Directory」ダイアログ
図27 「 SVN Checkout Options」ダイアログ
チェックアウトするディレクトリ名は選択可能ですが、図28 のようにプロジェクト名と同じにしておいてください。理由は2つ先の第30回で説明します。
[注意事項]リポジトリの選択で「unknwon host」になる場合
図28 「 Checkout from Subversion」ダイアログで"unknown host"
Subversonにプロキシを設定しましょう。「 Preferences / Version Control」はプロジェクトごと に保存されるため、ウェルカム画面からチェックアウトを実行する場合、デフォルトプロジェクトの設定が適用されます。
デフォルトプロジェクトの設定は、ウェルカム画面から「Configure → Project Defaults → Settings」もしくは、メニューバーの「File → Other Settings → Default Settings...」で行います。
まとめ
とりあえず、Subversion連携の流れをひととおり眺めてみました。次回は、もうすこし踏み込んだSubversion連携の機能について紹介します。