J'utilise Git depuis un moment maintenant, et j'ai récemment commencé à l'utiliser pour baliser mes versions afin de pouvoir plus facilement suivre les modifications et pouvoir voir quelle version est utilisée par chacun de nos clients (malheureusement, le code en vigueur actuellement). que chaque client ait sa propre copie du site PHP; je change cela, mais c'est lent).
Dans tous les cas, nous commençons à créer une dynamique, je pensais que ce serait vraiment bien de pouvoir montrer aux gens ce qui a changé depuis la dernière version. Le problème, c'est que je n'ai pas mis à jour de journal des modifications, car je ne sais pas trop comment procéder. Pour ce moment particulier, je peux parcourir le journal et en créer un manuellement, mais cela me fatiguera très vite.
J'ai essayé de googler "git changelog" et "git manage Changelog" mais je n'ai rien trouvé qui parle vraiment du flux de travail des modifications de code et de la manière dont cela coïncide avec le changelog. Nous suivons actuellement flux de travail de développement de Rein Henrichs et j'aimerais quelque chose qui va avec.
Y at-il une approche standard qui me manque, ou est-ce un domaine dans lequel chacun fait sa propre chose?
Merci beaucoup pour vos commentaires/réponses!
C'était il y a environ 3-4 ans, mais pour les futurs chercheurs, il est maintenant possible de générer de superbes journaux avec:
git log --oneline --decorate
Ou, si vous le voulez encore plus joli (avec couleur pour terminal):
git log --oneline --decorate --color
Pipeter cette sortie vers ChangeLog est ce que j'utilise actuellement dans tous mes projets, c'est tout simplement incroyable.
Vous pouvez utiliser une sorte de journal git pour vous aider:
git log --pretty=%s # only print the subject
Si vous nommez joliment vos branches, de sorte qu'une fusion à maîtriser apparaisse comme quelque chose du genre "Merged branch feature-foobar", vous pouvez abréger les choses en affichant ce message uniquement. fonctionnalité:
git log --pretty=%s --first-parent # only follow first parent of merges
Vous pourrez peut-être ajouter à cela un script de votre choix, qui pourrait supprimer des bits "branche fusionnée", normaliser le formatage, etc. À un moment donné, vous devez l'écrire vous-même, bien sûr.
Ensuite, vous pouvez créer une nouvelle section pour le journal des modifications une fois par version:
git log [opts] vX.X.X..vX.X.Y | helper-script > changelogs/X.X.Y
et engagez-le dans votre version.
Si votre problème est que ces sujets de validation ne ressemblent en rien à ce que vous voudriez mettre dans un journal des modifications, vous avez à peu près deux options: continuer à tout faire manuellement (et essayer de le suivre plus régulièrement au lieu de jouer à la trappe) au moment de la publication), ou corrigez votre style de message de validation. Une option, si les sujets ne le feront pas pour vous, serait de placer des lignes telles que "change: added feature foobar" dans le corps de vos messages de validation, de sorte que vous puissiez ultérieurement faire quelque chose comme git log --pretty=%B | grep ^change:
pour ne saisir que les bits super importants des messages.
Je ne suis pas tout à fait sûr que beaucoup plus que ce git pourrait vraiment vous aider à créer vos changelogs. Peut-être que j'ai mal interprété ce que vous entendez par "gérer"?
AVERTISSEMENT: Je suis l'auteur de gitchangelog dont je parlerai dans ce qui suit.
TL; DR: Vous voudrez peut-être vérifier le journal des modifications de gitchangelog ou la sortie ascii qui a généré la précédente.
Si vous voulez générer un journal des modifications à partir de votre historique git, vous devrez probablement prendre en compte:
Facultativement, vous voudrez peut-être une catégorisation (nouveautés, modifications, corrections de bugs) ...
Avec tout cela à l'esprit, j'ai créé et utilisé gitchangelog . Il est censé tirer parti d'une convention de message git commit pour atteindre tous les objectifs précédents.
Avoir une convention de message de validation est obligatoire pour créer un journal des modifications de Nice (avec ou sans l'aide de gitchangelog
).
convention de message de validation
Vous trouverez ci-dessous des suggestions sur ce qu'il pourrait être utile de penser à ajouter à vos messages de validation.
Vous voudrez peut-être séparer vos commits en grosses sections:
De plus, vous pourriez vouloir baliser certains commits:
Essayez d'écrire votre message de validation en ciblant les utilisateurs (fonctionnalités) aussi souvent que vous le pouvez.
exemple
Ceci est la norme git log --oneline
pour montrer comment ces informations pourraient être stockées ::
* 5a39f73 fix: encoding issues with non-ascii chars.
* a60d77a new: pkg: added ``.travis.yml`` for automated tests.
* 57129ba new: much greater performance on big repository by issuing only one Shell command for all the commits. (fixes #7)
* 6b4b267 chg: dev: refactored out the formatting characters from GIT.
* 197b069 new: dev: reverse ``natural`` order to get reverse chronological order by default. !refactor
* 6b891bc new: add utf-8 encoding declaration !minor
Donc, si vous avez remarqué, le format que j'ai choisi est:
{new|chg|fix}: [{dev|pkg}:] COMMIT_MESSAGE [!{minor|refactor} ... ]
Pour voir un résultat de sortie réel, vous pouvez regarder à la fin de la page PyPI de gitchangelog
Pour voir une documentation complète de ma convention de message de commit, vous pouvez voir le fichier de référence gitchangelog.rc.reference
Comment générer un changelog exquis à partir de ceci
Ensuite, il est assez facile de créer un changelog complet. Vous pouvez créer votre propre script assez rapidement ou utiliser gitchangelog
.
gitchangelog
générera un journal des modifications complet (avec le support de la section comme New
, Fix
...), et est raisonnablement configurable selon vos propres conventions de validation. Il supporte tout type de sortie grâce à la modélisation via Mustache
, Mako templating
, et a un moteur hérité par défaut écrit en raw python; tous les 3 moteurs actuels ont des exemples d'utilisation et peuvent générer le journal des modifications sous la forme affichée sur la page PyPI de gitchangelog.
Je suis sûr que vous savez qu'il y a beaucoup d'autres git log
to changelog
outils également là-bas.
Un plus au point CHANGELOG. Dis-moi si les gens aiment ça.
git log --since=1/11/2011 --until=28/11/2011 --no-merges --format=%B
Le script gitlog-to-changelog
est très utile pour générer un ChangeLog
de style GNU.
Comme indiqué par gitlog-to-changelog --help
, Vous pouvez sélectionner les validations utilisées pour générer un fichier ChangeLog
à l'aide de l'option --since
:
gitlog-to-changelog --since=2008-01-01 > ChangeLog
ou en passant des arguments supplémentaires après --
, qui seront passés à git-log
(appelée en interne par gitlog-to-changelog
):
gitlog-to-changelog -- -n 5 foo > last-5-commits-to-branch-foo
Par exemple, j'utilise la règle suivante dans le niveau supérieur Makefile.am
De l'un de mes projets:
.PHONY: update-ChangeLog
update-ChangeLog:
if test -d $(srcdir)/.git; then \
$(srcdir)/build-aux/gitlog-to-changelog \
--format='%s%n%n%b%n' --no-cluster \
--strip-tab --strip-cherry-pick \
-- $$(cat $(srcdir)/.last-cl-gen).. \
>ChangeLog.tmp \
&& git rev-list -n 1 HEAD >.last-cl-gen.tmp \
&& (echo; cat $(srcdir)/ChangeLog) >>ChangeLog.tmp \
&& mv -f ChangeLog.tmp $(srcdir)/ChangeLog \
&& mv -f .last-cl-gen.tmp $(srcdir)/.last-cl-gen \
&& rm -f ChangeLog.tmp; \
fi
EXTRA_DIST += .last-cl-gen
Cette règle est utilisée au moment de la publication pour mettre à jour ChangeLog
avec les derniers messages de validation non encore enregistrés. Le fichier .last-cl-gen
Contient l'identifiant SHA1 de la dernière validation enregistrée dans ChangeLog
et est stocké dans le référentiel Git. ChangeLog
est également enregistré dans le référentiel, de sorte qu'il peut être modifié (par exemple, pour corriger des fautes de frappe) sans modifier les messages de validation.
La meilleure pratique étant de créer une balise par version, vous pouvez partitionner votre journal des modifications par version. Dans ce cas, cette commande pourrait vous aider:
git log YOUR_LAST_VERSION_TAG..HEAD --no-merges --format=%B
Pour GitHub projets cela pourrait être utile: github-changelog-generator
Il génère le journal des modifications à partir des balises des problèmes fermés et des demandes d'extraction fusionnées.
This CHANGELOG.md a été généré par ce script.
Exemple:
Changelog
1.2.5 (2015-01-15)
Améliorations apportées:
- Utilisez jalon pour spécifier dans quelle version le bogue a été corrigé # 22
Bugs corrigés:
- Erreur lors de la tentative de génération du journal pour le dépôt sans balises # 32
Demandes d'extraction fusionnées:
La classe PrettyPrint est incluse en minuscule 'pp' # 4 ( schwing )
soutenir l'entreprise avec les options de la ligne de commande # 42 ( glenlovett )
J'ai aussi fait une bibliothèque pour cela. Il est entièrement configurable avec un modèle Moustache. Qui peut:
J'ai aussi fait:
Plus de détails sur Github: https://github.com/tomasbjerre/git-changelog-lib
En ligne de commande:
npx git-changelog-command-line -std -tec "
# Changelog
Changelog for {{ownerName}} {{repoName}}.
{{#tags}}
## {{name}}
{{#issues}}
{{#hasIssue}}
{{#hasLink}}
### {{name}} [{{issue}}]({{link}}) {{title}} {{#hasIssueType}} *{{issueType}}* {{/hasIssueType}} {{#hasLabels}} {{#labels}} *{{.}}* {{/labels}} {{/hasLabels}}
{{/hasLink}}
{{^hasLink}}
### {{name}} {{issue}} {{title}} {{#hasIssueType}} *{{issueType}}* {{/hasIssueType}} {{#hasLabels}} {{#labels}} *{{.}}* {{/labels}} {{/hasLabels}}
{{/hasLink}}
{{/hasIssue}}
{{^hasIssue}}
### {{name}}
{{/hasIssue}}
{{#commits}}
**{{{messageTitle}}}**
{{#messageBodyItems}}
* {{.}}
{{/messageBodyItems}}
[{{hash}}](https://github.com/{{ownerName}}/{{repoName}}/commit/{{hash}}) {{authorName}} *{{commitTime}}*
{{/commits}}
{{/issues}}
{{/tags}}
"
Ou à Jenkins:
git log --oneline --no-merges `git describe --abbrev=0 --tags`..HEAD | cut -c 9- | sort
Est ce que j'aime utiliser. Il reçoit tous les commits depuis la dernière balise. cut
supprime le hash de commit. Si vous utilisez des numéros de ticket au début de vos messages de validation, ils sont regroupés avec sort
. Le tri est également utile si vous préfixez certaines commits avec fix
, typo
, etc.
Basé sur bithavoc , il répertorie les last tag
jusqu'à HEAD
. Mais j'espère lister les logs entre 2 tags.
// 2 or 3 dots between `YOUR_LAST_VERSION_TAG` and `HEAD`
git log YOUR_LAST_VERSION_TAG..HEAD --no-merges --format=%B
Liste des journaux entre 2 tags.
// 2 or 3 dots between 2 tags
git log FROM_TAG...TO_TAG
Par exemple, il listera les journaux de v1.0.0
à v1.0.1
.
git log v1.0.0...v1.0.1 --oneline --decorate
Pour un changelog de style GNU , j'ai cuit la fonction
gnuc() {
{
printf "$(date "+%Y-%m-%d") John Doe <[email protected]>\n\n"
git diff-tree --no-commit-id --name-only -r HEAD | sed 's/^/\t* /'
} | tee /dev/tty | xsel -b
}
Avec ça:
gnuc
et maintenant mon presse-papiers contient quelque chose comme:
2015-07-24 John Doe <[email protected]>
* gdb/python/py-linetable.c (): .
* gdb/python/py-symtab.c (): .
Ensuite, j'utilise le presse-papiers comme point de départ pour mettre à jour le journal des modifications.
Il n’est pas parfait (par exemple, les fichiers doivent être relatifs à leur chemin ChangeLog, donc python/py-symtab.c
sans pour autant gdb/
depuis que je vais éditer le gdb/ChangeLog
), mais est un bon point de départ.
Des scripts plus avancés:
Je suis cependant d’accord avec Tromey: dupliquer les données de commit git dans le ChangeLog est inutile.
Si vous voulez créer un journal des modifications, faites-en un bon résumé de ce qui se passe, éventuellement comme spécifié à l'adresse http://keepachangelog.com/
Je laisse le serveur CI transférer les informations suivantes dans un fichier nommé CHANGELOG
pour chaque nouvelle version avec la date définie dans le nom de fichier de la version:
>git log --graph --all --date=relative --pretty=format:"%x09 %ad %d %s (%aN)"