Je me demande s'il existe un moyen d'afficher une date Push associée à chaque commit dans le journal git. Si ce n'est pas possible, existe-t-il un moyen de voir tous les commits sous un certain Push.
J'écris un programme qui doit garder une trace des commits lorsqu'ils sont poussés. Étant donné que le journal git est ordonné par la date de validation, et non par la date de transmission, je ne peux pas voir les validations les plus récentes qui sont transmises. Par exemple, si un utilisateur valide son référentiel local 2 jours avant de transmettre au maître, cette validation sera placée derrière 2 jours d'autres validations dans le journal du référentiel principal.
Il m'a fallu un temps incroyablement long pour rassembler des informations éparses et enfin trouver la meilleure réponse à cette question, mais maintenant je sais que je l'ai. En seulement deux lignes, pas de code et pas de hooks:
# required for a bare repo
git config core.logAllRefUpdates true
git reflog --date=local master
Enfin simple.
Avertissement: vous souhaitez probablement remplacer les valeurs par défaut de gc.reflogExpire
et gc.reflogExpireUnreachable
. Vérifier git help reflog
pour plus de détails et pour comprendre comment et pourquoi cela fonctionne.
Les deux commandes ci-dessus doivent être exécutées à l'intérieur du clone vers lequel vous poussez. Si cela n'est pas possible, une approximation doit s'exécuter dans une autre, permanent clone:
git fetch Origin # often and *regularly*
git reflog --date=local Origin/master
Ne supprimez jamais ce clone permanent ou vous perdrez les dates.
Git est un système de contrôle de version distribué, vous devez donc définir soigneusement ce que vous entendez par "date push". Par exemple, supposons que l'utilisateur A envoie des validations au référentiel de l'utilisateur B. Quelque temps 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 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é.
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), provoquant toutes sortes de problèmes.
Heureusement, Git a une fonctionnalité (relativement nouvelle) appelée notes. Cette fonctionnalité vous permet de joindre du texte arbitraire aux validations, qui git log
peut 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.
Voici l'approche que je recommande:
post-receive
connectez 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 "[l'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 valeur par défaut refs/notes/commits
. Cela évitera les conflits avec les notes créées à d'autres fins.
receive
pour refuser les mises à jour de la référence de vos notes (pour empêcher les utilisateurs de jouer accidentellement ou délibérément avec les notes).Dites à tous les utilisateurs d'exécuter les commandes suivantes à partir de 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 avoir le post-receive
hook ajoute également des notes "supprimé le [date]" pour gérer ces cas.
Jeter un coup d'œil à git reflog show master
. Probablement pas le format exact que vous souhaitez, mais devrait vous orienter dans la bonne direction.
Une autre idée consiste à exécuter un script dans un crochet Push.
Cette réponse concernant l'inspection du reflog sur la télécommande pourrait aider ( https://stackoverflow.com/a/8791295/336905 ) en vous donnant des informations sur lesquelles une branche a été poussée même si elle ne s'affiche pas. quels commits ont été poussés, mais vous pouvez effectuer une corrélation croisée en trouvant le prochain push après la date de validation locale. Pas infaillible, mais pratique si vous n'avez pas déjà mis en œuvre l'excellente suggestion de notes de @RichardHansen publiée plus tôt
Vous pouvez également consulter l'heure de modification du fichier de l'objet de validation dans le répertoire "objets" du référentiel git sur le serveur lui-même.
git reflog show Origin/master --pretty='%h %Gd %gs %s' --date=iso
Cela semble assez bien fonctionner pour moi. La date de validation (% cd) est trompeuse car elle n'est pas nécessairement la même que la date Push. L'option --date = iso, cependant affichera la date Push/fetch.
Remarque, si vous avez récupéré depuis Origin/master, il affichera la date à laquelle vous l'avez récupéré; PAS la date à laquelle quelqu'un d'autre a poussé le commit.
- %h: abrev. hash
- %Gd: human readable reflog selector
- %gs: reflog subject
- %s: subject/commit message
Bonus: Vous pouvez bien sûr faire un formatage plus joli. Jusqu'à présent, j'aime ce codage couleur. C'est un peu trop à taper cependant. Cela produira le SHA en rouge, le sélecteur de reflog en cyan et le reflog en vert.
git reflog show Origin/master --pretty='format:%C(red)%h%Creset %C(cyan)%Gd%Creset %C(green)%gs%Creset: %s' --date=iso
Pourquoi git AuthorDate est différent de CommitDate?
AuthorDate
correspond à la première création du commit.CommitDate
correspond à la dernière modification du commit (par exemple, rebase).Vous pouvez les obtenir avec le --pretty
options de formatage:
o %cd: committer date
o %cD: committer date, RFC2822 style
o %cr: committer date, relative
o %ct: committer date, UNIX timestamp
o %ci: committer date, ISO 8601 format
Donc, si vous et d'autres développeurs faites git rebase
avant git Push
, vous vous retrouverez avec une date de validation postérieure à la date de l'auteur .
Cette commande affiche la date de validation: git log --pretty=fuller
Je suppose que vous pouvez utiliser la notation suivante pour obtenir la date Push: git log -g --date = local