repoで作業していて変更を加えたファイルを開き直してさらに追記したいケースは少なくない。historyから絞り込んで選択するよりは、差分が発生したファイルのリストから絞り込む方が見通しが良いのではないか、ということで普段は差分が発生したファイルから絞り込んでいる。以下のようなファイルを git-edit-changed
という名前で $PATH
のいずれかのディレクトリの中に置いて実行権限をつけておくと git edit-changed
コマンドとして呼び出せる。
#!/bin/bash filepath=$({\ git ls-files $(git rev-parse --show-toplevel) --exclude-standard --others --full-name; \ git diff --name-only HEAD; \ } | sort -u | peco) if [ ${#filepath} -ne 0 ]; then cd $(git rev-parse --show-toplevel) && ${EDITOR} ${filepath} fi
git ls-files $(git rev-parse --show-top-level) --exclude-standard --others --full-name
では、untrackedなファイルをrepo rootからのパスとして出力している。 --others
はgit管理されていないファイル群を出力するためのオプション。これを指定するだけでは .gitignore
等でignoreしているファイル群も含まれてしまうため、これらのファイルを無視するのが --exclude-standard
。 --full-name
を指定することで自分がどのディレクトリにいてもrepo rootからの相対パスとして出力できる。
git diff --name-only HEAD
では、HEADからの差分を出力している。git diff --name-only
単体では、indexと現在の差分が出力されてしまうので、 HEAD
をつけることで最新コミットからの差分を出力する。untrackedなファイルはindexに追加すると上記のコマンドでは出力されなくなり、こちらのコマンドで出力されるようになる。
これらの出力を {}
でひとつにまとめてパイプで sort -u | peco
に渡して絞り込んでから $filepath
に代入している。といった具合でHEADとの差分一覧(コミットする前のファイル一覧)を取得できる。
どうぞご利用ください。