Барев дзес! На связи Гагик Антонян. Я — Frontend-разработчик и это моя первая статья на Хабре. Сегодня вы узнаете, как полноценно удалять .env
, который по ошибке попал на удалённый Github-репозиторий. Буду рад, если поддержите данный материал лайками и комментариями. А теперь погнали рвать пределы IT-галактики.
Разрабатывая приложения, часто сталкиваюсь с тем, как после очередного коммита, в репозитории вижу один из ключевых файлов, когда я работаю с переменными окружениями, оказалась на странице репозитория Github. Речь идет о файле .env
, чей общедоступность может быть опасным. И для того, чтобы обезопасить хранение конфигурационных переменных и настроек приложения, используется данный текстовый файл.
Я работаю на VS Code, и, если честно, так и не понял, с какой стати .gitignore
"не игнорирует" .env.
Причем спокойно "игнорирует" другие файлы, директории.
Всё же, нужно действовать, исходя из конкретного кейса, но если вы не хотите, чтобы какой-нибудь John Doe воспользовался данными из вашего .env
, то вы перешли по верной ссылке. Вы же не отдаете ключи грабителю с фразой "Грабьте мой дом", верно? Так же и тут. Поэтому предлагаю потихоньку начать.
Шаг 1: Создание проекта
В этом шаге я создам приложение Next.js. С этим проектом буду работать на VS Code. Осуществляю создание Next.js-проекта через пакетный менеджер pnpm.
pnpm dlx create-next-app@latest kill-env
После того, как я задал настройки в терминале, как будет выглядеть проект (в статье это не важно), перейдем к коду. Но перед этим хочу связать проект с удаленным репозиторием Github. Итоговую файловую систему можно увидеть на картинке.
![Готовый проект в VS Code Готовый проект в VS Code](https://habrastorage.org/getpro/habr/upload_files/5a9/573/d7a/5a9573d7a9b4631a34702a196bf4f290.jpg)
Шаг 2: Подключение локального проекта с Github-репозиторием.
Ничего сверхъестественного, здесь создаю репозиторий для моего проекта и делаю последующее связывание с локальным репозиторием. На этой короткой ноте переходим к 3 шагу.
P.S.: Я не буду здесь прописывать и так ясные команды для связывания, поэтому результат представлен на картинке.
![Репозиторий, откуда могут быть "сюрпризы" Репозиторий, откуда могут быть "сюрпризы"](https://habrastorage.org/getpro/habr/upload_files/f5e/145/14e/f5e14514e16dd065da7cddcb0e13da05.jpg)
Шаг 3: Разбор кейса и его решение
3.1 В какую проблему можно попасть из-за невнимательности
Предположим, что я, увлекшись разработкой чудо-приложения, забыл к коммиту добавить файл .env
в .gitignore
, находящийся в корневой директории проекта. Из-за этого секретный файл попадает на страницу удалённого репозитория, что не хорошо.
Для приличия моего коммита я практически полностью удалил код разметки в одном из файлов моего проекта. Сюр в том, что коммит уже на удалённом репозитории и .env
файл вместе с остальными изменениями. Как не должно быть в вашем репозитории показан на картинке:
![Мои "поздравления", секретный файл теперь уже не секретный... Мои "поздравления", секретный файл теперь уже не секретный...](https://habrastorage.org/getpro/habr/upload_files/8f7/a82/3dd/8f7a823dd77fd32e9ebdb73942f65b50.jpg)
Да, .gitignore
файл не отменяет уже зафиксированные изменения (поэтому название папки зависимостей проекта закрашен в серый цвет но не несчастный .env
. Это можно увидеть на приложенной картинке. И так, как мы можем это исправить?
![Да, на это очень больно смотреть... Да, на это очень больно смотреть...](https://habrastorage.org/getpro/habr/upload_files/2ea/29f/f13/2ea29ff13ac1528e62521a2801482016.jpg)
3.2 Решение проблемы
Для начала воспользуемся следующей командой:
git rm -r --cached .env
![Последствие выполнения команды git rm -r --cached .env Последствие выполнения команды git rm -r --cached .env](https://habrastorage.org/getpro/habr/upload_files/688/936/e5c/688936e5ccd0b6e26d0ed6c23bae93ef.jpg)
git rm -r --cached .env
Не бойтесь, мы удаляем файл .env
и все его подпапки из области подготовки Git, но не из самой файловой системы проекта. Внеся изменения, увидим, что .env
больше не числится в списках файлов проекта.
![](https://habrastorage.org/getpro/habr/upload_files/21b/445/fbb/21b445fbbaf3f0ab5eaccff43dcde935.jpg)
Если вы думаете, что это happy end, то спешу разочаровать: это ещё не конец. Перейдя на историю коммитов можно обнаружить заманчивую вещь: хоть мы удалили файл из корневой директории проекта, данные из файла .env
как были в истории, так и остались. Не верите? Показываю это на картинке:
![Просчитался, но где, ара? Просчитался, но где, ара?](https://habrastorage.org/getpro/habr/upload_files/a58/8ca/48b/a588ca48b24162e171450bff07aa63e9.jpg)
Пришло время раз и навсегда расправиться с этой проблемой. Вводим следующую команду, которая удаляет все файлы и папки с именем .env
из истории коммитов текущей ветки (HEAD
):
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch .env" HEAD
В ответ получим предупреждения о том, что это испортило нашу историю, поскольку это пройдет через всю нашу историю и на 100% устранит её существование. Выполняем следующую команду.
git push --force
После этой команды можно увидеть наши коммиты, однако содержимое файла .env
больше не существует в истории коммитах. Показываю на пикче:
![Миссия выполнена Миссия выполнена](https://habrastorage.org/getpro/habr/upload_files/cb5/c13/fc4/cb5c13fc43baea0b79df4aa70bafb132.jpg)
С помощью нескольких команд можно добиться такого результата: и .env
удалён из удалённого репозитория, и не отображается его содержимое в истории коммитов. Надеюсь, что эта статья поможет вам более эффективно отправить на вечный покой файл .env
.
По этой ссылке можно перейти на Notion-статью в укороченной версией с картинками и кодом
Спасибо, что вы прочли эту статью! До скорых встреч!