Tag Archives: Git

先週の社内勉強会にてGitの便利なコマンドや関連するGUI/CUIツールについて発表しました。

スライドにリンクなどはまとまっています。

git bisectについては言葉だと分かりにくいので、Test’emを使いながらデモをしました。
適当に実装を進めてgit bisect run “testem ci” で壊れたコミットを探すという感じのと、git hookでtestem ciを動かしてテストが通らないとコミット出来ないようにする等。

発表したは結構前ですが、資料を置いておきます。

内容的には大きく分けて

という感じになっています。

結構曖昧な部分もありますが、結構参考リンクを詰め込んだので、そちらを見ていただくと面白いのではないかと思います。

git-flowとgit-issueを使ったTiDD環境について | Technology-Gymにて、
git-flowgit-issueを組み合わせた使い方を紹介しましたが、チケットを切るときに手動でチケット番号を入力するのがとても面倒でした。

今回は、それをpercolというパイプで渡したものをanything的な絞り込み/選択できるCLIツールを使って楽にできるようにしました。
percolについては下記を参照して下さい。

percol は入力の1行を1候補として,部分一致かつ AND 検索で絞り込みし,選択した候補を出力するコマンドです.端的に言えば Emacs の anything.el のコマンド版です.
anything 的な絞りこみコマンド percol の紹介 – 備忘録

書いてみたコマンドは以下のようなものです。
動作確認はzsh 4.3.11とgit-issueはredmineのみしか確認してないです。
(多分Gtihub向けは少しいじる必要があると思います。)

  • git-issue listからチケットを選んでgit flowのfeatureブランチを作る
  • git-issue listからチケットを選んでチケットを終了&100%
  • git-issue listからチケットを選んで詳細情報の表示

上記のような関数をzshの設定に定義して、bindkeyで適当にCtr+B -> Ctrl+F/U/I な感じのショートカットを設定して利用してます。
git-issue v0.8.4からANSI Colorがデフォルトで付くようになったので、percolに渡す部分では–no-colorオプションを適応しています。

言葉だと少し分かりにくいので、codestre.amを使って録画したものを載せておきます。

codestre.amの幅の問題で表示が若干崩れてますが、横幅を十分に持てば崩れないので大抵は大丈夫だと思います。
動画では上記のスクリプトを使ってgit-flowでチケットを切って処理する感じのデモをやってます。

percolを使えば、redmineのチケット番号を手動で入力することなく利用できるようになったのでかなり効率よくなったと思います。

以前書いた、TiDDとgit-flowを合わせた開発手法について | Technology-GymのRedmineとgit-flowを使ったチケットドリブンな開発手法は相変わらず続けていますが、少し使ってるツールが変わりました。

まずはgit-flow自体はそのまま使い続けています。
後述しますが、git-flowのhooksが正式に実装されれば、TiDDな開発はもっとスムーズに進むような気がします。

コマンドラインからredmineを操作するツールを以前は複数使っていましたが、
現在はgit-issueに統一してあります。

この記事で使用してるバージョンはgit-issue 0.8.0です

git-issueはチケットの作成(git issue add)、gitチケットのアップデート(git issue update <ticket_number>)やチケット一覧の表示(git issue list)等、
一通りredmineのチケット操作はできるので便利です。

自分の場合、上記のあげたチケットの作成、アップデート、一覧表示があれば大体事足りてしまうので、そこに絞って使い方を書いてみます。

まずは、git-issue+Redmineのセットアップ方法について。
Configurationに書いてあるように

$ git config issue.apikey xxx
# 自分は他の用途で使ってないので、$ git config -g で定義してます。
$ git config issue.type redmine
$ git config issue.url http://redmine.example.com/projects/IDENTIFIER/
# issue.urlの末尾は/を含める必要があります

この状態で、git issue listなどを実行してエラーが出なければセットアップは終了です。

チケットの作成

git-issueではコマンドラインからチケットの作成も行えます。
自分の場合チケットの追加だけはWebから行う事も多いですが、かなり小さなチケットを立てるようなときはgit issue addを使ったりします。

単純にgit issue addと入力すると訳わからん状態になるので、自分はzshにチケット作成関数を書いて置いて、
Subjectとdescriptionをインタラクティブに入力するだけで済むようにしています。

NewImage

git issue addはassigned_to_idとproject_idを指定しないとそもそも作成時にエラーになるので、
関数と言ってもgit issue add –assigned_to_id=xx –project_id=yy を自動で入れるような感じものです。

function giAddIssue(){
  # redmineの自分のUserIDを入れる
  MY_REDMINE_ID=XXX
  ISSUE_URL=$(git config issue.url)
  PROJECT_ID=$(echo "$ISSUE_URL" | sed -e "s/^.*\/\(.*\)\/$/\1/")
  git issue add --assigned_to_id=$MY_REDMINE_ID --project_id=$PROJECT_ID
}

MY_REDMINE_ID(–assigned_to_idに渡す)部分は人によって違うので、書き換えるかgit-issueと同じようにgit configに設定値を持たせて読み込むようにすると良い気がします。
project_idはredmineのプロジェクト識別子でもいいみたいなので、issue.urlで設定した値を再利用して設定を増やさなくても済むようにしてます。

何かもっとまともな方法がありそうですが、これで$giAddIssueとやるとチケットの作成が簡単にできます。

NewImage

チケットのアップデート

これが一番よく使うもので、git issue update <チケット番号> でそのチケットを開いてエディタで編集できます。
また、id/<チケット番号> が含まれるgitブランチにいる場合なら、チケット番号を省略できてgit issue updateだけでよくなります。
自分はgit-flowでブランチを作成してるので、git flow feature start id/<チケット番号> という感じでfeature/id/<チケット番号>というブランチを作って作業します。
(git issueにもbranchを作る機能などがありますが、使い方がよくわからないので使ってない)

この省略が結構便利で、ブランチで作業が終わってチケットを終了だけ(コメントなどを付けないで)したいときは
git isssue update –status=5とやるだけでチケットを終了できます。

チケット一覧の表示(git issue list)はそのままなのですが、終了したチケットの表示とかgit log –pretty=format:みたいのができると便利そう。

まとめ

大まかにやってることをまとめてみると

$ giAddIssue
# もしくはWebでチケットを作成
$ git issue list
# チケット番号を確認 xxxとする
$ git flow feature start id/xxx
$ git issue update --status=2
# ステータスを作業中にする(あんまりやらないけど)
…
開発&gitにコミット
…
$ git isssue update --status=5
# もしくはgit isssue updateでnoteを書く
$ git flow feature finish id/xxx
# ブランチをマージ
# 最初に戻る

のような感じです。

おまけ

git-flowのhooksとgit isssueの連携について。
まだ、不完全でちょっと使えてないのですが、

$ git clone --recursive https://github.com/petervanderdoes/gitflow.git
$ cd gitflow
$ git checkout origin/feature/implement-hooks
$ make install

という感じで、gitflowにhooksを実装したものをインストールして、先ほどの流れででてきたgit issue update –status=の部分を自動化できないかなとやっていました。

*このスクリプトは不完全なので使わないほうが良い気がします。

git-flow hooksはgitのhooksと同じで、各レポジトリの.git/hooksに入れておけばgit-flowに対応したコマンドにhookしてシェルスクリプトを動作させることができます。
上記のスクリプトは、git flow feature start/finish の後にhookするスクリプト(ファイル名で判断される)です。

git  hookを自動で.git/hooksに移動させる方法がよくわからなかったので、

# git hooks install
function gitHooksInstall(){
  MY_HOOK_DIR="~/.git_flow/hooks"
  DOT_GIT_DIR=$(git rev-parse --git-dir 2>/dev/null)
  if [ "$DOT_GIT_DIR" != "" ]; then
    echo "cp -upR $MY_HOOK_DIR $DOT_GIT_DIR"
    cp -pR $MY_HOOK_DIR $DOT_GIT_DIR
  fi
}

自動で入れたりhookスクリプトを~/.git_flow/hooks/ディレクトリにまとめておいて、gitHooksInstallを実行するとコピーするようなものをかいてました。
これで、git flow feature start/finish id/xx をすると自動で、ステータスを進行中/終了にできて、 git isssue update –status=5みたいのを手動で実行しなくて済むと思ったのですが、
上記のスクリプトが何かおかしいのか原因がよくわかってませんが、git isssue updateの挙動がおかしくなって上手く出来ませんでした。

多分、上記のスクリプトがおかしいのだと思いますが解決できませんでしたが、手動でやってもgit-issueはとても便利なのでredmineとgitをあわせて使う人は触ってみると良い気がします。

git flow feature start/finish

iOSアプリ(Objective-C)を書き始めて半年たったので、それまでに触ったりした開発ツールやObjective-Cのライブラリなどについてまとめてみる。

開発ツール

AppCode

個人的にはXcodeより好きなので、コードを書く時は基本的にAppCodeで書いていた。
デバッガー周りやエラー表示についてはXcodeの方いいところが多いので、Xcodeも併用する。(どっちにしてもxibやData ModelをいじるときにはXcodeが必要な気がするので両方共起動してる事が多かった)
AppCodeはリファクタリングやXcodeでAnalyzeとかしなくてもメモリ解放忘れとかわかるのと、Quick fix(Alt+Return)がすごく便利なので書くときにリズムを生むのに役立った。
WebStormも使っているので同じ系統のIDEに慣れているのもあるけど、JavaScript書いてる時よりObjective-C書いてる時のほうがIDEの機能を色々使った気がする。

どちらのIDEでもComplete Current Statementの機能はものすごく便利。

Ingredients :: Cocoa Documentation Viewer

Appleドキュメント形式のドキュメントビューアー。
そこまで使わなかったけど(ググる癖があったので)、Appleのデベロッパーサイトは好きじゃないので、ドキュメントビューアーで見られると便利だった。
日本語リファレンス – 福井高専IT研究会OfficialWiki もリファレンス的に便利。 
(JSReference でさりげなく両方共検索できるようにしている)

TestFlight

TestFlightでテスターにアプリをインストールしてもらっているので、これが無いと面倒くさすぎて辛い。
TestFlightの使い方と導入方法 で使い方とかまとめた。

その他

ライブラリ関係

ShareKit

Twitterに投稿する機能をつけるときに利用した。
そろそろiOS5とかにちゃんと対応したShareKit/ShareKit – GitHub 2.0が出るそうです。

ASIHTTPRequest

大抵のことができる通信ライブラリ。
[request release]; – All-Seeing Interactiveで開発終了宣言されてしまった…
(まだPull Requestのマージはやってるみたいだけど)

SVProgressHUD

ローディングとかのHUDを表示するライブラリ。
クラスメソッドで簡単に実行できるので便利。
ソースコードも読んで面白かった。

まあ似たようなものはいっぱいあるけど。

magicalpanda/MagicalRecord – GitHub

CoreDataをActiveRecord風に扱えるMagicalRecordの使い方 | Technology-Gymで使い方を書いた。
MagicalRecordを使い出してからCoreDataへの恐怖心は大分和らいだ。
正直CoreDataをそのまま触りたくは無い気がする。

JSONKit

plistでデータ持たせるよりJSONでデータ持たせるタイプ

GHUnit

iOSのテストフレームワーク。

等テストフレームワークについて色々書いたけど、今のところ安定して使えるGHUnitでテストを書いてる。

他 iPad

  • MGSplitViewController
    iPadのSplitViewControllerの代わりに使った。
    更新されてない+バグがいくつかあるので、forkしたものを使ったほうがよいのかもしれない。
    ARC対応してないけど2人でコミットしてる感じ http://t.co/COqXQY0y ARC対応とバグのパッチとかも取り込んでる感じ http://t.co/zONq3Biv ARC対応only http://t.co/fdfZkHZq
  • ATPagingView
    横にTableVewを並べたくなったので利用した。
    NavigationController内で使うと何かおかしな気がする…

ドキュメント

ドキュメントというほどドキュメントじゃないけど、作図とかスクリーンショット系のソフトウェア
正直iOS関係ない…

Skitch – Annotate, edit and share your screenshots and images…fast.

SkitchはGyazoに編集機能が追加された感じにスクリーンショットを気軽に貼付けできるので便利。
正直今はGyazoよりいいものになってる気がする。
設定でDirect linkをクリップボードに入れるようにすると便利になる。

Preferences

OmniGraffle

フローとかそういう図をかきながら整理するのに使える。
画像も簡単に入れられるのがいいところ。

blockdiag

テキストからブロック図を生成するツール。
エディタで図の元になるものを書くわけだけど、quickrun.vimでblockdiagのプレビューする | MemeTodoみたいな感じでプレビューしながら書いてた気がする。(不完全なので誰かがもっと良い方法をやってるはず)

redmineのwiki

redmineのWikiにとりあえず簡単なドキュメントとか書いたりするけど、正直redmineはあんまり好きじゃないです。

ATOK Pad

Skypeで書いてる時に、ATOK Padにとりあえず書いてからまとめてポストするために使ってる事が多い。

他の他

Stack Overflow

無いと結構厳しいですね。
iOS関係だとGoogle以上に優秀な感じがします。

GitHub

ライブラリ探すのにGithubを検索することは多い。
Google Code Search並の検索ができるようになるといいのだけど。

おわり

とりあえず色々使っていたソフトウェア等を書きだしてみた。
他の人の環境に興味があるので、2月だし他の人も書いてみるといいと思います。

ビルド -> Runあたりに何か無駄な時間が多いので、KIFやUI Automationなどの自動化やビルド周りを色々やっていきたい所。