Avant de publier un projet, j'aimerais nettoyer le référentiel, ce qui signifie:

  • supprimer tous les commits antérieurs à une balise donnée (en laissant le reste de l'historique et la version actuelle tels quels)
  • changer les noms des auteurs et des auteurs ainsi que leurs adresses électroniques en quelque chose de significatif

L'arbre est assez simple, il y a juste une branche (à l'exception d'une autre branche qui ne me dérange pas). Mais il y a les complications suivantes:

  • J'ai des tags (avec des descriptions) que je veux conserver (mais ici aussi, le nom et l'adresse e-mail du tagueur doivent être modifiés tout en conservant l'horodatage)
  • J'ai des références (messages de validation tels que "corrige un bogue introduit dans commit X") qui doivent être adaptées
  • J'ai des notes (comme "s'est avéré que ceci a introduit un bogue qui a été corrigé dans le commit Y") que je veux garder

J'ai trouvé cette réponse pour recadrer l'historique:

$ git checkout --orphan temp <newroot-sha1>
$ git commit -C <newroot-sha1>
$ git commit --ammend
$ git rebase --onto temp <newroot-sha1> master
$ git checkout master
$ git branch -d temp

Bien que cela supprime le début comme vous le souhaitez, il crée un nouvel historique sans balises ni notes et les références ne sont pas mises à jour. J'ai essayé git rebasetags mais il ne conserve pas les descriptions des balises et assigne les balises à un commit incorrect si deux commits ont le même message de commit. Il ne traite pas de la question des notes et des références.

J'ai trouvé cette réponse pour changer le nom et l'adresse e-mail des commits. Il modifie le nom et l’adresse électronique des commits selon les besoins et, bien qu’il renoue l’historique, il conserve même les balises avec leurs messages, mais il ne modifie pas le nom de l’étiqueteur ni l’adresse électronique des balises. Il ne conserve pas les notes et ne met pas à jour les références.

$ git filter-branch --env-filter '
WRONG_EMAIL="old-email"
NEW_NAME="new-name"
NEW_EMAIL="new-email"

if [ "$GIT_COMMITTER_EMAIL" = "$WRONG_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$NEW_NAME"
    export GIT_COMMITTER_EMAIL="$NEW_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$WRONG_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$NEW_NAME"
    export GIT_AUTHOR_EMAIL="$NEW_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

Comment puis-je recadrer l'historique et modifier le nom et l'adresse électronique de tous les commits et balises tout en conservant les balises et les notes (et leurs horodatages) et mettre à jour les identifiants sha1 des commits mentionnés dans les messages de validation et les notes? (Je ne vois pas d’option permettant d’afficher l’auteur d’une note. Les notes ont-elles un auteur? Dans l’affirmative, je voudrais aussi la modifier.)

jakun
la source