Apagar o arquivo não apaga a chave
A chave saiu antes de você mandar o link. O repositório estava público. O .env entrou no commit. Do outro lado, um robô lê commit público o tempo todo. Achou a chave, usa. A conta chega no seu nome.
Isso acontece com quem está começando e sobe o projeto pra mostrar. Não é um cliente. É o caminho mais comum de vazar segredo no Git.
Como a chave entra
O primeiro commit costuma acontecer antes do .gitignore. A chave está no código, ou neste arquivo:
CHAVE_DO_BANCO=cole-o-valor-aqui
No lugar de cole-o-valor-aqui vai o valor de verdade. A partir desse commit, o valor deixa de ser seu. Quem abre o repositório público lê. Quem clonou, guarda. O robô não espera você divulgar o link.
Apagar o arquivo deixa o passado
De manhã você apaga o .env, faz outro commit e respira. A tela do GitHub mostra a pasta limpa. O commit antigo continua no histórico, com a chave inteira. O Git é um diário: a página nova não rasga a página velha.
| O que você faz | O que acontece com a chave |
|---|---|
| Apaga o arquivo e commita de novo | Some da versão atual. Fica nos commits antigos. |
| Coloca o arquivo no .gitignore | O Git ignora o arquivo novo. O que já entrou continua. |
| git rm --cached .env | Tira do próximo commit. O histórico antigo fica. |
| Revoga e gera outra | A chave velha morre. A nova ainda não está no Git. |
O .gitignore chega tarde
O .gitignore evita que um arquivo novo entre no próximo commit. Ele não apaga o que já foi commitado. A lista certa, criada antes do primeiro commit, é esta:
.env
.env.*
!.env.example
.env.* pega .env.local e os outros. !.env.example deixa subir um exemplo com os nomes vazios, sem valor. O exemplo serve pra quem clona saber o que preencher. O valor real fica só na sua máquina, ou nas variáveis do servidor.
A ordem certa
A chave que já foi pra um repositório público está comprometida. Limpar o Git não desfaz isso. Quem já leu o commit continua com a cópia.
- Revoga a chave no painel de quem a emitiu. Gera outra. A velha tem que parar de funcionar.
- Troca a chave nova onde o app lê: no
.envlocal e nas variáveis do servidor. Não commita esse arquivo. - Tira o arquivo do histórico num clone novo. O GitHub documenta essa limpeza. Ela reescreve o branch.
- Avisa quem mais usa o repositório antes desse push.
- Se o repositório era público, pede ao suporte do GitHub para limpar a visão em cache. O commit ainda pode ser aberto pelo identificador antigo.
O guia do GitHub. A revogação da chave continua sendo o primeiro passo.
Repositório privado
Fechar o repositório protege o próximo push. Não salva a chave que já saiu. Se um dia ele voltar a ser público, o histórico antigo volta junto. Fork e clone feitos antes também ficam com a cópia.
Chave dentro do JavaScript do site vaza mesmo com o repositório fechado. Quem abre a página, enxerga.
O que o JavaScript da página enxerga, a pessoa na cadeira também enxerga.
Antes do próximo repositório
.gitignorecom.envantes do primeiro commit- Nenhum segredo no código, no README ou no print do painel
.env.examplesó com o nome da variável, valor vazio- Chave que já subiu: revogar primeiro, limpar o histórico depois
- Repositório privado não apaga commit que já foi público
