Много ответов на StackExchange имеют дело с удалением данного файла из всех коммитов в истории с чем-то вроде:
git filter-branch --prune-empty -d /dev/shm/scratch \
--index-filter "git rm --cached -f --ignore-unmatch filename" \
--tag-name-filter cat -- --all
Однако в моем репо со временем было много данных, и я надеюсь значительно уменьшить его размер, отфильтровывая все файлы, отсутствующие в текущем рабочем дереве.
Со страницы руководства это можно сделать для индекса с помощью:
git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached
Из того, что я могу собрать, первая часть получает имена всех удаленных файлов, которые вторая часть удаляет их из кэшированной версии.
Что я не могу понять, так это то, как изменить версию команды rm фильтра-ветки, чтобы она сравнивала эту версию индекса с заголовком (таким образом, удаляя все удаленные файлы).
Цель этого состоит в том, чтобы удалить все файлы в истории, которых нет в текущем рабочем дереве.