git: Cortando o histórico e alterando o nome do autor enquanto mantém tags, notas e referências

0

Antes de publicar um projeto, eu gostaria de limpar o repositório, o que significa:

  • removendo todos os commits anteriores a uma determinada tag (mas deixando o resto do histórico e a versão atual como estão)
  • alterando os nomes do autor e do responsável e os endereços de e-mail para algo significativo

A árvore é bastante simples, há apenas um ramo (exceto por outro ramo que eu não me importo). Mas existem as seguintes complicações:

  • Eu tenho tags (com descrições) que quero manter (mas aqui, também, o nome do marcador e o endereço de e-mail devem ser alterados, mantendo o carimbo de data / hora)
  • Eu tenho referências (cometer mensagens como "corrige um bug introduzido no commit X") que precisam ser adaptadas
  • Eu tenho notas (como "acabou por introduzir um bug que foi corrigido no commit Y") que eu quero manter

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.)

    
por jakun 08.09.2018 / 08:50

0 respostas

Tags