La commande filter-branch de Git est puissante, mais elle est terriblement difficile à utiliser pour tout ce qui n'est pas trivial, comme par exemple si vous avez plus d'un auteur à corriger.
Voici une alternative que j'ai trouvée utile, qui utilise la fonctionnalité .mailmap décrite dans la page de manuel git-shortlog. Cela fournit un mécanisme de correspondance des auteurs que nous pouvons utiliser avec la fonction de formatage de git log. Nous pouvons l'utiliser pour générer les commandes permettant de sélectionner et de modifier une séquence nommée de commits.
Par exemple, supposons que vous souhaitiez corriger la paternité d'une branche $ BRANCH, à partir du commit $ START.
Vous devez créer un fichier .mailmap dans le répertoire supérieur de votre référentiel, qui mappe les noms d’auteurs existants sur les noms corrects. Vous pouvez obtenir une liste des noms d’auteurs existants avec:
git shortlog -se
Vous devez vous retrouver avec un fichier .mailmap comme ceci (par exemple):
You <you@somewhere.org> cowens@localmachine
You <you@somewhere.org> root@localmachine
Vous pouvez maintenant utiliser la fonctionnalité de formatage de git log pour générer les commandes permettant de réécrire $ BRANCH en tant que $ BRANCH2.
git checkout -b $BRANCH2 $START
git log --reverse --pretty=format:"cherry-pick %H; commit --amend --author='%aN <%aE>' -C %H" $START..$BRANCH | sh -
La première commande crée une nouvelle branche vide issue du commit $ START. Pour chaque commit entre $ START et ensuite fin de $ BRANCH, la deuxième commande sélectionne le commit d'origine à la fin de la branche actuelle $ BRANCH2 et le modifie pour définir l'auteur correctement.
Ceci est aussi généralement applicable - mettez ceci dans votre ~ / .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" '
Donc, lorsque vous avez besoin de corriger les auteurs, vous devez maintenant générer un fichier .map et faire:
git checkout -b $BRANCH2 $START
git reauthor $START..$BRANCH
La référence de branche d'origine peut être réaffectée à la nouvelle, et la nouvelle supprimée:
git checkout $BRANCH
git reset --hard $BRANCH2 # be careful with this command
git branch -d $BRANCH2
git
Il est préférable de poser des questions sur l'utilisation à des fins similaires à Stack Overflow .