エディタが自動で削除した行末の空白以外の修正を git addする
[緩募] gitでdiff -b相当のaddをしたい。つまり、エディタが勝手に実施したホワイトスペースの変更をcommit logに含めたくない。
これを見たとき、あるあるって思ったので実現のためのコードを書いてみました。
今まではこのことを防ぐために'emacs -nw'で起動したときは行末のスペースを自動で削除しない
ようにしてました。またtoggle-delete-trailing-whitespace-settingを使ったりもしました。
でもまあ普段使っているエディタでそのままやってそのまま addするって
いうのが良かったので、作ってみたということです。
コード
手順は以下のとおりです。
- 'git diff --ignore-space-at-eol'で行末のスペース削除以外の差分を取得
- 'git checkout'で該当のファイルを元に戻す
- (1)で取得した差分を元に戻したファイルに適用
- (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を逆を綴るというのはとっさには出てこないなぁ。
まあエディタの機能を済むのでそちらを覚えたほうが良さそうです。