Puis-je ajouter des métadonnées à git commits? Ou je peux cacher des étiquettes en gitk

je veux associer des métadonnées personnalisées avec un git commit. Spécifiquement pour enregistrer un ID de revue à partir d'un examen de code, mais il pourrait être n'importe quoi. Les Tags semblent une façon naturelle de le faire, mais je m'attends à avoir un avis pour chaque commit et je ne veux pas encombrer gitk avec des tonnes de balises. Est-il un autre mécanisme pour ajouter des métadonnées personnalisées? Puis-je rendre certaines étiquettes invisibles? Si je pouvais dire gitk ne pas afficher les étiquettes correspondant à un motif ou RE, qui fonctionnerait probablement, mais je ne vois pas de façon de le faire.

34
demandé sur chicks 2010-04-21 17:24:13

2 réponses

c'est exactement ce Que git notes sont en pour les.

33
répondu Jörg W Mittag 2010-04-21 13:52:02

Git-notes

git notes vous pouvez ajouter une "note" pour une livraison. Vous pouvez aussi les ajouter à d'autres objets Git, mais concentrons-nous sur les commits puisque c'est ce que la question est à propos.

une note est un objet Git, et peut en principe être" n'importe quoi " (arbitraire) données.) Mais nous nous concentrerons sur quelque chose de simple et textuel pour nos buts.

Exemple: id de commentaire

la question mentionne des identificateurs de revue, alors inventons un moyen de représenter une telle chose. Je ne sais pas à quoi ressemble vraiment une revue, mais j'espère que les points suivants seront pertinents:

Review-id: 42

il s'agit donc d'une paire de valeurs clés. Ajoutons la chaîne ci-dessus à le commit courant:

git notes add -m "Review-id: 42"

si vous courez git log la note sera montré inline†:

Author: Victor Version Control <vvc@vcs.org>
Date:   Tue Nov 8 21:10:25 2016 +0100

    Implement feature x

Notes:
    Review-id: 42

un autre exemple

bien sûr vous pouvez ajouter plus de "sous-notes" à cette note (nous nous en tiendrons à le simple key: value syntaxe, une valeur par ligne.) Par exemple, si vous trouvé trois mois plus tard que le message de commit quelque chose de mal, il suffit d'ajouter la correction de la note de:

git notes append -m "Errata: It was actually feature y."

git log:

Author: Victor Version Control <vvc@vcs.org>
Date:   Tue Nov 8 21:10:25 2016 +0100

    Implement feature x

Notes:
    Review-id: 42

    Errata: It was actually feature y.

Nous utilisons git notes append afin d'ajouter facilement ces données supplémentaires Note. Vous pouvez également utiliser git notes edit pour modifier le fichier directement.

bien sûr, puisqu'une note Git n'est qu'un simple fichier mutable, vous pouvez lancer dans les conflits de fusion. Pour rendre cela moins probable, vous pouvez:

  1. S'en tenir à des données simples comme celles ci-dessus (une valeur clé par ligne).
  2. utilisez des stratégies spéciales de fusion; voir man git-notes, dans la section "Notes fusion des stratégies".

Visibilité

L'OP a demandé:

> puis-je rendre certaines étiquettes invisibles?

Par défaut, git log montre seulement une note, à savoir .git/refs/notes/commits. commits n'est qu'une seule note dans l'espace de noms. Peut-être que vous voulez pour être dans leur espace de noms:

git notes --ref=issues add -m "Fixes: #32"

Puisqu'il est stocké dans .git/refs/notes/issues et non en .git/refs/notes/commits, "Résout: #32" de ne pas s'afficher lorsque vous exécutez git log. Vous avez donc rendu ces notes invisibles par défaut.

Si vous voulez qu'il soit démontré, pass --notes=issuesgit log:

$ git log --notes=issues
Author: Victor Version Control <vvc@vcs.org>
Date:   Tue Nov 8 21:10:25 2016 +0100

    Implement feature x

Notes (issues):
    Fixes: #32

Mais maintenant .git/refs/notes/commits sont cachés. Que l'on peut facilement être inclus:

$ git log --notes=issues --notes=commits
Author: Victor Version Control <vvc@vcs.org>
Date:   Tue Nov 8 21:10:25 2016 +0100

    Implement feature x

Notes (issues):
    Fixes: #32

Notes:
    Review-id: 42

    Errata: It was actually feature y.

il y a des variables pour configurer quelles notes sont affichées par défaut; voir man git-config.

avantages par rapport à la propagation des messages

les métadonnées peuvent évidemment être enregistrées directement dans le message de propagation. Mais les messages de propagation sont immuables, donc les changer signifie vraiment faire un tout nouveau commit, avec toutes les vagues les conséquences que cela implique. Git-notes d'autre part sont mutables, de sorte que vous êtes toujours en mesure de la révision. Et chaque modification d'une note est bien sûr la version géré. Dans notre cas, pour .git/refs/notes/commits:

$ git log refs/notes/commits
Author: Victor Version Control <vvc@vcs.org>
commit 9f0697c6bbbc6a97ecce9834d4c9afa0d668bcad
Date:   Tue Nov 8 21:13:52 2016 +0100

    Notes added by 'git notes append'

commit b60997e49444732ed2defc8a6ca88e9e21001a1d
Author: Victor Version Control <vvc@vcs.org>
Date:   Tue Nov 8 21:10:38 2016 +0100

    Notes added by 'git notes add'

Partage de notes

Vos notes ne sont pas partagés par défaut; vous devez le faire explicitement. Et par rapport à d'autres refs, partager des notes n'est pas très convivial. Nous avons pour utiliser le refspec syntaxe:

git push refs/notes/*

ce qui précède poussera toutes vos notes vers votre télécommande.

il semble que les notes alléchantes sont un peu plus impliquées; vous pouvez le faire si vous spécifiez les deux côtés de la refspec:

git fetch origin refs/notes/*:refs/notes/*

Donc ce n'est certainement pas pratique. Si vous avez l'intention d'utiliser Git-notes régulièrement, vous voudrez probablement mettre en place votre gitconfig pour toujours aller chercher notes:

[remote "origin"]
    …
    fetch = +refs/notes/*:refs/notes/*

(Source: https://git-scm.com/blog/2010/08/25/notes.html)

report des notes sur réécrit

Git a l'inconvénient par défaut que les notes ne sont pas reportées quand un commit est réécrit. Donc, si vous par exemple rebasez une série de s'engage, les notes s' ne pas reporter sur les nouveaux commits.

la variable notes.rewrite.<command> est par défaut défini à true, donc on pourrait supposons que les notes reporté. Mais le problème est que la variable notes.rewriteRef, qui détermine les notes seront reportés, n'a pas de défaut vaule. Pour mettre cette valeur en correspondance avec toutes les notes, exécutez ce qui suit:

git config --global notes.rewriteRef "refs/notes/*"

maintenant toutes les notes seront reportées lors des opérations de réécriture comme git rebase.

report des notes par e-mail patchs

Si vous utilisez git format-patch pour formater vos modifications à envoyer sous forme de courriels, et vous avez quelques métadonnées stockées sous git notes, vous pouvez passer le --notes l'option git format-patch afin d'annexer les notes au brouillon d'email.


† "C'est la valeur par défaut de git log [...] quand il n'y a pas de --pretty, --format, ou --oneline option sur la ligne de commande.― - man git-log, git version 2.10.2

18
répondu Guildenstern 2017-02-25 11:54:37