はじめに
今回は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」です。環境変数PATH
にhg
コマンドが登録済みの場合は、この設定は不要です。
図1 「 Preferences / Version Control / Mercurial」設定画面
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 <[email protected] >
[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上に公開するプロジェクトを用意しておく
プロジェクトをMercurial連携する
これと同じ説明をするのは3回目なのですが、まずはMercurial連携をするプロジェクトを準備します。既存のプロジェクトを利用するも良しですし、新規に作成するも良しです。
Gitの例にならえば、Mercurial連携もメニューバーから「VCS → Enable Version Control Integration...」を実行し「Mercurial」を選ぶのですが、これを実行してもMercurial連携は開始されません。むしろエラーになります(Android Studio v0.3.6で確認) 。
図3 「 Enable Version Control Integration」ダイアログ
おそらくバグなのだと思います。このバグが解消するまでは次に紹介する方法でMercurial連携を開始しましょう。
プロジェクトをMercurial連携するもうひとつの方法は、メニューバーから「VCS → Import into Version Control → Create Mercurial Repository」を実行する事です。コマンドを実行すると 図4 のようなダイアログが表示されます。
図4 「 Create Mercurial repository」ダイアログ
「どこに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リポジトリの状態
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が有効になった状態
このように.hgignore
の内容がきちんと「Ignored Files」に反映されるため、Android Studioの「Ignored Files」設定は不要です。
なお、作成した.hgignore
もMercurialリポジトリに追加するファイルに含めます。
リポジトリにファイルを追加する
.hgignore
の設定のおかげで「Unversioned Files」の数がだいぶ減ったので、第24回 の時と同じく「Changesツールウィンドウ / Localタブ」をドラッグ&ドロップして、対象ファイルをリポジトリに追加しましょう。
図8 ドラッグ&ドロップしてファイルを追加
.hgignore
を設定しても「Unversioned Files」が大量にあるプロジェクトの場合は、第28回 の時と同じく「Click to browse」リンクを押して、対象ファイルをリポジトリに追加します。
リポジトリの変更を取りやめる
リポジトリの変更を取りやめるのは、連携するバージョン管理システムに関わりなく "Revert " を実行すればよいです。Mercurialの場合、メニューバーの「VCS → Mercurial → Revert」にありますが、ツールバーの"Revert "も「Changesツールウィンドウ」のツールバーにある"Revert "もやってることはすべて同じです。
図9 変更の取り消し
リポジトリにコミットする
ファイルの登録が一通り完了したなら"Commit Changes "を実行して、それらをリポジトリにコミットします。
図10 「 Commit Changes」ダイアログ
画面右側にある「Before Commit」はとりあえず全部OFFでよいです。「 Commit」ボタンのブルダウンは「Preferences / Appearance」の「Allow merging buttons on dialogs」をOFFすると図11 のようになります。
図11 「 Allow merging buttons on dialogs」をOFFにした場合
まだリモートリポジトリにプッシュしないので「Commit」ボタンを押し、ローカルのリポジトリに変更をコミットします。
リポジトリのコミットログをみる
無事にコミットができたなら、そのログを確認してみましょう。コミットログは「Changesツールウィンドウ」の「Log」タブで確認することができます。
図12 「 Changesツールウィンドウ / Logタブ」
※以前は「Repositoryタブ」でしたが、Android Studio v0.3.4から「Logタブ」になりました。
リポジトリをBitbucketに公開する
ローカルのMercurialリポジトリをBitbucketに公開します。とは言え、これから説明する内容はBitbucket固有の話ではないので、他のリモートリポジトリに対しても通用します。
メニューバーの「VCS → Mercurial」のサブメニューを見ても、リモートリポジトリに関する設定は見当たりませんが、その辺は気にせず「VCS → Mercurial → Push」を実行します。
図13 「 Push」ダイアログ
この「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://[email protected] /masanobuimai/myfirstappproject
※<PROJECT_HOME>/.hg
ディレクトリは「Projectツールウィンドウ」には表示されないので、編集するにはAndroid Studio以外のエディタを使ってください。
これさえできれば、一連の操作はAndroid Studioで完結するのに、実に惜しいです(「 Terminalツールウィンドウ」から、hgrc
ファイルを編集すれば、すべてAndroid Studioでできるという屁理屈もありますが……) 。ちなみに、リモートリポジトリが登録されているかどうかは「Terminalツールウィンドウ」で次のコマンドを実行するとわかります。
図14 Terminalから "hg paths" を実行する
または、SourceTreeのサイドバーから確認することができます。
図15 SourceTreeのサイドバーの「リモート」
ちょっと手こずりましたが、これでリポジトリは図16 のような状態になりました。
図16 ローカルのMercurialリポジトリをBitbucketに公開する
Bitbucketからプロジェクトをチェックアウト(クローン)する
Bitbucketのリポジトリからローカルにチェックアウト(クローン)してみます。
図17 Mercurialリポジトリをチェックアウト(クローン)する
ホントウは「クローン」が正しくて「チェックアウト」は間違いなのですが、Android Studioのメニュー表記はSubversion由来になっているため「リモートリポジトリをクローンする」は「リモートリポジトリから(ローカルに)チェックアウトする」という表現になりがちです。
Android Studioのウェルカム画面、もしくはメニューバーの「VCS」から"Checkout from Version Control "を実行して「Mercurial」を選びます。
図18 "Checkout from Version Control"から「Mercurial」を選ぶ
コマンドを実行すると図19 のような「Clone Mercurial Repository」ダイアログが表示されるので「Mercurial Repository URL」にBitbucketのリポジトリURLを入力します。
図19 「 Clone Mercurial Repository」ダイアログ
ダイアログに入力する項目の意味はそれぞれ表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プラグインのインストール方法は以下のとおりです。
「Preferences / Plugins」設定画面を開く。
画面下にある「Browse repositories...」ボタンを押す。
「Browse Repositories」ダイアログから「Bitcuketプラグイン」を探す。
「Bitcuketプラグイン」を選択して、ツールバーの「Download and Install( ) 」を押す。
「Download and Install」ダイアログが表示されるので「Yes」を選ぶ。
プラグインのダウンロードが開始される。
「Close」ボタンを押して「Browse Repositories」ダイアログを閉じる。
「Preferences / Plugins」設定画面の下にある「OK」ボタンを押す。
「再起動しすか?」と聞いてくるので「Restart」を選ぶ。
Android Studioが再起動するので、それ以降「Bitbucketプラグイン」が有効になる。
Bitbucketプラグインができることは次の3つです。
プロジェクトをBitbucketに公開する
Bitbucketからプロジェクトをチェックアウト(クローン)する
Bitbucketの課題管理システムと連携する
上の2つはいずれもBitbucketプラグインがなくてもできてしまいましたが、プラグインを使うと若干便利になるので、その違いについて紹介します。なお、課題管理システムとの連携については、別の回で改めて説明します。
プロジェクトをBitbucketに公開する
Bitbucketプラグインがインストールしてあると、メニューバーの「VCS → Import into Version Control」に「Share project...」が追加されているので、それを実行します。
図20 "Share project..."の実行
「Share project on Bitbucket」ダイアログが表示されるので、登録するプロジェクト名(Name) 、説明文(Description)などを設定して「OK」ボタンを押します。プロジェクト名(Name)には、モジュール名がプリセットされていますが、先ほどのチェックアウト時の弊害があるためプロジェクト名に直しておいた方がよいでしょう。また非常にわかりづらいのですが「Description」欄には文字を入力することができます。
図21 「 Share project on Bitbucket」ダイアログ(Windows版)
※Description欄に日本語を記述すると文字化けして登録されました(Windows/Mac共に) 。
なお、すでに同名のプロジェクトがBitbucketに存在する場合は、ダイアログにその旨を示すエラーが通知されます。
図22 「 Share project on Bitbucket」ダイアログ(Mac版)
「OK」ボタンを押すとプロジェクトをBitbucketに公開する処理を行います。処理が完了すると図23 のようなメッセージが表示されます。「 Bitbucket」という思わせぶりなリンクが表示されていますが、クリックしても何も起こりませんでした……。
図23 「 Share project on Bitbucket」ダイアログ(処理完了後)
若干詰めの甘いところもありますが、それでもプロジェクト公開後は<PROJECT_HOME>/.hg/hgrc
にリモートリポジトリも登録されているので、ちょっとは楽できると思います。
図24 Bitbucketに公開後の hg path の実行結果
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の実行結果
まぎらわしいことに「Select repository to clone from Bitbucket」ダイアログの「Repository list」はHTTPで取得しているようで途中までうまく行くのですが、肝心のチェックアウトでプロキシを越えられずにエラーになります。
図27 「 Clone failed」ダイアログ
サードパーティのプラグインなので多少は大目に見るしか無いのでしょうが、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"を認識できないため) 。
また、リスト3 の mercurial.ini
ですが、Mercurial v1.5.4でのeolエクステンション提供以後は、cleverencode による改行コードの変換は非推奨とのことです。よってリスト3 はリストb に修正します。
リストb <HOME>/mercurial.iniの例
[ui]
username=masanobu imai <[email protected] >
[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には無い利点なのですが、気がついている人はそう多くはないでしょうね。