Почему это важно?
Любая система хранения версий кода создана с целью сохранения всех изменений проекта за всю историю его существования и (следует признать) любая система хранения версий справляется с этим отлично. Поэтому будьте уверены, если когда-то в вашем коде промелькнул пароль, токен или ключ — он не пропадет в тот момент, когда вы уберете его из актуального кода и злоумышленник сможет получить к нему доступ тогда, когда все уже забудут про сам факт существования важной информации в каком-то старом коммите.
Плохие новости состоят в том, что не существует волшебной пилюли, которая просто всё исправит и не потребует от вас никаких лишний действий или головной боли после. Хорошие новости в том, что решение всё таки существует, хотя оно и изменит каждый коммит, начиная с момента «изъятия» важной информации из хранилища — а значит, вы получите совсем другую ветку кода, с совсем другими хешами коммитов.
git filter-branch --tree-filter 'git ls-files -z "*" |xargs -0 perl -p -i -e "s#(PASSWORD1|PASSWORD2|PASSWORD3)#NOT_A_PASSWORD_ACTUALLY#g"' -- --all
git reset --hard
git gc --aggressive --prune
Вся магия — в первой команде, которая пройдет по всем коммитам текущей веткеи и заменит PASSWORD1, PASSWORD2, PASSWORD3 на безопасный плейсхолдер — NOT_A_PASSWORD_ACTUALLY.