El comando filter-branch de Git es poderoso, pero es terriblemente difícil de usar para cualquier cosa que no sea trivial, como por ejemplo, si tiene que corregir más de un autor.
Aquí hay una alternativa que encontré útil, que utiliza la función .mailmap descrita en la página de manual de git-shortlog. Esto proporciona un mecanismo de mapeo de autores que podemos usar con la función de formateo de git log. Podemos usarlo para generar los comandos para elegir y enmendar, enmendar una secuencia de confirmaciones con nombre.
Por ejemplo, suponga que desea corregir la autoría en una rama $ BRANCH, comenzando en commit $ START.
Debe crear un archivo .mailmap en el directorio superior de su repositorio que asigna los nombres de autor existentes a los correctos. Puede obtener una lista de los nombres de autor existentes con:
git shortlog -se
Debe terminar con un archivo .mailmap como este (por ejemplo):
You <you@somewhere.org> cowens@localmachine
You <you@somewhere.org> root@localmachine
Ahora puede usar la función de formateo de git log para generar los comandos para reescribir $ 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 -
El primer comando crea una nueva rama vacía que brota del commit $ START. Para cada confirmación entre $ START y luego el final de $ BRANCH, el segundo comando cherry selecciona la confirmación original al final de la rama actual $ BRANCH2, y la modifica para establecer el autor correctamente.
Esto también es generalmente aplicable: ponga esto en su ~ / .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" '
Entonces, cuando necesita corregir autores, ahora solo necesita generar un archivo .map y hacer:
git checkout -b $BRANCH2 $START
git reauthor $START..$BRANCH
La referencia de sucursal original se puede reasignar a la nueva, y se puede eliminar la nueva:
git checkout $BRANCH
git reset --hard $BRANCH2 # be careful with this command
git branch -d $BRANCH2
git
para fines similares a este se hacen mejor en Stack Overflow .