gitをより便利にするsubcommand集を作った
Posted
gitにはsubcommandという仕組みが存在していて、パスが通ったディレクトリに+xなgit-xxxファイルを置いておくと、git xxx
で呼び出せる仕組みが存在します
具体例を上げると ~/bin/
にパスが通ってるとして、~/bin/git-wip
が存在したなら 任意のgitディレクトリで git wip
で ~/bin/git-wip
が呼び出せます。
さもgitのpluginのような顔をしていますが、別にプラグインだから専用のAPIにアクセスできるみたいなことはありません。
個人的にはgitの操作で結構ワンライナーでかけるけど毎回書くのに気合が必要なやつをラップするコマンドをサブコマンドとして管理すると便利だったりします。
たとえばリポジトリ内でgrepした結果を置換する git grep -l Foo | xargs sed -i '' -e "/Foo/Bar/g"
をサブコマンドとして実装するとかです。
やっと本題に戻りますが、これらのサブコマンド集を実装してリポジトリとして公開しました! himanoa/git-subcommands
インストール
himanoa/git-subcommands は以下のツールに依存しています。
- bash
- python
- 3.x推奨
- git
- git clone https://github.com/himanoa/git-subcommands ~/git-subcommands
- PATHを
~/git-subcommands/src
に通す - zshとかbashを使っているなら
export PATH=~/git-subcommands/src:$PATH
とかでいいのでは?
インストールが完了したら以下のセクションのサブコマンドがそれぞれ動作できるようになるはずです!
実装したコマンド
git-replace リポジトリ内の特定の文字列を置換する
いつも git grep -l Foo | xargs sed -i '' -e "/Foo/Bar/"
とか書いてた実装ですね。これをこのサブコマンドを用いることで以下のスニペットまで短縮できます
$ git strreplace Foo Bar
ちなみに自慢していたところを@unecochanさんに --word-regexp
オプションへの対応実装のPRをもらいました!ありがとうございました!
git-base-branch 本流となるブランチを記録する
プロジェクトによって開発者にとって主流になるブランチが違う場合があります。 例えばGitHub Flowを採用しているプロジェクトでは master ブランチが本流ですが、 Git Flow を採用しているプロジェクトでは develop ブランチが本流に当たります。
開発者が主流になるブランチを常に意識して git checkout
コマンドを発行しないといけないのはいささか荷が重いです。
そこで便利な道具なのが git base-branch
です
git base-branch -a master
を実行すればカレントディレクトリに BASE_BRANCH
という名前のファイルが追加されます。これは git base-branch
が使うファイルです。
BASE_BRANCH
というファイルが存在する場所で git base-branch
コマンドを実行すると先程オプションで指定いた master
という文字列が標準出力に出力されます。
これを git checkout
コマンドと組み合わせてみましょう! git checkout $(git base-branch)
なんということでしょう。masterブランチに帰還することができました!
git base-branch
を用いることでどのような開発フローを採用していても人間の記憶領域を侵食する必要がなくなるというわけです!
git-chistory checkoutしたブランチの履歴を表示する
普段仕事をしていると割り込みタスクなどで目まぐるしくブランチを切り替えることがあると思います。
そうなってくると記憶能力が弱い僕は3つ前に作業していたブランチをチェックアウトしたくても名前すら全く思い出せない時があります。
そこで便利なのが git-chistory
、このコマンドを実行すると git reflog
からcheckoutのログを抜き出して、移動したブランチのみを抜き出して列挙してくれます!
あとは fzf
なり peco
に食わせればいいだけなので簡単ですね!
$ git checkout $(git chistory | fzf)
git-exec コマンドを実行し実行したコマンドをコミットメッセージにしてコミットする
yarn add --dev @types/react
などコマンドを実行した結果起きた副作用をcommitしたい場合があります
僕はそのようなコミットをする時は常に Exec: yarn add --dev @types/react
のようなコミットメッセージにしたいのですが、運用でカバーだけでは大変です。
そのような運用をカバーするために作られたのがこのコマンド。引数で実行したいコマンドを渡すことによって、コマンドを実行したあとコミットまでやってくれる便利なツールです
$ git exec "yarn add --dev typescript"
使った言語の選定基準
リポジトリ見れば一目瞭然なのですが、主に使ったプログラミング言語はPythonでした。
選定理由としては以下の項目を重視した結果です。
他に考えていたプログラミング言語としては Rust
TypeScript(Node.js)
でした
- ランタイムがほとんどの環境でデフォルトで入っていること
- コマンドライン引数を解析するのに外部ライブラリを必要としないこと
とはいえPythonでこのまま書き続けるのは厳しいと判断せざる得ない問題も存在します
- 標準ライブラリのdoctestの出来が微妙
- 人力で2.xと3.xでのバックポートを意識しながらコードを書くのがつらい
- 今もPython2.xで適切に動くか怪しい
とくにdoctestの出来が微妙なのは致命的に僕にとって期待はずれで、Pythonで書かれたコードを全部Rustにリプレースするのを考えています。
おわりに
himanoa/subcommandsはテストもなければ書き方も微妙な単一ファイルのスクリプト集ですが、僕の実務を支える重要なツールになってきています。
こんな粗悪なスクリプト一枚でも実務の効率をぐーんと上げる事ができるので、git周りで不便なワークフローが存在しているならサブコマンドとして実装してみると便利だとと思います。
拍手ボタン