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

第31回バージョン管理 ─Mercurial連携とBitbucket

はじめに

今回はGitばかりに注目が集まってイマイチ人気がないように思えるMercurial連携についてです。リポジトリにはBitbucketを使います。Bitbucketから連携用プラグインが提供されていますが、まずはAndroid Studio標準機能だけで説明を進めますBitbucketプラグインについては、別枠で解説します⁠⁠。

今回も第3回で紹介したサンプルコードを題材に説明していきます。

事前準備

Git連携と同じくAndroid Studio単体ではMercurialと連携できませんので、別途 hgコマンドを準備しておいてください。hgコマンドはMercurialの公式サイトから、それぞれのプラットフォーム用のバイナリがダウンロードできます。

インストールしたhgコマンドをAndroid Studioに認識させます。設定箇所は「Preferences / Version Control / Mercurial」「Specifiy executable path」です。環境変数PATHhgコマンドが登録済みの場合は、この設定は不要です。

図1 ⁠Preferences / Version Control / Mercurial」設定画面
図1

Android StudioのMercurial連携の実態はGit連携と同じく、Android Studioからhgコマンドを呼び出しているだけです。そのためMercurialに関する諸設定はAndroid Studioではなくhgコマンドに対して行います。たとえば、企業内ネットワークからインターネット上のリポジトリにアクセスする場合は、リスト1のように<HOME>/.hgrcまたは<HOME>/mercurial.iniにプロキシサーバの設定を行います。

リスト1 Mercurialのプロキシ設定
[http_proxy]
host = proxy.example.com:8080

注意事項

主にWindowsでの話になりますが、Mercurialの操作を行うと「abort: unknown encoding: Windows-31J」というエラーが出ます。この手のエンコード問題はまともに取り合うとややこしいので、リスト2のように環境変数HGENCODINGを設定してやり過ごしています。

リスト2 環境変数:HGENCODINGの設定例
HGENCODING=utf-8

参考までに、今回の執筆のために検証を行った環境のmercurial.iniの内容をリスト3に示します。

リスト3
[ui]
username=masanobu imai <masanobu.imai@gmail.com>
[extensions]
eol=
[encode]
**=cleverencode:
[decode]
**=cleverdecode:
[http_proxy]
host = proxy.example.com:8080

さらに追記事項があります(12/24⁠⁠。

PC側の準備はこれでおしまいです。Git、Subversionの時と同じく、MercurialもAndroid Studioの他に専用のクライアントを用意しておきましょう。Gitの時に紹介したSourceTreeがWindowsでもMacでも使えて便利です。WindowsだとTortoiseHgというクライアントもあります。

最後に、今回利用するBitbucketですが、アカウントを登録しておくのはもちろんのこと、公開するリポジトリもあらかじめ準備しておいてください。リポジトリタイプは当然、Mercurialです。

図2 Bitbucket上に公開するプロジェクトを用意しておく
図2

プロジェクトをMercurial連携する

これと同じ説明をするのは3回目なのですが、まずはMercurial連携をするプロジェクトを準備します。既存のプロジェクトを利用するも良しですし、新規に作成するも良しです。

Gitの例にならえば、Mercurial連携もメニューバーから「VCS → Enable Version Control Integration...」を実行し「Mercurial」を選ぶのですが、これを実行してもMercurial連携は開始されません。むしろエラーになります(Android Studio v0.3.6で確認⁠⁠。

図3 ⁠Enable Version Control Integration」ダイアログ
図3

おそらくバグなのだと思います。このバグが解消するまでは次に紹介する方法でMercurial連携を開始しましょう。

プロジェクトをMercurial連携するもうひとつの方法は、メニューバーから「VCS → Import into Version Control → Create Mercurial Repository」を実行する事です。コマンドを実行すると 図4のようなダイアログが表示されます。

図4 ⁠Create Mercurial repository」ダイアログ
図4

「どこにMercurialリポジトリを作成する?」と問い合わせてきているので「今のプロジェクト」を指す「Create repository for the whole project」を選択します。もう一方の選択肢「Select where to create repository」は任意の場所にMercurialリポジトリを作成します⁠⁠。

これでプロジェクトがMercurial連携状態になりました。ツールバーにVCS関連のアイコンが追加され、⁠Changesツールウィンドウ」「Version Controlツールウィンドウ」が表示されます。

Git連携の時と同じく、ステータスバーの右端にブランチ名が表示されます。Mercurialでも、この地味ぃなインターフェイスは意外に便利なので、存在を覚えておいてください。

ちなみに、この状態はまだ何もMercurialリポジトリにAddされていませんが、プロジェクト自体はMercurialリポジトリになっています。

図5 プロジェクトとMercurialリポジトリの状態
図5

Mercurialリポジトリに対する操作

では、実際にファイルを追加し、それをMercurialリポジトリにコミットしてみましょう。

除外ファイルを設定する

早速ファイルを登録したいところですが、その前にMercurialリポジトリに対する除外ファイルの設定を行います。Subversion連携の時と同じく、リポジトリに対する除外ファイル設定はほとんど行われていないため、プロジェクト配下のすべてのファイルがコミット候補になり得ます。

Mercurialの除外ファイル設定はSubversionより面倒ではないので、ファイルを追加する前にちゃちゃっと設定してしまいます。Mercurialの除外ファイル設定はGit同様、専用の設定ファイル.hgignoreを用意するだけです。

プロジェクトのトップディレクトリ<PROJECT_HOME>.hgignoreファイルを作成し、リスト4の内容を登録します。Android Studioの"New..."コマンドで .hgignore ファイルを作成した場合「そのファイルはナニモノだ?」と問われるので、テキストファイル(Text files)に割り当てておきます。

図6 ⁠Register New File Type Association」ダイアログ(クリックすると動きがわかります)
※ここで割り当てた情報は「Preferences / File Types」で確認・修正・解除できます。
リスト4
syntax: glob
.gradle/
local.properties
.idea/workspace.xml
MyFirstApp/build/
.DS_Store

.hgignoreができたのなら「Changesツールウィンドウ / Localタブ」を更新して、それが「Ignored Files」に反映されていることを確認しましょう。

図7 .hgignoreが有効になった状態
図7

このように.hgignoreの内容がきちんと「Ignored Files」に反映されるため、Android Studioの「Ignored Files」設定は不要です。

なお、作成した.hgignoreもMercurialリポジトリに追加するファイルに含めます。

リポジトリにファイルを追加する

.hgignore の設定のおかげで「Unversioned Files」の数がだいぶ減ったので、第24回の時と同じく「Changesツールウィンドウ / Localタブ」をドラッグ&ドロップして、対象ファイルをリポジトリに追加しましょう。

図8 ドラッグ&ドロップしてファイルを追加
図8

.hgignoreを設定しても「Unversioned Files」が大量にあるプロジェクトの場合は、第28回の時と同じく「Click to browse」リンクを押して、対象ファイルをリポジトリに追加します。

リポジトリの変更を取りやめる

リポジトリの変更を取りやめるのは、連携するバージョン管理システムに関わりなく "Revert" を実行すればよいです。Mercurialの場合、メニューバーの「VCS → Mercurial → Revert」にありますが、ツールバーの"Revert"も「Changesツールウィンドウ」のツールバーにある"Revert"もやってることはすべて同じです。

図9 変更の取り消し
図9

リポジトリにコミットする

ファイルの登録が一通り完了したなら"Commit Changes"を実行して、それらをリポジトリにコミットします。

図10 ⁠Commit Changes」ダイアログ
図10

画面右側にある「Before Commit」はとりあえず全部OFFでよいです。⁠Commit」ボタンのブルダウンは「Preferences / Appearance」「Allow merging buttons on dialogs」をOFFすると図11のようになります。

図11 ⁠Allow merging buttons on dialogs」をOFFにした場合
図11

まだリモートリポジトリにプッシュしないので「Commit」ボタンを押し、ローカルのリポジトリに変更をコミットします。

リポジトリのコミットログをみる

無事にコミットができたなら、そのログを確認してみましょう。コミットログは「Changesツールウィンドウ」「Log」タブで確認することができます。

図12 ⁠Changesツールウィンドウ / Logタブ」
図12
※以前は「Repositoryタブ」でしたが、Android Studio v0.3.4から「Logタブ」になりました。

リポジトリをBitbucketに公開する

ローカルのMercurialリポジトリをBitbucketに公開します。とは言え、これから説明する内容はBitbucket固有の話ではないので、他のリモートリポジトリに対しても通用します。

メニューバーの「VCS → Mercurial」のサブメニューを見ても、リモートリポジトリに関する設定は見当たりませんが、その辺は気にせず「VCS → Mercurial → Push」を実行します。

図13 ⁠Push」ダイアログ
図13

この「Push」ダイアログの「Destination Repository URL」にプッシュ先のURL(BitbucketのリポジトリURL)を入力して「Push」ボタンを押すだけです。その他のオプションについては次回説明します。

「Push」ボタンを押した後、必要があればリポジトリへの認証ダイアログが表示されるので、リポジトリにアクセスするIDとパスワードを入力してください。

Gitの時にくらべると簡単に見えますが、ちょっとした落とし穴があります。この一連の方法だと、プッシュ時にだけリモートリポジトリを指定したに過ぎません。リモートリポジトリの変更を取得するプッシュ操作で不都合が生じるので、ローカルのリポジトリにリモートリポジトリを登録しておきます。<PROJECT_HOME>/.hg/hgrcファイルにリスト5のように登録名defaultでリモートリポジトリを設定してください。

リスト5 <PROJECT_HOME>/.hg/hgrcの設定例
[paths]
default=https://masanobuimai@bitbucket.org/masanobuimai/myfirstappproject

<PROJECT_HOME>/.hgディレクトリは「Projectツールウィンドウ」には表示されないので、編集するにはAndroid Studio以外のエディタを使ってください。

これさえできれば、一連の操作はAndroid Studioで完結するのに、実に惜しいです(⁠⁠Terminalツールウィンドウ」から、hgrcファイルを編集すれば、すべてAndroid Studioでできるという屁理屈もありますが……⁠⁠。ちなみに、リモートリポジトリが登録されているかどうかは「Terminalツールウィンドウ」で次のコマンドを実行するとわかります。

図14 Terminalから "hg paths" を実行する
図14

または、SourceTreeのサイドバーから確認することができます。

図15 SourceTreeのサイドバーの「リモート」
図15

ちょっと手こずりましたが、これでリポジトリは図16のような状態になりました。

図16 ローカルのMercurialリポジトリをBitbucketに公開する
図16

Bitbucketからプロジェクトをチェックアウト(クローン)する

Bitbucketのリポジトリからローカルにチェックアウト(クローン)してみます。

図17 Mercurialリポジトリをチェックアウト(クローン)する
図17

ホントウは「クローン」が正しくて「チェックアウト」は間違いなのですが、Android Studioのメニュー表記はSubversion由来になっているため「リモートリポジトリをクローンする」「リモートリポジトリから(ローカルに)チェックアウトする」という表現になりがちです。

Android Studioのウェルカム画面、もしくはメニューバーの「VCS」から"Checkout from Version Control"を実行して「Mercurial」を選びます。

図18 "Checkout from Version Control"から「Mercurial」を選ぶ
図18

コマンドを実行すると図19のような「Clone Mercurial Repository」ダイアログが表示されるので「Mercurial Repository URL」にBitbucketのリポジトリURLを入力します。

図19 ⁠Clone Mercurial Repository」ダイアログ
図19

ダイアログに入力する項目の意味はそれぞれ表1の通りです。

表1 ⁠Clone Mercurial Repository」ダイアログの入力項目
入力項目意味
Mercurial Repository URLクローンするリポジトリのURL。⁠Test Repository」ボタンでその存在確認ができます。
Parent Direcotryクローンする先の親ディレクトリを指定します。ここに指定したディレクトリの直下にリポジトリをクローンします。
Directory Nameクローン先のディレクトリ名を指定します。クローンするリポジトリURLの末端がプリセットされます。

[注意事項]チェックアウト先のディレクトリ名

前回のSubversionの時と同じ問題です。まだ再現するようであれば、ここの対処を行ってください)

今回は.gitignoreの設定にならいAndroid Studioのプロジェクト管理ファイルもほぼ丸ごとリポジトリに登録しています。たとえば最初にプロジェクトをMyFirstAppProjectという名前で作成した場合、<PROJECT_HOME>にはディレクトリ名と同じ名前でモジュール定義ファイル MyFirstAppProject.imlが作成されます。当然、このファイルはリポジトリにコミット済みです。

リポジトリにモジュール定義ファイルが登録済みのプロジェクトをチェックアウトする際は、そのモジュール定義ファイルと同じ名前のディレクトリ名にチェックアウトしないと、別のモジュール定義ファイルを作成しようとします。たとえば、sampleディレクトリにチェックアウトした場合、MyFirstAppProject.imlがあるのにも関わらず新たにモジュール定義ファイルsample.imlを作ります。もう少し正しくいうと、そういうヘンな動作をするバージョンが存在します。

困った事に、この問題がAndroid Studioのアップデートと共に修正されたりデグレードされたりするので「こうです」と断言しづらいのです。そんなわけで当面の間は、チェックアウトするディレクトリ名は必ず登録時のプロジェクト名と同じにしておいたほうが無難です

MercurialというかBitbucketでは、リポジトリURLを小文字で表現するため、この不具合を踏みやすいです。別の回避策として、リポジトリURLのプロジェクト名部分を大文字小文字で表現するか、そもそも大文字混在のプロジェクト名を作らない、という方法もあります。

ダイアログに必要な情報を入力したなら「Clone」を押してチェックアウト(クローン)を開始します。それが済むと、そのままプロジェクトを開くかと聞いてくるので、指示に従ってプロジェクトを開きましょう。

この操作で作成したリポジトリには、はじめから <PROJECT_HOME>/.hg/hgrc にクローンを取得したリモートリポジトリが登録されているので、hgrcの編集は不要です。

次回の予定

Mercurial連携の流れをざっと紹介しました。次回はもう少し踏み込んだMercurial連携の使い方について紹介します

[補足]Bitbucketプラグインについて

プラグインについてはまだちゃんと説明していませんが、⁠Preferences / Plugins」からプラグインの登録・解除ができます。すごく省略して説明しますが、Bitbucketプラグインのインストール方法は以下のとおりです。

  1. 「Preferences / Plugins」設定画面を開く。
  2. 画面下にある「Browse repositories...」ボタンを押す。
  3. 「Browse Repositories」ダイアログから「Bitcuketプラグイン」を探す。
  4. 「Bitcuketプラグイン」を選択して、ツールバーの「Download and Install⁠」を押す。
  5. 「Download and Install」ダイアログが表示されるので「Yes」を選ぶ。
  6. プラグインのダウンロードが開始される。
  7. 「Close」ボタンを押して「Browse Repositories」ダイアログを閉じる。
  8. 「Preferences / Plugins」設定画面の下にある「OK」ボタンを押す。
  9. 「再起動しすか?」と聞いてくるので「Restart」を選ぶ。
  10. Android Studioが再起動するので、それ以降「Bitbucketプラグイン」が有効になる。

Bitbucketプラグインができることは次の3つです。

  • プロジェクトをBitbucketに公開する
  • Bitbucketからプロジェクトをチェックアウト(クローン)する
  • Bitbucketの課題管理システムと連携する

上の2つはいずれもBitbucketプラグインがなくてもできてしまいましたが、プラグインを使うと若干便利になるので、その違いについて紹介します。なお、課題管理システムとの連携については、別の回で改めて説明します。

プロジェクトをBitbucketに公開する

Bitbucketプラグインがインストールしてあると、メニューバーの「VCS → Import into Version Control」「Share project...」が追加されているので、それを実行します。

図20 "Share project..."の実行
図20

「Share project on Bitbucket」ダイアログが表示されるので、登録するプロジェクト名(Name⁠⁠、説明文(Description)などを設定して「OK」ボタンを押します。プロジェクト名(Name)には、モジュール名がプリセットされていますが、先ほどのチェックアウト時の弊害があるためプロジェクト名に直しておいた方がよいでしょう。また非常にわかりづらいのですが「Description」欄には文字を入力することができます。

図21 ⁠Share project on Bitbucket」ダイアログ(Windows版)
図21
※Description欄に日本語を記述すると文字化けして登録されました(Windows/Mac共に⁠⁠。

なお、すでに同名のプロジェクトがBitbucketに存在する場合は、ダイアログにその旨を示すエラーが通知されます。

図22 ⁠Share project on Bitbucket」ダイアログ(Mac版)
図22

「OK」ボタンを押すとプロジェクトをBitbucketに公開する処理を行います。処理が完了すると図23 のようなメッセージが表示されます。⁠Bitbucket」という思わせぶりなリンクが表示されていますが、クリックしても何も起こりませんでした……。

図23 ⁠Share project on Bitbucket」ダイアログ(処理完了後)
図23

若干詰めの甘いところもありますが、それでもプロジェクト公開後は<PROJECT_HOME>/.hg/hgrcにリモートリポジトリも登録されているので、ちょっとは楽できると思います。

図24 Bitbucketに公開後の hg path の実行結果
図24

Bitbucketからクローン

Welcome画面やメニューバーの「VCS → Check out from Version Control」「Bitbucket」が追加されてているので、それを選択します。すると、図25のような「Select repository to clone from Bitbucket」ダイアログが表示されます。

図25 ⁠Select repository to clone from Bitbucket」ダイアログ(クリックすると動きがわかります)

「Repository list」のドロップダウンリストにBitbucket上のプロジェクトがリストアップしてあるので、チェックアウト(クローン)したいプロジェクトを選び「OK」ボタンを押します。

これ以降は「Mercurial」でチェックアウトしたときと同じように、リポジトリのクローン&プロジェクトのオープンを順次実行します。しかし、なぜかこのプラグイン、Bitbucketにsshで接続しにいこうとするため、企業内ネットワーク中など使用できるプロトコルが制限されている環境ではうまく機能しません。

図26にチェックアウト後に確認したhg pathの実行結果を示します。

図26 hg pathの実行結果
図26

まぎらわしいことに「Select repository to clone from Bitbucket」ダイアログの「Repository list」はHTTPで取得しているようで途中までうまく行くのですが、肝心のチェックアウトでプロキシを越えられずにエラーになります。

図27 ⁠Clone failed」ダイアログ
図27

サードパーティのプラグインなので多少は大目に見るしか無いのでしょうが、Bitbucket本家が出しているだけに、もうちょっとしっかりしてもらいたいものです。とりあえず、今後のバージョンアップに期待しましょう(Android Studio v0.3.6とBitbucketプラグイン v1.2.1で確認しました⁠⁠。

[追記]注意事項の注意事項

12月19日に公開したところ注意事項について@flyingfoozyさんからコメントを頂いたので、さらに注意事項として追記します(@flyingfoozyさん、ありがとうございました⁠⁠。

まずは環境変数HGENCODINGの値ですが、Windowsでは"utf-8"を使うより"cp932"を使った方がよいです。本編で、Android Studio単独でMercurial操作を行わず、コマンドラインまたは他のクライアントとの併用を推奨しています。この事を考慮すると"cp932"のほうが望ましいです。よってリスト2は、以下のように修正します。

リストa 環境変数:HGENCODINGの設定例
HGENCODING=cp932

Android Studioは、この環境変数が無いと「Preferences / File Encodings」「Project Encoding」hgコマンドに渡します。⁠abort: unknown encoding: Windows-31J」というエラーは、それが原因だと思われますhgコマンドの実装に使われているPythonが"Windows-31J"を認識できないため⁠⁠。

また、リスト3mercurial.ini ですが、Mercurial v1.5.4でのeolエクステンション提供以後は、cleverencode による改行コードの変換は非推奨とのことです。よってリスト3リストbに修正します。

リストb <HOME>/mercurial.iniの例
[ui]
username=masanobu imai <masanobu.imai@gmail.com>
[extensions]
eol=
[http_proxy]
host = proxy.example.com:8080

clevarencodeの代わりに<PROJECT_HOME>/.hgeolファイルを作成し、プロジェクトの要件にあわせた改行コードの指定を行います。MacやWindowsから利用するリポジトリで「改行コードをLF」に統一したい場合は、リストcのような.hgeolを用意します。

リストc <PROJECT_HOME>/.hgeolの例
[patterns]
**.iml = LF
**.xml = LF
**.bat = LF
**.gradle = LF
**.properties = LF
**.java = LF
**.txt = LF

*.batファイルはLFでも実行に差し支えありませんでした。

Gitの影に隠れながらもMercurialもずいぶん進化しているようです。筆者のように「昔は使っていたけど、最近はもっぱらGit」みたいな方は、mercurial-users.jpに情報が揃っているので、一度知識の棚卸しをしてみてはいかがでしょう.hgeolについては、こちらのほうが詳しいです⁠⁠。ちなみに、UNIX系環境とWindows環境で履歴を共有する場合の日本語ファイル名の使用は、現時点ではまだ鬼門のようです。

Android Studioの「Preferences / Code Style / General」「Line separator (for new files)」と、Merurialの.hgeolを組み合わせることで、どのプラットフォームでも指定した改行コードを再現できます。実はこれ、Gitには無い利点なのですが、気がついている人はそう多くはないでしょうね。

おすすめ記事

記事・ニュース一覧