git checkout combined with grep to extract the values of these variables. filename=Makefile
for commit in $(git log --pretty=format:%H -- $filename); do
git checkout -q $commit $filename
version=$( grep -P -o '(?<=^VERSION = ).*' $filename)
patchlevel=$( grep -P -o '(?<=^PATCHLEVEL = ).*' $filename)
sublevel=$( grep -P -o '(?<=^SUBLEVEL = ).*' $filename)
extraversion=$(grep -P -o '(?<=^EXTRAVERSION = ).*' $filename)
name=$( grep -P -o '(?<=^NAME = ).*' $filename)
printf "%s %d.%02d.%d%-5s %s\n" $commit $version $patchlevel $sublevel "$extraversion" "$name"
done
# reset the file to its state in the current commit
git checkout HEAD $filename