Est-il possible de créer un hook git pré-réception côté serveur pour rejeter le push avec --force
mais ne pas rejeter la poussée avec --force-with-lease
?
Réponse
Trop de publicités?Il n'y a aucun moyen de le faire car ils sont identiques au serveur.
La mise à jour d'une référence Git fonctionne de la manière suivante : le client demande au serveur de mettre à jour une référence donnée d'une ancienne valeur à une nouvelle valeur. Du côté du serveur, Git peut dire si l'ancienne valeur est un ancêtre de la nouvelle valeur (un push normal) ou non (un push forcé), et agir en conséquence. Cependant, dans les deux cas, l'ancienne valeur doit correspondre à la valeur actuelle sur le serveur ; si ce n'est pas le cas, la mise à jour de la référence échouera, car cela signifie que vous avez fait la course avec quelqu'un d'autre qui est en train de pousser.
Dans la plupart des cas, lorsque vous faites une mise à jour de la référence avec --force
l'ancienne valeur est celle annoncée par le serveur dans son annonce de référence. Ce que --force-with-lease
fait est qu'il demande à Git de spécifier l'ancienne valeur non pas à partir de ce que le serveur a annoncé, mais à partir de la branche de suivi à distance ou de la valeur spécifiée par l'utilisateur. Cependant, le serveur ne sait pas que l'utilisateur a spécifié cette option. Tout ce qu'il sait, c'est si l'ancienne valeur correspond (ce qui est toujours nécessaire) et s'il s'agit d'un parent de la nouvelle valeur (dans ce cas, il s'agit d'un forçage).