Quelle est la différence entre une étiquette annotée et une étiquette non annotée?
si je veux marquer la propagation actuelle. Je connais les deux lignes de commande suivantes:
git tag <tagname>
et
git tag -a <tagname> -m '<message>'
Quelle est la différence entre ces commandes?
3 réponses
TL; DR
la différence entre les commandes est que l'une vous fournit un message d'étiquette tandis que l'autre ne le fait pas. Une balise annotée a un message qui peut être affiché avec git-show(1), alors qu'une balise sans annotations n'est qu'un pointeur nommé vers une propagation.
En Savoir Plus Sur Les Étiquettes Légères
sauf si vous sélectionnez le drapeau-s pour une balise signée, la balise sera une balise légère, non signée par défaut. Il y a aussi quelques différences avec les étiquettes légères:
- lorsque vous utilisez
git tag <tagname>
, Git créera une balise lors de la révision en cours mais ne vous demandera pas d'annotation. Il sera étiqueté sans message. - lorsque vous utilisez
git tag -a <tagname>
, Git vous demandera une annotation à moins que vous n'ayez également utilisé le drapeau-m pour fournir un message. - lorsque vous utilisez
git tag -a -m <msg> <tagname>
, Git étiquettera le commit et l'annotera avec le message. - lorsque vous utilisez
git tag -m <msg> <tagname>
, Git se comportera comme si vous aviez passé le drapeau-a pour l'annotation et utiliser le message fourni.
fondamentalement, cela revient à savoir si vous voulez que l'étiquette légère ait une annotation associée ou non.
Push tags annotés, keep lightweight local
man git-tag
dit:
Les étiquettes annotéessont destinées à la publication tandis que les étiquettes légères sont destinées aux étiquettes d'objets privées ou temporaires.
et certains comportements les différencient de manière à ce que cette recommandation soit utile, par exemple:
-
les balises annotées peuvent contenir un message, un créateur, et une date différente de celle à laquelle elles pointent. Vous pouvez donc les utiliser pour décrire une version sans faire de propagation.
étiquettes légères n'ont pas cette information supplémentaire, et n'en ont pas besoin, puisque vous allez seulement l'utiliser vous-même pour développer.
- git push --suivez-tags ne feront que pousser annoté tags
-
git describe
sans options de ligne de commande voit seulement des étiquettes annotées
"différences internes
-
les étiquettes légères et annotées sont un fichier sous
.git/refs/tags
qui contient un SHA-1 -
pour les étiquettes légères, le SHA-1 pointe directement à un commit:
git tag light cat .git/refs/tags/light
imprime la même chose que le SHA-1 de la tête.
il n'est donc pas étonnant qu'elles ne contiennent pas d'autres métadonnées.
-
les balises annotées pointent vers un objet tag dans la base de données des objets.
git tag -as -m msg annot cat .git/refs/tags/annot
contient le SHA de l'objet de la balise annotée:
c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
et ensuite nous pouvons obtenir son contenu avec:
git cat-file -p c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
sortie d'échantillon:
object 4284c41353e51a07e4ed4192ad2e9eaada9c059f type commit tag annot tagger Ciro Santilli <your@mail.com> 1411478848 +0200 msg -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) <YOUR PGP SIGNATURE> -----END PGP SIGNAT
Et voici comment il contient des métadonnées supplémentaires. Comme nous pouvons le voir à partir de la sortie, les champs de métadonnées:
- l'objet qu'il pointe vers
- le type d'objet qu'il désigne. Oui, tag les objets peuvent pointer vers n'importe quel autre type d'objet comme les blobs, pas seulement commits .
- le nom de l'étiquette
- marqueur d'identité et d'horodatage
- message. Remarque comment la signature PGP est juste en annexe au message
une analyse plus détaillée du format est disponible à: Quel est le format d'un objet git tag et comment calculer son SHA?
Bonus
-
déterminez si une étiquette est annotée:
git cat-file -t tag
sorties
commit
pour poids léger,tag
pour annoté. -
N'énumérez que les étiquettes légères: Comment puis-je énumérer toutes les étiquettes légères?
la grande la différence est parfaitement expliquée ici .
fondamentalement, étiquettes légères sont juste des pointeurs à des commits spécifiques. Aucune autre information n'est enregistrée ; d'autre part, , annoté tags sont des objets , qui ont un auteur et une date et peuvent être mentionnés car ils ont leur propre clé SHA.
Si savoir qui étiqueté quoi et quand est pertinent pour vous, alors utilisez des étiquettes annotées. Si vous voulez simplement marquer un point spécifique dans votre développement , peu importe qui et quand a fait cela, alors étiquettes légères sont assez bons.
normalement, vous opteriez pour les étiquettes annotées, mais c'est au maître du projet de décider.