gitをより便利にするsubcommand集を作った

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 は以下のツールに依存しています。

  1. git clone https://github.com/himanoa/git-subcommands ~/git-subcommands
  2. PATHを ~/git-subcommands/src に通す
    1. 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の出来が微妙なのは致命的に僕にとって期待はずれで、Pythonで書かれたコードを全部Rustにリプレースするのを考えています。

おわりに

himanoa/subcommandsはテストもなければ書き方も微妙な単一ファイルのスクリプト集ですが、僕の実務を支える重要なツールになってきています。

こんな粗悪なスクリプト一枚でも実務の効率をぐーんと上げる事ができるので、git周りで不便なワークフローが存在しているならサブコマンドとして実装してみると便利だとと思います。

欲求ボタン