TL; DR
- вы должны переписать коммит А, чтобы в первую очередь не содержать конфиденциальный файл
- вы должны использовать
git push -f
- вы еще не закончили: вы все равно должны очистить историю на сервере
Переписать коммит А и всю историю
Это должно быть то, что bfg
сделал для вас. Я предполагаю, что вы запустили что-то вроде bfg --delete-files <sensitive-file>
. Это должно было создать совершенно новую историю, где <sensitive-file>
никогда не существовало: коммиты, которые добавили или изменили его, а также другие файлы, должны быть переписаны без этого файла. Коммиты, которые только коснулись его, должны исчезнуть, поскольку теперь они будут пустыми коммитами.
Итак, теперь у вас есть коммит A ', копия A без <sensitive-file>
. Остальная часть истории переписана как ее наследники: C 'и т. Д.
Чтобы убедиться, что это произошло правильно, запустите эту команду как в старой, так и в новой изолированной программной среде, обновленной bfg
:
git log --all <sensitive-file>
Вы должны увидеть коммиты, затрагивающие чувствительный файл в исходном репо, но не выводимые в новом. Таким образом вы можете быть уверены, что файл действительно удален из истории.
Вы должны использовать git push -f
Sha1 коммита Git - это криптографическая подпись коммита, всех его метаданных (коммитер, дата, комментарий и т. Д.), Всего его содержимого и всей его истории.
Если вы измените какой-либо один аспект фиксации: дату, комментарии, содержимое или любой другой аспект любого из его предков, криптографическая подпись изменится по определению.
Так что единственный путь вперед - это git push -f
.
Вы, вероятно, еще не закончили
Но подождите, после выполнения git push -f
на сервере останутся копии старой истории. Смотрите здесь для GitHub: Если вы нажали на GitHub, будет слишком поздно, даже если вы принудительно оттолкнете его на одну секунду позже . По-видимому, единственный действительно безопасный способ удалить конфиденциальный файл из репозитория GitHub - это удалить его и воссоздать новый, содержащий только чистую историю, которую вы хотите сохранить. Существуют и другие решения, но ваш пробег может отличаться - подробности в сообщении.
Если вы используете другой или частный Git-сервер, не забудьте принудительно выполнить сборку мусора и следуйте дальнейшим рекомендациям по Удалите конфиденциальные файлы и их коммиты из истории Git