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
኿