Il comando filtro-ramo di Git è potente, ma è terribilmente ingombrante da usare per qualsiasi cosa non banale, come ad esempio se hai più di un autore da correggere.
Ecco un'alternativa che ho trovato utile, che utilizza la funzione .mailmap descritta nella manpage git-shortlog. Questo fornisce un meccanismo di mappatura dell'autore che possiamo usare con la funzione di formattazione di git log. Possiamo usarlo per generare i comandi per selezionare e modificare e modificare una sequenza denominata di commit.
Ad esempio, supponiamo di voler correggere la paternità su un ramo $ BRANCH, iniziando da un commit $ START.
È necessario creare un file .mailmap nella directory superiore del repository che associ i nomi degli autori esistenti a quelli corretti. Puoi ottenere un elenco dei nomi degli autori esistenti con:
git shortlog -se
Devi finire con un file .mailmap come questo (diciamo):
You <you@somewhere.org> cowens@localmachine
You <you@somewhere.org> root@localmachine
Ora puoi usare la funzione di formattazione di git log per generare i comandi per riscrivere $ BRANCH come $ BRANCH2.
git checkout -b $BRANCH2 $START
git log --reverse --pretty=format:"cherry-pick %H; commit --amend --author='%aN <%aE>' -C %H" $START..$BRANCH | sh -
Il primo comando crea un nuovo ramo vuoto che nasce dal commit $ START. Per ogni commit tra $ START e quindi la fine di $ BRANCH, il secondo comando cherry seleziona il commit originale alla fine del ramo $ $ BRANCH2 corrente e lo modifica per impostare correttamente l'autore.
Questo è anche generalmente applicabile - inseriscilo nel tuo ~ / .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" '
Quindi, quando è necessario correggere gli autori, ora è necessario generare un file .map ed eseguire:
git checkout -b $BRANCH2 $START
git reauthor $START..$BRANCH
Il ref di filiale originale può essere riassegnato a quello nuovo e quello nuovo cancellato:
git checkout $BRANCH
git reset --hard $BRANCH2 # be careful with this command
git branch -d $BRANCH2
git
per scopi simili a questo sono meglio poste su Stack Overflow .