Git est un système de contrôle de version distribué, vous devez donc définir soigneusement ce que vous entendez par "date de diffusion". Par exemple, supposons que l'utilisateur A envoie des validations dans le référentiel de l'utilisateur B. Un peu plus tard, l'utilisateur B pousse ces mêmes validations vers un troisième référentiel. Quelle date vous intéresse?
Je suppose que vous avez un référentiel partagé et que vous voulez que les utilisateurs de ce référentiel partagé puissent déterminer quand quelque chose a été publié dans le référentiel. Si c'est vrai, vous devrez collecter ces informations dans le référentiel partagé.
Les mauvaises nouvelles
Malheureusement, il n'y a aucun moyen d'ajouter la date aux messages de validation. Cela changerait l'ID de validation (qui est un hachage SHA1 du contenu), causant toutes sortes de problèmes.
La bonne nouvelle
Heureusement, Git a une fonctionnalité (relativement nouvelle) appelée notes . Cette fonctionnalité vous permet d'attacher du texte arbitraire aux commits, qui git log
peuvent s'afficher. Les notes peuvent être modifiées et partagées avec d'autres.
Vous pouvez utiliser la fonction de notes pour joindre un message «Cette validation a été reçue le [date]» à chaque validation telle qu'elle est reçue par le référentiel partagé.
Voir git help notes
pour plus de détails.
Comment enregistrer la date
Voici l'approche que je recommande:
- Modifiez le
post-receive
hook de votre référentiel partagé pour parcourir chaque commit nouvellement accessible pour chaque référence mise à jour.
Pour chaque commit, ajoutez quelque chose comme "[utilisateur] de [repository_url] a ajouté ce commit à [ref] le [date]" à la note du commit.
Vous pouvez utiliser une référence de notes dédiée à cet effet (comme refs/notes/received-on
) au lieu de la référence par défaut refs/notes/commits
. Cela évitera les conflits avec les notes créées à d'autres fins.
- Modifiez votre
receive
hook pour refuser les mises à jour de la référence de vos notes (pour empêcher les utilisateurs de jouer accidentellement ou intentionnellement avec les notes).
Dites à tous les utilisateurs d'exécuter les commandes suivantes depuis leur arbre de travail:
# Fetch all notes from the shared repository.
# Assumes the shared repository remote is named 'origin'.
git config --add remote.origin.fetch '+refs/notes/*:refs/remote-notes/origin/*'
# Show all notes from the shared repository when running 'git log'
git config --add notes.displayRef 'refs/remote-notes/origin/*'
Cette étape est nécessaire car Git ignore par défaut les références sans branche et sans balise dans les référentiels en amont.
Ce qui précède suppose que les références sont uniquement avancées, jamais supprimées ou mises à jour de force. Vous voudrez probablement que le post-receive
crochet ajoute également des notes «supprimé le [date]» pour gérer ces cas.
git reflog --date=local origin/master
(noteorigin/
) pour voir la liste des poussées. Sinon, seuls les validations, les extractions et les extractions étaient dans la liste (ce qui est également utile). En fait, j'ai été signalé par la réponse de @ JonathanDay .