Para todos os fins práticos, a primeira coisa com que você deve se preocupar é MUDAR SUAS SENHAS! Não está claro em sua pergunta se o seu repositório git é totalmente local ou se você possui um repositório remoto em outro lugar; se for remoto e não protegido por terceiros, você tem um problema. Se alguém clonou esse repositório antes de você consertar isso, eles terão uma cópia de suas senhas na máquina local e não há como você forçá-los a atualizar para a sua versão "fixa" com o histórico retirado. A única coisa segura que você pode fazer é alterar sua senha para outra em qualquer lugar em que você a tenha usado.
Com isso fora do caminho, veja como corrigi-lo. O GitHub respondeu exatamente a essa pergunta como uma FAQ :
Nota para usuários do Windows : use aspas duplas (") em vez de singles neste comando
git filter-branch --index-filter \
'git update-index --remove PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA' <introduction-revision-sha1>..HEAD
git push --force --verbose --dry-run
git push --force
Atualização 2019:
Este é o código atual da FAQ:
git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" \
--prune-empty --tag-name-filter cat -- --all
git push --force --verbose --dry-run
git push --force
Lembre-se de que depois de enviar esse código para um repositório remoto como o GitHub e outros clonarem esse repositório remoto, você estará em uma situação em que está reescrevendo o histórico. Quando outras pessoas tentam retirar suas alterações mais recentes depois disso, elas receberão uma mensagem indicando que as alterações não podem ser aplicadas porque não é um avanço rápido.
Para corrigir isso, eles terão que excluir o repositório existente e cloná-lo novamente ou seguir as instruções em "RECUPERANDO DO UPSTREAM REBASE" na página de manual do git-rebase .
Dica : Executargit rebase --interactive
No futuro, se você acidentalmente confirmar algumas alterações com informações confidenciais, mas perceber antes de enviar para um repositório remoto, existem algumas correções mais fáceis. Se você tiver confirmado por último a inclusão de informações confidenciais, basta remover as informações confidenciais e executar:
git commit -a --amend
Isso alterará a confirmação anterior com as novas alterações feitas, incluindo remoções de arquivos inteiras feitas com a git rm
. Se as alterações estiverem mais antigas, mas ainda não forem enviadas para um repositório remoto, você poderá fazer uma nova análise interativa:
git rebase -i origin/master
Isso abre um editor com os commit que você fez desde seu último ancestral comum com o repositório remoto. Altere "pick" para "edit" em qualquer linha que represente um commit com informações confidenciais e salve e saia. O Git analisará as alterações e o deixará em um local onde você pode:
$EDITOR file-to-fix
git commit -a --amend
git rebase --continue
Para cada alteração com informações confidenciais. Eventualmente, você retornará à sua filial e poderá enviar com segurança as novas alterações.