Antes de publicar um projeto, eu gostaria de limpar o repositório, o que significa:
A árvore é bastante simples, há apenas um ramo (exceto por outro ramo que eu não me importo). Mas existem as seguintes complicações:
Encontrei esta resposta para recortar o histórico:
$ git checkout --orphan temp <newroot-sha1>
$ git commit -C <newroot-sha1>
$ git commit --ammend
$ git rebase --onto temp <newroot-sha1> master
$ git checkout master
$ git branch -d temp
Enquanto isso corta o início como desejado, ele cria um novo histórico sem tags e notas e as referências não são atualizadas. Eu tentei git rebasetags mas ele não mantém as descrições das tags e atribui as tags a um commit errado se dois commits tiverem a mesma mensagem de commit. Não aborda a questão das notas e referências.
Encontrei esta resposta para alterar o nome e a senha mail de commits. Ele altera o nome e o e-mail dos commits conforme desejado e, embora reescreva o histórico, ele mantém as tags com suas mensagens, mas não altera o nome do tagger e o endereço de e-mail das tags. Não guarda as notas e não atualiza as referências.
$ git filter-branch --env-filter '
WRONG_EMAIL="old-email"
NEW_NAME="new-name"
NEW_EMAIL="new-email"
if [ "$GIT_COMMITTER_EMAIL" = "$WRONG_EMAIL" ]
then
export GIT_COMMITTER_NAME="$NEW_NAME"
export GIT_COMMITTER_EMAIL="$NEW_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$WRONG_EMAIL" ]
then
export GIT_AUTHOR_NAME="$NEW_NAME"
export GIT_AUTHOR_EMAIL="$NEW_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
Como posso recortar o histórico e alterar o nome e o endereço de e-mail de todos os commits e tags enquanto mantenho tags e notes (e seus timestamps) e atualizo os sha1 ids dos commits mencionados em commit messages e notes? (Não consigo ver uma opção para mostrar o autor de uma nota. As notas têm um autor? Se sim, gostaria de alterá-lo também.)
Tags git