git-ignoreというコマンドを書いた話
git-ignore add みたいのが欲しい
— azu (@azu_re) August 24, 2014
ちょろっと書けそうだったので書いた。
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
存在していないパターンを追加することが可能。
以下の例では、Haskell.gitignoreをGithubからダウンロードする。
$ 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 push 進捗
git remote rename origin 進捗 git commit -m '進捗ダメです' git push 進捗
便利
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って名前のパラメータを設定しておく。
「ソースコード管理システム」で「Branches to build」のところに、設定したパラメータである"$branch"を入れておく。
ジョブの設定は以上。上記の方法はGitの場合だけど、他のVCSでも似たようなことできると思う多分。
ジョブの実行
ビルドを実行したいブランチをpushした上で、「ビルド実行」をクリックするとブランチを入力するように言われるのでよろしくやる。
自分は、ブラウザから実行させるのがタルいので、以下の用に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.gemを使ってCLIから確認している。'jenkins [job name]'で最新の実行ログを取ってきてくれる。墓。
jenkins | RubyGems.org | your community gem host
cowboyd/jenkins.rb-history · GitHub
こんな感じで、ビルド実行ブランチをパラメータ化しておくことで、いつでも好きなときに、メインラインにマージ前のブランチのテストをCI鯖に任せることが可能になった。
curlとGrowl pluginとjenkins.gemのおかげで、「ジョブ投入 → 終了通知 → 結果確認」をすべてCLI内で完結させることができて、凄惨性あがって墓ドル。