Nesta página
  1. Como a chave entra
  2. Apagar o arquivo deixa o passado
  3. O .gitignore chega tarde
  4. A ordem certa
  5. Repositório privado
  6. Antes do próximo repositório

Apagar o arquivo não apaga a chave

3 mingitseguranca

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:

.env · text
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 cada gesto faz com a chave
O que você fazO que acontece com a chave
Apaga o arquivo e commita de novoSome da versão atual. Fica nos commits antigos.
Coloca o arquivo no .gitignoreO Git ignora o arquivo novo. O que já entrou continua.
git rm --cached .envTira do próximo commit. O histórico antigo fica.
Revoga e gera outraA 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:

.gitignore · text
.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.

  1. Revoga a chave no painel de quem a emitiu. Gera outra. A velha tem que parar de funcionar.
  2. Troca a chave nova onde o app lê: no .env local e nas variáveis do servidor. Não commita esse arquivo.
  3. Tira o arquivo do histórico num clone novo. O GitHub documenta essa limpeza. Ela reescreve o branch.
  4. Avisa quem mais usa o repositório antes desse push.
  5. 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.

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.

Antes do próximo repositório

  • .gitignore com .env antes do primeiro commit
  • Nenhum segredo no código, no README ou no print do painel
  • .env.example só 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