102 votes

Existe-t-il un moyen dans git d'obtenir une date de poussée pour un commit donné ?

Je me demande s'il existe un moyen de visualiser une date de poussée associée à chaque livraison dans le journal git. Si ce n'est pas possible, y a-t-il un moyen de voir tous les commits sous un certain push.

J'écris un programme qui doit garder la trace des commits au fur et à mesure qu'ils sont poussés. Parce que le journal git est ordonné par la date du commit, et non par la date du push, je ne suis pas en mesure de voir les commits les plus récents qui sont poussés. Par exemple, si un utilisateur fait un commit dans son dépôt local 2 jours avant de le pousser vers le dépôt maître, ce commit sera placé derrière 2 jours d'autres commits dans le journal du dépôt maître.

82voto

MarcH Points 1868

Il m'a fallu un temps fou pour rassembler des informations éparses et trouver enfin la meilleure réponse à cette question, mais je sais maintenant que je l'ai. En seulement deux lignes, sans code et sans crochets :

# required for a bare repo
git config core.logAllRefUpdates true

git reflog --date=local master

Enfin simple.

Avertissement : vous voudrez probablement remplacer les valeurs par défaut de l'option gc.reflogExpire y 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 que vous poussez vers . Si cela n'est pas possible, une approximation est de courir dans un autre, permanent clone :

git fetch               origin        # often and *regularly*
git reflog --date=local origin/master

Ne supprimez jamais ce clone permanent, sinon vous perdrez les dates.

2 votes

Je voudrais ajouter que dans mon cas, j'ai dû faire git reflog --date=local origin/master (note origin/ ) pour voir la liste des poussées. Sinon, seuls les commits, checkouts et pulls étaient dans la liste (ce qui est utile aussi). En fait, j'ai été dirigé vers cette page par Réponse de @JonathanDay .

0 votes

@NIA : origin/master ne vous donnera qu'une approximation. J'ai mis à jour ma réponse suite à votre commentaire, est-ce que cela clarifie les choses ?

38voto

Richard Hansen Points 13044

Git est un système de contrôle de version distribué, vous devez donc définir avec soin ce que vous entendez par "date de poussée". Par exemple, supposons que l'utilisateur A pousse quelques commits vers le dépôt de l'utilisateur B. Un peu plus tard, l'utilisateur B pousse ces mêmes commits vers un troisième dépôt. Quelle est la date qui 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é soient en mesure de déterminer quand quelque chose a été publié dans le référentiel. Si c'est le cas, vous devrez collecter cette information dans le référentiel partagé.

La mauvaise nouvelle

Malheureusement, il n'y a aucun moyen d'ajouter la date aux messages de livraison. Cela changerait l'identifiant du commit (qui est un hash SHA1 du contenu), causant toutes sortes de problèmes.

La bonne nouvelle

Heureusement, Git dispose d'une fonctionnalité (relativement nouvelle) appelée notes . Cette fonctionnalité vous permet d'attacher un texte arbitraire aux commits, ce qui permet d'éviter les erreurs. git log peut afficher. Les notes peuvent être modifiées et partagées avec d'autres personnes.

Vous pouvez utiliser la fonctionnalité de notes pour attacher un message "cette livraison a été reçue le [date]" à chaque livraison lorsqu'elle est reçue par le référentiel partagé.

Voir git help notes pour les détails.

Comment enregistrer la date

Voici l'approche que je recommande :

  1. Modifiez le post-receive sur votre référentiel partagé pour parcourir chaque nouveau commit accessible pour chaque référence mise à jour.

  2. Pour chaque livraison, ajoutez quelque chose comme "[utilisateur] de [repository_url] a ajouté cette livraison à [ref] le [date]" à la note de la livraison.

    Vous pouvez utiliser un ref de notes dédié à cet effet (comme refs/notes/received-on ) au lieu de l'option par défaut refs/notes/commits . Cela permet d'éviter les conflits avec des notes créées à d'autres fins.

  3. Modifiez votre receive crochet pour refuser les mises à jour de vos références de notes (pour empêcher les utilisateurs de modifier accidentellement ou volontairement les notes).

  4. 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 non-branches et non-balises dans les dépôts amont.

Ce qui précède suppose que les références sont seulement avancées, jamais supprimées ou mises à jour de force. Vous voudrez probablement avoir le post-receive Le crochet ajoute également des notes "supprimé le [date]" pour gérer ces cas.

0 votes

J'ai utilisé votre idée sur mon blog mnaoumov.wordpress.com/2013/01/31/git-get-push-date

5voto

Karl Bielefeldt Points 15469

Jetez un coup d'œil à git reflog show master . Ce n'est probablement pas le format exact que vous recherchez, mais cela devrait vous mettre sur la bonne voie.

Une autre idée consiste à exécuter un script à l'intérieur d'un crochet de poussée.

0 votes

J'ai pensé à faire du push hook, mais il me semble que ça devrait être un dernier effort. Avec un hook, il semble que chaque utilisateur devrait avoir ce hook dans chacun de ses dépôts. Pouvez-vous être plus précis sur le git reflog show master ? Je veux être en mesure de voir la date de poussée des commits individuels de chaque utilisateur.

1 votes

Git reflog montre le commander des changements dans n'importe quel repo dans lequel vous l'exécutez. Je ne suis pas sûr qu'il y ait un moyen direct d'obtenir la date, mais dans le fichier .git/logs/refs/heads/master il affiche un horodatage.

3 votes

En ce qui concerne les hooks, il y a des hooks de réception qui fonctionnent sur la machine que vous poussez. à . Puisque pushing n'est pertinent que par rapport à un repo spécifique, je suppose que vous avez un certain repo "béni" sur lequel vous voulez l'exécuter. Il en va de même pour git reflog d'ailleurs.

5voto

Jonathan Day Points 12496

Cette réponse concernant l'inspection du reflog sur la télécommande pourrait vous aider ( https://stackoverflow.com/a/8791295/336905 ) en vous donnant des informations sur la branche qui a été poussée, même si elle ne montre pas quels commits ont été poussés, mais vous pouvez faire une corrélation croisée en trouvant le prochain push après la date du commit local. Ce n'est pas infaillible, mais c'est pratique si vous n'avez pas déjà mis en œuvre l'excellente suggestion de notes de @RichardHansen postée précédemment.

1 votes

Avec une note que le reflog de origin/branch ne montrera que les changements effectués sur actuel machine, c'est extrêmement utile ! Pour une utilisation quotidienne, je ne veux pas implémenter de hooks, donc pour une simple question "Hmmm, quand j'ai poussé cet engagement la semaine dernière ?" - il fonctionne très bien.

1voto

Pashh PGH Points 1

Je suppose que vous pouvez utiliser la notation suivante pour obtenir la date de poussée : git log -g --date=local

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X