はじめに
後編の今回は主にブランチ操作に関連した操作について紹介します。
ブランチやタグの作成とワーキングコピーの切り替え
メニューバーの「VCS → Subversion → Branch or Tag...」を実行します。「 Projectツールウィンドウ」でディレクトリをどれか選択していないと、このコマンドが実行可能になりませんのでご注意ください。大抵は<PROJECT_HOME>
を選択します。
コマンドを実行すると図1 のような「Create Branch or Tag」ダイアログが表示されます。「 Working Copy」のテキストフィールドには、コマンドを実行したときに選択していたディレクトリのパスが設定されます。
図1 「 Create Branch or Tag」ダイアログ
このダイアログを使ってブランチやタグを作成するのですが、その前にちょっとしたお膳立てが必要になります。
ブランチやタグの設置場所を指定する
「Create Branch or Tag」ダイアログの「Copy To」セクションにある「Base URL」ですが、初回はプルダウンリストをクリックしても何も候補がでません。これは単にブランチやタグを設置する場所が設定されていない ためです。
「Base URL」のテキストフィールド右横にある アイコンをクリックしてブランチの作成場所を設定します。
図2 「 Configure Subversion Branches」ダイアログ
「Configure Subversion Branches」ダイアログには、trunkの位置を示す「Trunk location」テキストフィールドとブランチやタグの位置を示す「Branch locations」リストボックスがあります。初期状態では「Branch locations」は「Nothing to show(なにもなし) 」になっているので、ダイアログ下部にある「+」アイコンを使って、それぞれブランチの位置、タグの位置を設定します。
今回の例で用いているプロジェクトレイアウトに倣うと、図3 のような設定内容になります。
図3 「 Configure Subversion Branches」ダイアログ(設定済み)
第28回 で紹介した "Share Project (Subversion...) " でリポジトリに登録するプロジェクトレイアウトを指定する場面があったので、この設定もそれにあわせて設定済みにして欲しいものなのですが、そこまで気が利かないので、一度は自分で設定することになります。
考えようによっては、任意の場所にブランチやタグを作る事ができるので便利と言えば便利です。
「Configure Subversion Branches」ダイアログの設定が完了すると、先ほどの「Create Branch or Tag」ダイアログの「Base URL」のプルダウンリストに設定したブランチやタグの位置がリストアップされます。
図4 「 Base URL」が選択可能になる
ワーキングコピーからブランチやタグを作る
「Create Branch or Tag」ダイアログでブランチやタグを作る方法は2種類あります。ひとつは、今使っているワーキングコピーから作る方法です。
図5 「 Working Copy」を選択してワーキングコピーからブランチを作る
Android Studio v.0.3.2あたりまでこの機能はまともに動きませんでしたが、v0.3.5くらいから正しく動くようになりました。ブランチやタグを「ワーキングコピーから作る」とはありますが、正確には「ワーキングコピーに対応するリポジトリ上のディレクトリから作る 」という意味です。
そのため、当然ながらコミットしていないファイルはブランチ(やタグ)の対象には含まれません。
このダイアログの初期値になっていますが、筆者はどうしてもワーキングコピーからブランチを作りたいという理由も無く、英文の注意書きが煩わしいので、こちらの選択肢は無いものとみています。
リポジトリ上でブランチやタグを作る
もうひとつが、リポジトリの指定した場所からブランチやタグを作る方法です。「 Repository Location」ラジオボタンをチェックして、ベースとなるリポジトリのURLを指定します。
図6 「 Repository Location」を選択してブランチやタグを作る
リポジトリURLを指定するテキストフィールド右横にある アイコンをクリックすると、今使っているワーキングコピーに相当するリポジトリURLを自動展開します。一見便利そうに思えますが、もともとそのリポジトリURLがプリセットされているので、それほど使うシーンはありません。
「Working Copy」または「Repository Location」のいずれかを選択して「Copy From」の設定が完了したなら「Copy To」にブランチやタグの作成先を設定します。
「Base URL」で作成したい場所を選び、「 Name」に作成するブランチやタグの名前を指定します。Subversionの場合、ブランチやタグを厳密に区別する仕組みはないのですが、一般的にブランチはbranches
ディレクトリに、タグはtags
ディレクトリに作成します。
図7 「 Copy To」にブランチやタグの作成場所を指定する
ワーキングコピーの切り替え
"Branch or Tags... "でブランチやタグを作成しても、今使っているワーキングコピーは以前のままです。「 Working Copy」を指定してワーキングコピーからブランチを作ってもスイッチせず、以前のままです。これもあって、筆者は「Working Copy」オプションの存在を疑問視しています。
ワーキングコピーを任意のブランチやリビジョンのものに切り替える場合は、"Update Project... "を実行します。
図8 「 Update Project」ダイアログ
前回のワーキングコピーの更新でも「Update Project」ダイアログが登場しましたが、ワーキングコピーの切り替えでも使います。「 Update/Switch to specific url」をONにして「Use branch」に切り替えたいブランチ(やタグ)を指定します。
この指定の仕方が若干独特で、右端にあるアイコン( )をクリックし「Select branch」ポップアップから切り替えたいブランチやタグを決定します。
図9 「 Use branch」で切り替え先を指定する(クリックすると動きがわかります)
「Select branch」ポップアップにリストアップされている候補一覧は「trunk (trunk)」を除けば、先ほどの「Configure Subversion Branches」ダイアログに設定した内容が一覧されています(登録したURLの末端のパスが表示されています) 。
と、ここまで説明しておいてナンですが、その下にある「URL」テキストフィールド右横の アイコンをクリックしたほうが、より直感的にブランチを指定することができます。
図10 「 URL」で切り替え先を指定する(クリックすると動きがわかります)
どちらを用いるかはお好みでどうぞ。結果はどちらも変わりありません。
今使っているワーキングコピーがリポジトリのどこから取得したものなのかは「Changesツールウィンドウ / Subversion Working Copies Informationタブ」で確認できます。
図11 「 Changesツールウィンドウ / Subversion Working Copies Informationタブ」
マージ
マージは取り込む側を主体に作業していくので、マージを始める前にワーキングコピーをマージする側に切り替えます。たとえば「new_branchブランチの変更をtrunkに取り込む」のであれば、ワーキングコピーをtrunkに切り替えます。
「Changesツールウィンドウ / Repositoryタブ」の内容を更新すると、まだマージする側のコミットログに、マージされる側のコミットログが含まれていないことが確認できます。
図12 マージ前のコミットログの様子(new_branchとtrunk)
マージは「Changesツールウィンドウ / Subversion Working Copies Informationタブ」の「Merge From...」リンクから行います。メニューバーの「VCS → Merge from...」を実行すると、このツールウィンドウが開くだけです。余談ですが、マージに関してはメニューバーの「VCS → Subversion」サブメニュー内に存在しないのが可笑しく思えます。
「Merge From...」リンクをクリックすると「Select branch」ポップアップが表示されるので、マージされる側のブランチを選択してください。もし「Select branch」ポップアップに該当するブランチが表示されない場合は、ポップアップ最下部にある「Configure Branches...」を選び、再度「Configure Subversion Branches」ダイアログでブランチやタグの場所を設定してください。
図13 「 Merge From...」の実行例(クリックすると動きがわかります)
※「Configure Subversion Branches」ダイアログの設定が消える理由は.idea/misc.xml
にあります(詳しくは後の回で説明します) 。
マージされる側 のブランチを選択すると図14 のような「Select Merge Variant」ダイアログが表示されるので、3種のマージ方法のなかからお好みのものを選択します。
図14 「 Select Merge Variant」ダイアログ
Merge All
マージしてないリビジョンをすべてマージします。ワーキングコピーのsvn:mergeinfo
を手がかりに、マージしていないリビジョンを見つけてマージします。
Quick Manual Select
マージ先のコミットログと比較して、マージするリビジョンを指定して取り込みます。マージの指定を手動で行うので高速なのだそうです。
Select With Pre-Filter
マージ済みのリビジョンを把握して、未マージのリビジョンを選択します。マージ済みのチェックに時間がかかるそうです。
「Quick Manual Select」や「Select With Pre-Filter」は、一度マージしてからブランチを育て再度マージするときにその違い確認できます。この違いについては後で紹介します。筆者の私感ですが、Subversionであまり凝ったマージを行うとロクな事にならないので、シンプルに「Quick Manual Select」一択がよいと思っています。
補足
「Merge All」も悪くない選択だと思うのですが、何度か図15 のような「うまくマージできないよ」的な確認ダイアログが表示され、それでも続行するとツリーコンフリクトだらけになることがよくありました。
図15 マージ実行時の確認ダイアログ
やっぱり、Subversionのマージは緊張します。
「Quick Manual Select」を実行すると図16 のようなダイアログが表示されるので、マージしたいチェンジセットを指定して「Merge Selected」ボタンを押します。通常は全部選択( )してよいです。
図16 「 Merge from new_branch」ダイアログ
ワーキングコピーに対するマージが完了すると「Commit Changes」ダイアログが表示されて、マージ結果のコミットを促してくるので、そのままコミットしてしまいましょう。
マージ後のコミットログを確認してみると、<PROJECT_HOME>
にsvn:mergeinfo
が設定されたことが確認できます(<PROJECT_HOME>
を選択して、ツールバーの「Property Diff with Local( ) 」をクリックするとプロパティの変更を確認できます) 。
図17 「 Subversion properties difference」ダイアログ
これでマージが完了しました。先ほどの「Select Merge Variant」ダイアログの「Quick Manual Select」と「Select With Pre-Filter」の違いを見るために、new_branch側のリビジョンを育てて、再マージしてみます。
図18 マージ後に育てたnew_branchのコミットログ
再度、trunk側で"Merge From... "を実行し「Select Merge Variant」ダイアログで「Quick Manual Select」と「Select With Pre-Filter」を実行したときの「Merge from new_branch」ダイアログが図19と 図20 です。
図19 「 Quick Manual Select」を選択した場合
図20 「 Select With Pre-Filter」を選択した場合
たしかに「Select With Pre-Filter」は未マージのリビジョンのみが表示され見やすいと思いますが、「 Quick Manual Select」もマージ済みのリビジョン がわかるようになっているので、筆者としては「どっちもどっち」だと思っています。
「Merge from new_branch」ダイアログの各リビジョンの先頭についているアイコンの意味は次の章で説明します。
マージ状況の把握
Subversionだけを使っている分には「そういうものだ」という馴れもあって気付かないのですが、Gitなどの分散型VCSに馴染んでくると、Subversionのコミットログは「何がマージされて、何がマージされていないか」を確認するのに非常に向いていません。
Android StudioのSubversion連係には、その不満点を補う機能が含まれています。「 Changesツールウィンドウ / Repositoryタブ」にある「Merge Infoペイン」がそれにあたりますが、なかなか手強いのでじっくり説明していきます。
「Merge Infoペイン」を利用する前提として、2つのワーキングコピーが必要になります。ひとつが「マージされた側」のブランチのワーキングコピーで、こちらをAndroid Studioで開いておきます。もうひとつが「マージした側」のブランチのワーキングコピーです。
図21 「 マージ状況の把握」をするための準備
チェックアウトの注意点(第28回の補足)
先ほどの図21 の下にある意味深なコメントですが、第28回 で説明したチェックアウトの話につながります。
チェックアウトするディレクトリ名は選択可能ですが、図 のようにプロジェクト名と同じにしておいてください。
どういうわけかAndroid Studioはプロジェクトのディレクトリ名と同じ名前でモジュール定義ファイル(*.iml
)を作成する ためです。今回の例ではプロジェクト登録時にMyFirstAppProject.iml
というモジュール定義ファイルが<PROJECT_HOME>
にあります。
このプロジェクトをMyFirstAppProject
ではない他の名前でチェックアウトすると、そのディレクトリ名でモジュール定義ファイルを作成してしまいます。たとえば、trunk
というディレクトリにチェックアウトするとtrunk.iml
を作成します。MyFirstAppProject.iml
があるにもかかわらず、です。
どうもAndroid Studioのバージョンによっては、ディレクトリ名が異なってもMyFirstAppProject.iml
を使い続けるときもあったので、単なるバグなのでは?と思います。Android Studioのバージョンによってはディレクトリ名が異なっても平気な場合もありました。
もし、当初作成したディレクトリ名とは異なるディレクトリ名でプロジェクトをチェックアウトして何かおかしな事があったら、この不具合を疑ってみてください。
今回の例で言うと「マージされた側」が new_branch で「マージした側」が trunk になります。new_branch側のプロジェクトをAndroid Studioで開き、「 Changesツールウィンドウ / Repositoryタブ」の「Changelistsペイン」にある「Highlight integrated( ) 」アイコンをクリックします。クリックすると左側に新しいペインが表示されます。これが「Merge Infoペイン」です。
図22 「 Merge Infoペイン」( クリックすると動きがわかります)
「From」欄には現在のワーキングコピーに対応するリポジトリURLが表示してあると思います。ここで「To」欄に先ほど準備しておいた「マージした側」のブランチとそのワーキングコピーを指定します。
ここまでお膳立てができたなら「Merge Infoペイン」側の「Highlight integrated( ) 」アイコンをクリックするとコミットログにマージしたかどうかを判別するアイコンが付くようになります。
図23 「 Highlight integrated」をONにしたコミットログの状態
表1 「 Highlight integrated」をONにしたときのアイコンの意味
アイコン 意味
マージしてないリビジョン
マージしたリビジョン
履歴を共有しているリビジョン
「たいそうな手間をかけて得られるのは、それだけ?」と思うところもありますが、まあまあ便利な機能です。
さらにここから、Gitで言うCherry-Pick まがいのことができます。つまり、選択したコミットログ(リビジョン)を「To」側に反映します。手っ取り早い操作は、未マージ状態のコミットログを選択し、ツールバーかコンテキストメニューから「Integerated to Branch( ) 」を実行します。
するとTo側 のワーキングコピーに対して変更を加えコミットするかどうか問い合わせてきます。ここで表示している「Commit Changes」ダイアログは、今開いているワーキングコピーに対するものではなく、To側(マージする側) のワーキングコピーであることに注意してください。
図24 "Integrate To Branch..."の実行
この「Integrated To Branch」も含めた「Merge Infoペイン」でできる機能を表2 に示します。これらは「Merge Infoペイン」のツールバーやコンテキストメニューから実行できます。
表2 「 Merge Infoペイン」のツールバーの機能
アイコン コマンド 意味
Highlight Integrated コミットログにマージ済みアイコンを表示します。
Integrated To Branch 選択したリビジョンをTo側にマージします。
Undo Integrated To Branch 「選択したマージ済みのリビジョンを打ち消す変更をコミットする」のだとと思います(胡散臭くて押したことがないのです) 。
Mark As Merged 選択したリビジョンをマージしたことにします(svn:mergeinfo
のみ設定する) 。
Mark As Not Merged "Mark As Merged"の逆です。
Filter out integrated マージ済みのリビジョンを除きます。
Filter out not integrated 未マージのリビジョンを除きます。
Filter out others その他のリビジョンを除きます(「 その他」でなんでしょうね?)
Show Working Copies ワーキングコピーの詳細を表示します。「 Subversion Working Copies Informationタブ」を開くのですが、なぜか「Version Controlツールウィンドウ」にそれを開きます。
Refresh コミットログを更新します。
リポジトリを操作する
前回 その存在だけを紹介した「SVN Repositoriesツールウィンドウ」についてです。このツールウィンドウはメニューバーの「VCS → Browse VCS Repository → Browse Subversion Repository...」を実行すると登場します。
図25 「 SVN Repositoriesツールウィンドウ」
いわゆる普通のリポジトリブラウザです。TortoiseSVNを使っている人向けに説明すれば「 Repo-browser のようなもの」と言えばわかるでしょう。
Subversionが中央型リポジトリである以上、この機能は半ば必須の機能です。この機能が無いと、Android Studioからはワーキングコピーを介してしかリポジトリ操作ができなくなります。
「SVN Repositoriesツールウィンドウ」のツールバーやコンテキストメニューの機能はそれぞれ表3 と表4 の通りです。
表3 「 SVN Repositoriesツールウィンドウ」のツールバー
コマンド 機能
Add Repository Location新しいリポジトリURLを登録します。
Edit Location Url指定したリポジトリのURLを編集します。
Discard Location Url指定したリポジトリの登録を解除します。
Show/Hide Details
リポジトリの詳細情報の表示を切り替えます。
Refresh表示内容を最新の状態に更新します。
Collapse All展開したリポジトリの内容をすべて折りたたみます。
Helpヘルプを表示します。
Closeこのツールウィンドウを閉じます。
表4 「 SVN Repositoriesツールウィンドウ」のコンテキストメニュー
コマンド 機能
New / Repository Location... ツールバーの「Add Repository Location」と同じです。
New / Remote Folder... 指定した場所にディレクトリを作成します。
Open 指定したファイルを開きます。ワーキングコピーにある同名のファイルには影響しません。
Show History 指定したファイルやディレクトリの履歴を表示します。
Checkout... 指定したディレクトリをチェックアウトします。メニューバーの「VCS → Checkout from Version Control... → Subversion」相当のことを行います。さらに、こちらの方が簡単です。
Compare With.. リポジトリ上のディレクトリを比較します。
Browse Changes... 「Show History」と同じく履歴を表示します。こちらは「Changesツールウィンドウ」に結果を表示します(「 Show History」は「Version Controlツールウィンドウ」に表示する) 。
Import... 指定したディレクトリに、ローカルにあるファイルやディレクトリをインポートします。
Export... 指定したディレクトリをエクスポートします。
Branch or Tag... 指定したディレクトリからブランチやタグを作成します。
Move or Rename... 指定したディレクトリやファイルを移動/リネームします。
Delete... 指定したディレクトリやファイルを削除します。
Copy URL... 指定したディレクトリやファイルのURLをクリップボードにコピーします。
Refresh ツールバーの「Refresh」と同じです。
Edit Location Url... ツールバーの「Edit Location Url」と同じです。
Discard Location ツールバーの「Discard Location Url」と同じです。
勘の良い人は気付いたかも知れませんが、実はブランチやタグを作成するのは「SVN Repositoriesツールウィンドウ」から行った方が断然わかりやすいです。
図26 「 SVN Repositoriesツールウィンドウ」からブランチを作成(クリックすると動きがわかります)
また、メニューバーの「VCS → Subversion」には見当たらなく、てっきり出来ないものと思いがちなsvn export
はここからのみ可能です。
まとめ
IntelliJ時代から長く鍛えられているだけあって、Subversion連係はそれなりに 充実しています。手頃な専用クライアントが見当たらないMacでは専用クライアント代わりになる程度に機能はそろっています。それでも、WindowsではTortoiseSVNとの併用をオススメしますが……。
Subversion自体の最新版は1.8となり、そこそこ機能も充実してきているのですが、肝心のAndroid StudioはGit連係にご執心のようで、それほど追従しようという気概は感じられません。1.6や1.7といった古いリポジトリを使っている分には気にならないのですが、1.8のリポジトリを使うにはまだまだ感があります。
この回が公開されている頃にはリリースされているであろう、IntelliJ IDEA 13ではSubversion 1.8がネイティブサポートしているので、早くAndroid Studioにもその機能が反映されているといいですね。