git filter-branch で特定のファイルだけを残すのは find 内完結の方が良い2019年01月29日 13時14分09秒

以前の git filter-branch で特定のファイルだけを残すでは、find の結果を xargs に渡していたが、 削除対象になるファイルが無いと filter-branch が止まってしまう。rm に -f を渡せば、エラーコードが返ることも無いが、強制削除になる点が恐かった。

そこで、-exec を使って若干完結化。

% git filter-branch --tree-filter 'find * ! -type f -name "*.sh" -type f -exec rm {} \+' --prune-empty
find の -exec を \; で終らせると、コマンドは各一つづつのファイルに対してコマンドが実行され、\+ だと、複数の対象ファイルに対してコマンドが実行される様になる。

一番ややこしかったのが、文字列のエスケープ。filter-branch に渡すコマンドが一段回展開されてしまうので、普段の要領で find を使うと何処にバックスラッシュをつけるのかがこんがりやすい。