O comando branch-filter do Git é poderoso, mas é terrivelmente difícil de usar para qualquer coisa não-trivial, como por exemplo, se você tiver mais de um autor para corrigir.
Aqui está uma alternativa que eu achei útil, que usa o recurso .mailmap descrito na página man do git-shortlog. Isso fornece um mecanismo de mapeamento de autor que podemos usar com o recurso de formatação do git log. Podemos usá-lo para gerar os comandos para escolher e emendar uma sequência nomeada de commits.
Por exemplo, suponha que você queira corrigir a autoria em uma filial $ BRANCH, iniciando em um commit $ START.
Você precisa criar um arquivo .mailmap no diretório superior do seu repositório, que mapeia os nomes dos autores existentes para os corretos. Você pode obter uma lista dos nomes de autores existentes com:
git shortlog -se
Você precisa acabar com um arquivo .mailmap como este (digamos):
You <[email protected]> cowens@localmachine
You <[email protected]> root@localmachine
Agora você pode usar o recurso de formatação do git log para gerar os comandos para reescrever $ BRANCH como $ BRANCH2.
git checkout -b $BRANCH2 $START
git log --reverse --pretty=format:"cherry-pick %H; commit --amend --author='%aN <%aE>' -C %H" $START..$BRANCH | sh -
O primeiro comando cria uma nova ramificação vazia a partir do commit $ START. Para cada confirmação entre $ START e, em seguida, fim de $ BRANCH, o segundo comando cherry seleciona o commit original para o final da ramificação atual $ BRANCH2 e o altera para definir o autor corretamente.
Isto também é geralmente aplicável - coloque isso no seu ~ / .gitconfig:
[alias]
# git reauthor $START..$END
reauthor = !sh -c 'eval 'git log --reverse --topo-order --pretty=format:\"git cherry-pick %H && git commit --amend -C %H --author=\\"%aN <%aE>\\" && \" $0 ' "echo success" '
Então quando você precisa corrigir os autores, agora você precisa gerar um arquivo .map e fazer:
git checkout -b $BRANCH2 $START
git reauthor $START..$BRANCH
A ref. da ramificação original pode ser reatribuída à nova e a nova excluída:
git checkout $BRANCH
git reset --hard $BRANCH2 # be careful with this command
git branch -d $BRANCH2