Как я могу найти пустой git коммит?

Какие команды можно использовать для поиска пустых коммитов в репозитории git, т.е. коммиты, которые будут удалены с помощью git filter-branch --prune-empty?

Ответ 1

Вы хотите исключить недействительные коммиты и слияния, а затем посмотреть, какие из них имеют то же дерево, что и их родитель.

for sha in $(git rev-list --min-parents=1 --max-parents=1 --all)
do
   if [ $(git rev-parse ${sha}^{tree}) == $(git rev-parse ${sha}^1^{tree} ) ]
   then
       echo "${sha} will be pruned"
   fi
done

Ответ 2

В первом приближении список всех коммитов в обратном порядке и записывает любую строку, которая имеет тот же самый хэш дерева, что и раньше:

git log --all --reverse --format='%H %t' | while read h t; do
  if [ "$lt" = "$t" ]; then
    echo "$h"
  fi
  lt="$t"
done

Вы можете улучшить это, проигнорировав любой фиксатор с несколькими родителями и подтвердив, что зарегистрированная строка на самом деле является дочерним элементом ранее.