O git tem uma característica que pode ser um problema se o programador não prestar atenção ao clonar e enviar seus primeiros commits para repositórios quando ele trabalha em projetos diferentes, que é esquecer de alterar o autor e e-mail usado no repositório.
Mas para entender o que ocorre e buscar uma solução, vamos simular uma situação a seguir:
Imagine que eu trabalho em mais de uma projeto, e que ao clonar o primeiro eu defini as configurações globais de nome do autor e e-mail corretas do primeiro projeto. Fiz algumas alteração, e envio meu commit. Até ai, tudo bem.
Se eu conferir meu log, vai estar lá o commit, com o nome de usuário e e-mail corretos.
Agora eu mudei de projeto, e estou trabalhando em outro código, onde meu e-mail mudou, eu clono o novo repositorio, usando o novo usuário e senha, e começo a trabalhar, enviando alguns commits, quando eu vou ver o log, percebo que dei push com o usuário global do outro repositório.
E agora? como consertar esta bagunça, pois meu e-mail neste projeto é tiago@timeq.me.
Acredite, tive este problema ao usar o comando amend, que inclui as alterações no último commit, só não havia percebido que o ultimo commit não era meu, passei mais de uma mês commitando no usuário do meu colega.
Vamos primeiro explicar qual foi o meu primeiro erro: eu devo configurar estes dados por repositório e não global, e admito que esqueço muitas vezes! Então vamos consertar isto primeiro, definindo o usuário e e-mail sem o parâmetro –global.
Vamos enviar um novo commit e conferir o log.
Finalmente! Nosso git está versionando com o usuário correto, mas ainda temos um problema, os dois commits enteriores não mudaram, ou seja, somente os commits futuros serão armazenados de forma correta. Mas sem pânico! temos a solução para isto, e ela vem em forma de uma comando complicado, mas milagroso! Digite no bash a instrução abaixo, informando o e-mail antigo em OLD_EMAIL e os novos usuários e e-mails em CORRECT_EMAIL:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
git filter-branch --env-filter ' OLD_EMAIL="tiago@projetot.top" CORRECT_NAME="Tiago Pariz" CORRECT_EMAIL="tiago@timeq.me" if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ] then export GIT_COMMITTER_NAME="$CORRECT_NAME" export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL" fi if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ] then export GIT_AUTHOR_NAME="$CORRECT_NAME" export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL" fi ' --tag-name-filter cat -- --branches --tags |
Após digitar ou copiar o comando, os commits serão reescritos, esta operação pode levar bastante tempo, dependendo do tamanho do repositório.
Ao conferir o log, veremos que os commits foram corrigidos.
Será preciso forçar forçar um push:
1 |
git push --force |
Algumas recomendações
- Precisa ser em uma branch desprotegida,
- Faça esta alterações depois que todos tenha enviado suas alterações, e em um horário onde ninguém esteja usando o repositório.
- Se possível, faça um backup dos repositórios.