Вот один из способов «отследить» любые файлы, которые иначе были бы проигнорированы в текущем наборе шаблонов исключения:
(GIT_INDEX_FILE=some-non-existent-file \
git ls-files --exclude-standard --others --directory --ignored -z) |
xargs -0 git rm --cached -r --ignore-unmatch --
Это оставляет файлы в вашем рабочем каталоге, но удаляет их из индекса.
Уловка, используемая здесь, состоит в том, чтобы предоставить несуществующий индексный файл для git-файлов, чтобы он думал, что нет отслеживаемых файлов. Приведенный выше код оболочки запрашивает все файлы, которые были бы проигнорированы, если бы индекс был пустым, а затем удаляет их из фактического индекса с помощью git rm.
После того, как файлы были «не отслежены», используйте git status, чтобы убедиться, что ничего важного не было удалено (если это так, измените шаблоны исключения и используйте git reset - путь для восстановления удаленной записи индекса). Затем сделайте новый коммит, который пропустит «crud».
«Crud» по-прежнему будет в любых старых коммитах. Вы можете использовать git filter-branch для создания чистых версий старых коммитов, если вам действительно нужна чистая история (например, использование git filter-branch будет «переписывать историю», поэтому не стоит предпринимать это легко, если у вас есть соавторы, которые вытянули любой из ваших исторических коммитов после того, как «груда» была впервые представлена).
git rm --cached
целые каталоги с-r
опцией, если это полезно