Les outils de gestion de versions permettent de marquer certains états afin de retrouver un état donné d’un code source ou une version d’un programme. Pour cela on place une étiquette sur l’objet à retrouver.
Suivant l’outil ou la traduction vous trouverez les mots balise, étiquette ou tag (version anglaise). Ici nous utiliserons le terme anglais tag puisque c'est le mot clé qu’il faut utiliser avec la commande git
.
Voici comment renommer un tag nommé old en tag nommé new, le principe de base est le suivant :
git tag new old
git tag -d old
git push origin :refs/tags/old
git push --tags
Les deux points de la commande push suppriment le tag du référentiel distant. Si vous ne le faites pas, git
recréera le tag sur votre machine lorsque vous utiliserez la commande git pull
, puisqu’il sera toujours présent sur le serveur.
Enfin, assurez-vous que les autres utilisateurs suppriment les tags n’existant plus sur le référentiel commun (le serveur git
). Dites à vos collègues d’exécuter la commande suivante :
git pull --prune --tags
Renommer des tags en masse
Imaginons que vous avez des tags ayant la forme :
rc2.1
rc2.2
…
rc2.10
rc3.0
rc3.0.1
rc3.3.0
rc3.4.0
et que vous souhaitez avoir un truc du genre project-name-X.Y.Z-rc
.
project-name-2.1.0
project-name-2.2.0
…
project-name-2.10.0
project-name-3.0.0
project-name-3.0.1
project-name-3.3.0
project-name-3.4.0
On va d’abord prendre que les tags qui nous intéressent, ici on a une fonction qui récupère la liste des tags et qui ne garde que ceux qui commencent par « rc » :
function get_tags_to_renames {
git tag | grep '^rc' | sort
}
Ensuite on écrit une fonction qui réécrit l’ancien nom dans le nouveau nom. Ici par exemple, on vire le « rc » du début, ensuite on compte le nombre de « . » et s’arrange pour qu’il y en ait toujours deux (s’il en manque un on ajoute « .0 »), puis on écrit le nom complet.
function get_new_name {
local old="$1"
local version=
version="$( sort <<<"${old}" | cut -d 'c' -f2- )"
local norm_version=
case "$( awk -F'.' '{print NF-1}' <<<"${version}" )" in
1)
norm_version="${version}.0"
;;
2)
norm_version="${version}"
;;
*)
echo "Error: ${version}" >&2
return 1
;;
esac
echo "project-name-${norm_version}-rc"
}
while read -r old ; do
if [ -n "${old}" ] ; then
new="$( get_new_name "${old}" )"
if [ -n "${new}" ] ; then
echo "$old -> $new"
git tag "${new}" "${old}"
git tag -d "${old}"
git push origin ":refs/tags/${old}"
fi
fi
done < <( get_tags_to_renames )
git push --tags
Notez que si vous modifiez un tag annotée, vous devez vous assurer que le nouveau nom du tag fait référence à la validation sous-jacente et non le vieil objet de balise annoté que vous êtes sur le point de supprimer. Par conséquent, utilisez git tag -a new old^{}
à la place de git tag new old
(car les tags annotées sont des objets alors que les tags léger ne le sont pas).
Références
- https://stackoverflow.com/questions/1028649/how-do-you-rename-a-git-tag
- https://stackoverflow.com/questions/49283734/why-isnt-my-tag-listed-when-i-checkout-with-git-gui/49286861#49286861
ᦿ