Android Studio最速入門~効率的にコーディングするための使い方

第29回 バージョン管理 ─Subversion連携の使い方[前編]

この記事を読むのに必要な時間:およそ 4.5 分

コミットログの新着通知について

Subversionというより中央管理型リポジトリの制約とも言えるのですが,自身のワーキングコピーが最新なのかどうかはリポジトリから最新版を取得してみなければわからないというジレンマがあります。

それを手助けする機能が「Changesツールウィンドウ / Incomingタブ」です。表示している内容はとなりの「Repositoryタブ」同様リポジトリのコミットログなのですが,「Incomingタブ」にはワーキングコピーに取り込んでないものだけが表示されます。

図14 ⁠Incomingタブ」

図14 「Incomingタブ」

※「Repositoryタブ」にはワーキングコピーの状態に関わりなく,リポジトリのログを表示している

「Incomingタブ」を確認することにより,"Update Project..."で更新されるであろうワーキングコピーの様子を事前に把握することができます。

さらに面白い機能があり,リポジトリ上の変更を定期チェックし,変更があるとそれをステータスバーに通知します。

図15 Subversionの更新通知(Incoming)

図15 Subversionの更新通知(Incoming)

通知監視のタイミングは「Preferences / Version Control / Background」「Refresh changes every」で行います。

図16 ⁠Preferences / Version Control / Background」設定画面

図16 「Preferences / Version Control / Background」設定画面

たまたま更新対象になるファイルを編集している最中に更新を検知すると図17のようにエディタ上にアクションが通知されます。

図17 テキストエディタでのSubversionの更新通知

図17 テキストエディタでのSubversionの更新通知

ともするとsvn updateを忘れてガシガシとコーディングを進めてしまいコミット時に悲しい思いをしがちなので,この更新通知機能は密かに気に入っています。

ワーキングコピーの更新

いわゆるsvn updateです。普段使いならメニューバーの「VCS → Update Project...」から行います。⁠VCS → Subversion → Update Directory...」を実行しても同じ結果になります。

図18 ⁠Update Project」ダイアログ

図18 「Update Project」ダイアログ

この「Update Project」ダイアログの「Update/Switch to specific revision」をONにして,隣のテキストフィールドにリビジョン番号を指定すれば,特定のリビジョンを svn updateすることができます。

ただ残念な事に「今のワーキングコピーがどのリビジョンのものか」を確認する手段はありませんので,この手の作業をするときは十分注意して下さい。⁠Changesツールウィンドウ / Subversion Working Copies Informationタブ」には,リポジトリのURLしか載っておらず,どのリビジョンなのかはわかりません。

究極的には「Terminalツールウィンドウ」を開き svn info を実行すれば,どのリビジョンのワーキングコピーなのかを知ることができます。

図19 Terminalから "svn info" を実行する

図19 Terminalから

なお「Update Project」ダイアログからワーキングコピーの切り替えsvn switchもできますが,ブランチの説明の時にあわせて紹介します。

コンフリクトが起きた場合

svn updateの時に限った話ではありませんがワーキングコピーやリポジトリの更新タイミングによってはファイルの衝突(コンフリクト)が起こります。コンフリクトを検知すると図20のような「Files Merged with Confilicts」ダイアログが表示されます。

図20 ⁠Files Merged with Confilicts」ダイアログ

図20 「Files Merged with Confilicts」ダイアログ

このダイアログの操作はGitのときと変わりないので,詳しくは第26回を参照してください。このダイアログを閉じずにコンフリクトを解消してしまえば良いのですが,何かしらの理由でいったんダイアログを閉じた場合,コンフリクト未解決の状態になります。

コンフリクトが未解決であることは「Changesツールウィンドウ / Localタブ」「Projectツールウィンドウ」から確認することができます。

図21 コンフリクトが未解決(Changesツールウィンドウ)

図21 コンフリクトが未解決(Changesツールウィンドウ)

図22 コンフリクトが未解決(Projectツールウィンドウ)

図22 コンフリクトが未解決(Projectツールウィンドウ)

再度「Files Merged with Confilicts」ダイアログを表示してコンフリクトの解決を再開したい場合は,メニューバーの「VCS → Subversion → Resolve Text Conflict...」を実行します。感覚的に先ほど図示した「Changesツールウィンドウ / Localタブ」「Projectツールウィンドウ」のコンテキストメニューからもコンフリクトの解決ができそうに思えるのですが,そのようなメニューは存在しません。

また何らかの理由でAndroid Studioの機能を使わず別の方法でコンフリクトを解決したい場合はメニューバー「VCS → Subversion → Mark Resolved...」を実行します。このコマンドを実行すると図23のようなダイアログが表示されます。

図23 ⁠Mark Resolved」ダイアログ

図23 「Mark Resolved」ダイアログ

[コラム]ツリーコンフリクト(tree conflict)が起きた場合

同じファイルを一方が移動してしまい,もう一方が編集してしまったなどの操作を行うとツリーコンフリクトになります。

ワーキングコピーの更新時にツリーコンフリクトが起きると「Files Merged with Conflicts」ダイアログは表示されずにいったん更新処理は完了します。ただし「Version Controlツールウィンドウ」にツリーコンフリクトが起こったことが報告されます。

図24 ツリーコンフリクト発生の報告

図24 ツリーコンフリクト発生の報告

※編集したファイルfoo.txtはすでに削除されていたため。

「Projectツールウィンドウ」からはツリーコンフリクトを視認できませんが,「Changesツールウィンドウ / Localタブ」にコンフリクトの該当ファイルが登録されています。よく見ると通常のコンフリクト(Text conflict)とアイコンが違ってます。

図25 ツリーコンフリクトが発生して,まだ解決していない

図25 ツリーコンフリクトが発生して,まだ解決していない

ツリーコンフリクトの解決は自分の変更を取り消すか,自分の変更をいったん受け入れてからあとで考えるの2通りです。どちらもAndroid Studioは手厚いサポートはしません。前者は単純に該当ファイルを"Revert"するだけです。

後者は「Changesツールウィンドウ / Localタブ」でツリーコンフリクトが起きてる対象を選択しつつ,メニューバー「VCS → Subversion → Mark Tree Conflict Resolved...」を実行することです。

図26 ツリーコンフリクト解決の確認

図26 ツリーコンフリクト解決の確認

"Mark Tree Conflict Resolved..."を実行すると図27のような確認ダイアログが表示され「Yes」を選択すると,自身の変更が受け入れられます。つまり「Changesツールウィンドウ / Localタブ」のコミット対象としてマークされます。

図27 ツリーコンフリクト解決

図27 ツリーコンフリクト解決

著者プロフィール

今井勝信(いまいまさのぶ)

システムエンジニア。日本ユニシス株式会社所属。仙台在住。

Android開発はまったくやったことがないけれどIntelliJ IDEAが大好き。

Twitter: @masanobuimai