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.
2 réponses
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:
- S'en tenir à des données simples comme celles ci-dessus (une valeur clé par ligne).
- 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=issues
git 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