O comando filter-branch do Git é poderoso, mas é terrivelmente difícil de usar para algo 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 de manual 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 alterar, alterar uma sequência nomeada de confirmações.
Por exemplo, suponha que você queira corrigir a autoria em uma filial $ BRANCH, iniciando em uma confirmação $ START.
Você precisa criar um arquivo .mailmap no diretório superior do seu repositório, que mapeia os nomes de autores existentes para os nomes corretos. Você pode obter uma lista dos nomes de autores existentes com:
git shortlog -se
Você precisa terminar com um arquivo .mailmap como este (digamos):
You <you@somewhere.org> cowens@localmachine
You <you@somewhere.org> 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 surgindo do commit $ START. Para cada confirmação entre $ START e o final de $ BRANCH, o segundo comando seleciona o commit original no final do ramo atual $ BRANCH2 e o altera para definir o autor corretamente.
Isso 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" '
Portanto, quando você precisar corrigir os autores, agora precisará gerar um arquivo .map e fazer:
git checkout -b $BRANCH2 $START
git reauthor $START..$BRANCH
A ref original da ramificação pode ser reatribuída para a nova e a nova excluída:
git checkout $BRANCH
git reset --hard $BRANCH2 # be careful with this command
git branch -d $BRANCH2
git
para finalidades semelhantes a essa são mais solicitadas no Stack Overflow .