history を辿ってあるファイルが削除・追加されたコミットを調べる

git pullしたら何故かファイルが無くなっておりビルドが通らなくなった」ということが過去にあり、その時に調べた方法です。一部変えれば削除だけでなく追加も調べられるのでついでに。

  1. 削除コミット
  2. 追加コミット

削除コミット

for h in $(git log --no-merges --format="%H" -- <filename>)
do
  if test $(git show $h --name-only --format="" --diff-filter D | grep <filename>)
  then
    echo $h
    break
  fi
done
# あれば `cfb0099a5ea07f474bbe197783d96ac5294d85dd` のようなコミットハッシュ

2つある<filename>へは削除されたファイル名の相対パスを書きます。

このスクリプトの本体は大体、

git show <commit-hash> --name-only --format="" --diff-filter D | grep <filename>

を繰り返し実行してることになります。

この1行は<commit-hash>のコミットで削除されたファイルの中から<filename>なものがあるか調べるコマンドです。show--diff-filter Dを追加するとそうした削除したファイルのみを表示させることができます。
また--name-onlyを付けてファイル名だけ、--format=""で、

commit <hash>
Author: <author>
Date:   <author date>

のようなヘッドが出力されないようにしてます。

対象のファイルが出現したタイミング(削除されたコミット)を見つけると、そのコミットハッシュを表示して処理を終わります。そして見つけたコミットはgit show <commit-hash>でじっくり眺めることができます。

追加コミット

--diff-filterはファイルの状態で絞り込むオプションです。例えば削除ならD、追加ならA、変更ならMのように指定します。

もう大体お分かりのように追加コミットを調べるには--diff-filterAに変更するだけです。

for h in $(git log --no-merges --format="%H" -- <filename>)
do
  if test $(git show $h --name-only --format="" --diff-filter A | grep <filename>)
  then
    echo $h
    break
  fi
done
# あれば `cfb0099a5ea07f474bbe197783d96ac5294d85dd` のようなコミットハッシュ