読者です 読者をやめる 読者になる 読者になる

fohte.log

大体雑に書く

fzf で git add する

はじめに

github.com

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 のオプションを利用できるようにしています。

広告を非表示にする