Перевод статьи «How to remove a sensitive file from your commit history on GitHub».
О, да! У большинства из нас такое случалось хотя бы раз за годы работы, особенно в начале карьеры. Мы случайно коммитим конфиденциальные данные на GitHub. Например, забываем добавить в gitignore наш конфиг-файл, содержащий пароли базы данных или ключи API, или jwt secret. И мы тут же начинаем паниковать.
Это случилось и со мной пару дней назад. Я забыла добавить в gitignore мой дефолтный JSON-файл, содержащий пароль для соединения с базой данных и jwt secret. Функция, которую я писала, наконец-то заработала, и на волне воодушевления я немедленно закоммитила и отправила код на GitHub. Допущенную ошибку я обнаружила, только получив уведомление от GitGuardian о том, что мой последний коммит содержит секретные ключи.
Если вы оказались в такой же ситуации, первое, что нужно сделать, это изменить видимость репозитория. Если репозиторий публичный, сделайте его приватным. Таким образом никто посторонний не увидит ваш конфиденциальный файл, пока вы работаете над его удалением.
Далее, если вы еще не находитесь в папке своего проекта, перейдите в него (команда cd
в вашем терминале). Допустим, моя папка проекта называется My-Project, а в ней содержится конфиденциальный файл secretFile.json, который я хочу удалить.
cd My-Project
Затем запустите следующую команду. Вам нужно указать путь к файлу, а не только его имя.
git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch config/secretFile.json" \ --prune-empty --tag-name-filter cat -- --all
В моем случае secretFile.json находится в папке config. Замените config/secretFile.json на путь к своему файлу, который должен быть удален.
Примечание. Эта команда удалит файл и из вашего локального репозитория, так что заранее скопируйте его содержимое в блокнот.
Затем создайте этот файл заново и добавьте его в .gitignore, чтобы снова случайно не отправить его на GitHub. Сделать это можно следующим образом:
echo "name-of-your-file" >> .gitignore git add .gitignore git commit -m 'add file to .gitignore'
Когда вы внесли все нужные изменения, можно отправить их на GitHub.
git push origin --force --all
Вот и все! История вашего репозитория чиста, а от конфиденциальных файлов в ней не осталось и следа.
Примечание от редакции Techrocks
В других источниках, в частности, на Хабре, есть некоторые оговорки насчет использования этого метода. Во-первых, нужно учитывать, не зависят ли от состояния репозитория другие ветки и форки. Во-вторых, несмотря на исправление коммита, старый вариант останется в кеше, поэтому нужно будет заняться его очисткой. О других способах исправления допущенных ошибок можно почитать в статье «Как это отменить?! Git-команды для исправления своих ошибок» и «Доходчивое объяснение Git Reset».
[customscript]techrocks_custom_after_post_html[/customscript]
[customscript]techrocks_custom_script[/customscript]