fzf で git add する
はじめに
fzf 便利ですよね。 煩わしいコマンドラインのファイルパス入力は極力 fzf で済ませたくなってきます。
git add 時の疲労を fzf で軽減する
git add で一部のファイルだけ add したいとき、add したいファイル全てのパスを列挙する必要があります。
git add -p でコード単位で add する方法もありますが、更新量が多い場合などファイル単位で add したいときは面倒です。
シェルスクリプトを組む
今回はシェルスクリプトを用いていますが、bashrc や zshrc などで関数として定義することも可能です。
また、git add のオプションを利用することができます。
#!/bin/bash local addfiles addfiles=($(git status --short | awk '{ print $2 }' | fzf --multi)) if [[ -n $addfiles ]]; then git add ${@:1} $addfiles && echo "added: $addfiles" else echo "nothing added." fi
解説
シェルスクリプトの流れを追っていきます。
はじめに、fzf で選択された add したいファイルをローカル変数に代入します。
local addfiles addfiles=($(git status --short | awk '{ print $2 }' | fzf --multi))
まず、未ステージング状態の (add されていない) ファイルの一覧を git status --short
で取得します。
git status --porcelain でもファイル一覧は取得できますが、git リポジトリのルートディレクトリからのパスで出力されるため、ルートディレクトリ下から git status --porcelain を叩くと期待したパスが得られません。
このコマンドは、例えば以下のような出力が得られます。
M ../Makefile ?? ../test
awk '{ print $2 }'
で、スペースを区切りとしたときの 2 列目のみを出力します。
../Makefile ../test
これでファイルパスが得られたので、 fzf --multi
で fzf を起動します。 --multi
は Tab キーで複数選択できるようにするオプションです。
また、tmux を利用しているのであれば、 fzf
ではなく fzf-tmux
を使用するとなお捗るかもしれません。
最後に、得られた add したいファイル一覧を git add します。
if [[ -n $addfiles ]]; then git add ${@:1} $addfiles && echo "added: $addfiles" else echo "nothing added." fi
-n $addfiles
で fzf で何らかの候補がひとつ以上選択された場合のみ git add するようにし、 ${@:1}
はシェルスクリプトに渡された引数で、これを git add に渡すことで git add のオプションを利用できるようにしています。