La commande filter-branch de Git est puissante, mais elle est terriblement difficile à utiliser pour tout ce qui n'est pas trivial, par exemple, si vous avez plus d'un auteur à corriger.
Voici une alternative que j'ai trouvée utile, qui utilise la fonction .mailmap décrite dans la page de manuel git-shortlog. Cela fournit un mécanisme de mappage d'auteurs que nous pouvons utiliser avec la fonction de formatage du journal de Git. Nous pouvons l'utiliser pour générer les commandes pour sélectionner et amender une séquence nommée de commits.
Par exemple, supposez que vous voulez corriger l'auteur sur une branche $BRANCH, à partir d'un commit $START.
Vous devez créer un fichier .mailmap dans le répertoire racine de votre dépôt qui mappe les noms d'auteurs existants aux bons. Vous pouvez obtenir une liste des noms d'auteurs existants avec :
git shortlog -se
Vous devez finir avec un fichier .mailmap comme ceci (disons) :
You cowens@localmachine
You root@localmachine
Maintenant vous pouvez utiliser la fonction de formatage de git log pour générer les commandes pour réécrire $BRANCH en $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 à partir du commit $START. Pour chaque commit entre $START et la fin de $BRANCH, la deuxième commande opère un cherry-pick du commit original à la fin de la branche actuelle $BRANCH2, et l'amende pour définir correctement l'auteur.
Cela est également généralement applicable - placez 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 devez corriger les auteurs, vous avez juste besoin de générer un .mapfile et de faire :
git checkout -b $BRANCH2 $START
git reauthor $START..$BRANCH
La référence de la branche originale peut être réaffectée à la nouvelle, et la nouvelle supprimée :
git checkout $BRANCH
git reset --hard $BRANCH2 # soyez prudent avec cette commande
git branch -d $BRANCH2
4 votes
Pour nos futurs lecteurs : Les questions sur l'utilisation de
git
à des fins similaires à celles-ci sont mieux posées sur Stack Overflow.0 votes
Voici la question la plus proche sur stackoverflow.com.