エディタが自動で削除した行末の空白以外の修正を git addする


これを見たとき、あるあるって思ったので実現のためのコードを書いてみました。

今まではこのことを防ぐために'emacs -nw'で起動したときは行末のスペースを自動で削除しない
ようにしてました。またtoggle-delete-trailing-whitespace-settingを使ったりもしました。


でもまあ普段使っているエディタでそのままやってそのまま addするって
いうのが良かったので、作ってみたということです。

コード

手順は以下のとおりです。

  1. 'git diff --ignore-space-at-eol'で行末のスペース削除以外の差分を取得
  2. 'git checkout'で該当のファイルを元に戻す
  3. (1)で取得した差分を元に戻したファイルに適用
  4. (3)のファイルを 'git add'する
#!/bin/sh

tmp_patch=$(tempfile) || exit 1
is_modified=0

for file in $@
do
    $(git diff --ignore-space-at-eol $file > $tmp_patch) || exit 1

    backup=${file}.orig
    cp -n $file $backup || exit 1

    git checkout $file || exit 1
    git apply $tmp_patch || exit 1

    git diff $file || exit 1

    echo -n "OK? [y/n] >> "
    read answer
    case $answer in
        [yY]*)
            echo "git add $file"
            git add $file || exit 1
            is_modified=1
            ;;
        *)
            mv $backup $file
            ;;
    esac
done

if [ "$is_modified" = "1" ]
then
    echo "Please check 'git diff --cached' before commit"
fi

まとめ

エディタが削除した行末の空白以外を git addする方法について紹介しました。
本家 gitにあってもいいかなと思ったんですけど、今のところはないようです。
まあ人のコードをいじるのが中心の人は、行末スペース自動削除なんていうのは
offしとけという話なのかもしれないですけどね。


しかしシェルスクリプトの caseを逆を綴るというのはとっさには出てこないなぁ。
まあエディタの機能を済むのでそちらを覚えたほうが良さそうです。

gist

行末のスペースの削除以外の修正を git addする · GitHub


Perl版も作成したのでおいておいた。