( ꒪⌓꒪) ゆるよろ日記

( ゚∀゚)o彡°オパーイ!オパーイ! ( ;゚皿゚)ノシΣ フィンギィィーーッ!!!

git-ignoreというコマンドを書いた話


ちょろっと書けそうだったので書いた。

yuroyoro/git-ignore · GitHub

Demo

Installation

PATH通った場所においてくれ

curl -sL https://raw.githubusercontent.com/yuroyoro/git-ignore/master/git-ignore > ~/bin/git-ignore

Examples

`git ignore add "pattern"`で、.gitignoreへ追加する。

$ git ignore add '*.log'


.gitignoreから削除するには、`git ignore remove "pattern"`を実行する。

$ git ignore remove '*.log'


add/removeには複数のパターンを同時に渡すことができる。

$ git ignore add '*.log' '*.bak'


`git ignore list`で定義されているパターンを出力。

$ git ignore list


`--global` オプションを使うことで、グローバルな `.gitignore` (`$HOME/.gitignore`)に対してadd/removeすることも可能。
以下のコマンドで、`*.class` を `$HOME/.gitignore` へ追加する。

git ignore --global add "*.class"


`git ignore pull ` コマンドでは、github/gitignoreから引数の言語に応じた.gitignoreファイルを取得して、
存在していないパターンを追加することが可能。
以下の例では、Haskell.gitignoreGithubからダウンロードする。

$ git ignore pull Haskell


引数なしで`git ignore pull`を実行すると、引数に指定可能な一覧を確認することができる。

$ git ignore pull

ぼくのかんがえたさいきょうのGit Repository Browser: Gitterb をRuby2.1.2/Rails4にupgradeしてDockerImage作った話

3年ほど前に、GitterbというGitリポジトリのコミットログを可視化するツールを作った。


このアプリケーションはRuby1.9/Rails3.2 で書かれていて、今となってはもう動かないので、Ruby2.1/Rails4へupgradeした。

デモサイトはこちら http://gitterb.yuroyoro.net/


依存しているGritというRubyからGitリポジトリをホゲるGemがRuby2系では動かないので、libgit2のRubyバインディングであるRuggedに移行している。

あと、せっかくなのでCentOS7で動くDockerImageを作った。Docker Hubにおいてある。

以下のようにdocker pullした後にrunすると、port3000でサンプルが起動する。

docker pull yuroyoro/gitterb
docker run -d -p 3000:3000 -t yuroyoro/gitterb


macでboot2dcoker使ってる人は、port forwardingしてくだされ。

ssh -N -L 3000:127.0.0.1:3000 docker@localhost -p 2022

( ꒪⌓꒪) あばばばばばばばば

gitでブランチを切り替えた時に何かする(例えばrbenvでRubyのバージョンを切り替えたり)

タイトルの通りのことをやりたかったっぽいので。


例えば、現在のRubyのバージョンはREE 1.8.7だけど、次回リリースからは1.9.3にあげることになっている場合なんか、masterブランチはREE使うけどdevelopブランチは1.9.3で動作させる必要があるっぽいけど、checkoutするたびにrbenv localとかするのダルいしよく忘れるので全力回避したいっぽいです。


で、どうやるかというと、gitのhookでpost-checkoutというのがあり、そこに色々書くとふんわりとやってくれる風味っぽい。


gitリポジトリの.git/hooks/post-checkout をこんな風に書いておくとよいっぽい。

#!/bin/sh

# Change ruby version
CURRENT_BRANCH=`git rev-parse --abbrev-ref HEAD`

RUBY_VERSION=`git config branch.${CURRENT_BRANCH}.ruby.version`
if [ $? -ne 0 ]; then
  RUBY_VERSION=`git config --global ruby.version`
fi

BUNDLE_GEMFILE=`git config branch.${CURRENT_BRANCH}.ruby.gemfile`
if [ $? -ne 0 ]; then
  BUNDLE_GEMFILE=`git config --global ruby.gemfile`
fi

if [ -n "${RUBY_VERSION}" ]; then
  echo "  change local ruby version to ${RUBY_VERSION}"
  rbenv local ${RUBY_VERSION}
fi

if [ -n "${BUNDLE_GEMFILE}" ]; then
  echo "  set gemfile to ${BUNDLE_GEMFILE}"
  export BUNDLE_GEMFILE=${BUNDLE_GEMFILE}
fi


使用するRubyのバージョンは、こんな風にglobalな設定と、ブランチ毎の設定をそれぞれやっておく

# globalな設定(systemのrubyを使うっぽい)
git config --gobal ruby.version system

# developの設定
git config --gobal branch.my_cool_branch.ruby.version 1.9.3-p448
git config --gobal branch.my_cool_branch.ruby.gemfile ~/dev/awesome_rails_app/Gemfile.1.9.3

# my_cool_branchの設定
git config --gobal branch.my_cool_branch.ruby.version  2.0.0-p195
git config --gobal branch.my_cool_branch.ruby.gemfile ~/dev/awesome_rails_app/Gemfile.2.0.0


これで、git checkoutした時にpost-checkoutが走って、設定されたバージョンにrbenvで切り替えるっぽい

$ git checkout develop
Switched to branch 'develop'
  change local ruby version to 1.9.3-p448
  set gemfile to ~/dev/awesome_rails_app/Gemfile.1.9.3
$ ruby -v
ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-linux]


Rubyのバージョン切替以外に、ブランチ毎になんかしたかったらpost-checkoutに書くとよいっぽい。

一時的にブランチを切り替えてコマンドを実行するgit-switchっての作った話

gitで、一瞬だけ他のブランチに切り替えてコマンド実行したいときに毎回checkoutとかすんのタルいし、workspaceに変更があったらgit-nowしたりstashしたりしないとブランチ切り替えられなくてタルいので、一時的に他のブランチに切り替えて指定したコマンドを実行するラッパーを書いた。書いた。


dotfiles/bin/git-switch at master · yuroyoro/dotfiles · GitHub

git switch [--repository=<path>] [--new-workdir=<path>] <branch> <command...>


`git switch foo_master git show`ってやると、fooブランチに切り替えて`git show`を実行する。コマンドは別になんでもいいので、`git switch hogehoge rspec spec/hoge_spec.rb`のように、他のブランチでrspec流したり可能です。


以下は、一時的にcomposable_procに移動してgit show -sを実行した様子。

ozaki@mbp-4 ( ꒪⌓꒪) $ git br
  composable_proc
* trunk

ozaki@mbp-4 ( ꒪⌓꒪) $ git switch composable_proc git show -s
Already on 'composable_proc'
commit 20c1b806490233db0467ac4332ba073edca7889f
Author: Tomohito Ozaki <ozaki@yuroyoro.com>
Date:   Sun Mar 10 02:34:12 2013 +0900

    proc.c: Add Proc#flip


内部的に、git-new-workdirを使っているので、以下を参考にgit-new-workdirが使えるようにしておく必要があるです。

git-new-workdir が便利 - #生存戦略 、それは - subtech


デフォルトの動作では、/tmp以下に現在のリポジトリと同じディレクトリ名でgit-new-workdirして、そこでコマンドを実行するようになっている。すでにnew-workdirする先が存在する場合は再利用する。
workdirはオプション'--new-workdir='で変更可能だし。


注意点として、gitのコマンド実行とシグナルハンドラの関係上、シグナルをもらうプロセスがforkされるようなコマンドの実行には注意する必要がある。例えば、pryはCTRL-CによるSIGINTをtrapするが、fork元のgitプロセスはSIGINTでプロセスを終了する。そのため、git-switchではSIGINTをトラップして、forkしたコマンドの子プロセスを頑張ってぬっころすように実装している。このへんうまいことやる方法知りたい。

git symbolic-ref を利用して、ブランチに対して別名をつけることができて墓ドル

何が便利かというと、今git-flowで運用しているのだけど、リリースブランチを常に同じブランチ名で参照できるようになってうれしい。


例えば、次回にリリースブランチが'release/1.17.0'だとすると、'git symbolic-ref rc release/1.17.0'とすることで、'rc'という名前で参照できる。
エイリアス先の'release/1.17.0'のHEADが先に進んでも、rcも常に同じHEADを参照するので、一貫して'rc'という名前で扱える。

  $ git symbolic-ref rc refs/heads/release/1.17.0


これだけだとありがたみがない。が、無事に1.17.0がリリースされて、その次のリリースブランチがrelease/1.18.0になったときでも、'git symbolic-ref rc release/1.18.0'でエイリアスを張り直せばいい。リリースブランチは、常に一貫して'rc'という名前でアクセスできる。


この機能、git-flowに入れたい。

svn - Is it possible to alias a branch in Git? - Stack Overflow

Jenkinsで外部パラメータで与えたブランチを対象にビルドできるようにしておくと凄惨性あがって墓ドル

テストが終わるまでの時間で書いてみる。

Jenkinsでジョブを実行させるときに、外部パラメータで任意のブランチを対象にビルドできると墓ドル。

例えば、自分のローカルブランチをマージするまえに、テストが通るか確認したい場合とか。

そんなのローカルでテストすりゃーいいじゃんって言われるかもしれないが、 テスト全部通すのに時間が掛かるようになってると、とりあえずCIに実行を投げておいてあとで確認するほうがずっと効率がいい。


F.Y.I: Building github branches with Jenkins

ジョブの設定

「ビルドのパラメータ化」にチェックをつけて、以下のようにbranchって名前のパラメータを設定しておく。
f:id:yuroyoro:20121220174907p:plain


ソースコード管理システム」で「Branches to build」のところに、設定したパラメータである"$branch"を入れておく。
f:id:yuroyoro:20121220174921p:plain


ジョブの設定は以上。上記の方法はGitの場合だけど、他のVCSでも似たようなことできると思う多分。

ジョブの実行

ビルドを実行したいブランチをpushした上で、「ビルド実行」をクリックするとブランチを入力するように言われるのでよろしくやる。
f:id:yuroyoro:20121220174929p:plain


自分は、ブラウザから実行させるのがタルいので、以下の用にcurlでjenkinsにリクエストを送る事でジョブをkickしている。墓・ドル。

$ curl -v http://<your jenkins host>/job/<job name>/buildWithParameters\?branch\=<branch name>

* About to connect() <your jenkins host> port 80 (#0)
*   Trying <your jenkins ip>... connected
* Connected to <your jenkins host> (192.168.1.171) port 80 (#0)
> GET /job/yuroyoro-build/buildWithParameters?branch=origin/features/ci_test  HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.12.9.0 zlib/1.2.3 libidn/1.18 libssh2/1.2.2
> Host: <your jenkins host>
> Accept: */*
> 
< HTTP/1.1 302 Found
< Date: Thu, 20 Dec 2012 08:25:55 GMT
< Server: Winstone Servlet Engine v0.9.10
< Location: http://<your jenkins host>/job/yuroyoro-build/
< Content-Length: 0
< X-Powered-By: Servlet/2.5 (Winstone/0.9.10)
< Via: 1.1 <your jenkins host>
< Content-Type: text/plain
< 
* Connection #0 to host <your jenkins host> left intact
* Closing connection #0

注意点として、[branch name]は'origin/features/ci_test'のように指定しないといけない。

実行結果の確認

ジョブの結果は、Growl pluginを利用して通知を受け取るようにしている。墓$。

Jenkinsの通知をGrowlで受け取る - Basic

実行ログは、jenkins.gemを使ってCLIから確認している。'jenkins [job name]'で最新の実行ログを取ってきてくれる。墓。


jenkins | RubyGems.org | your community gem host
cowboyd/jenkins.rb-history · GitHub


こんな感じで、ビルド実行ブランチをパラメータ化しておくことで、いつでも好きなときに、メインラインにマージ前のブランチのテストをCI鯖に任せることが可能になった。
curlとGrowl pluginとjenkins.gemのおかげで、「ジョブ投入 → 終了通知 → 結果確認」をすべてCLI内で完結させることができて、凄惨性あがって墓ドル。