cClaude.rocks ☕ Le blog

[Nouvelles technologies du libre, sciences et coups de gueule…]

Menu

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

ᦿ


ℹ 2006 - 2024 | 🏠 Accueil du domaine | 🏡 Accueil du blog