Comment vérifier la date et l'heure du dernier `git pull` qui a été exécuté?

91

Comment vérifier la date et l'heure de la dernière git pullexécution? J'ai souvent besoin de savoir quand le code a changé sur un serveur en cas de problème.

Chirag Patel
la source

Réponses:

27

La git showcommande affiche la date du dernier commit. Ce n'est pas la date à laquelle le commit a été tiré vers le référentiel local, mais Git ne conserve pas ces informations d'extraction.

Vous pourrez peut-être trouver l'heure de la dernière extraction en utilisant le ctime (heure de création) des fichiers sur le serveur. Par exemple:

ls -lct

affiche le ctime de chaque fichier, trié par le plus récent en premier.

Greg Hewgill
la source
18
Cela ne répond pas à la question - voir la réponse de smoove ci-dessous.
Wilfred Hughes
1
git showaffiche la date du commit tip de la branche actuelle, qui n'est pas nécessaire le commit le plus récent dans le repo, et encore moins la date de la dernière extraction / extraction. Je recommande également de vérifier la réponse de smoove.
Stefaan
3
Je ne suis pas d'accord. Cela répond à la question. Bien qu'il ne vous donne pas la date du dernier pull, il vous donne la date du commit qui était le plus récent lorsque vous avez tiré pour la dernière fois. Pour le cas d'utilisation de la question d'origine, cela convient parfaitement. Vous voulez savoir quand vous avez mis à jour le code pour la dernière fois sur un serveur via git pull, c'est-à-dire quelle version du code est actuellement sur le serveur. git showvous indique à quel commit se trouve votre clone local. (Je sais que c'est vieux, mais je me suis retrouvé ici via une recherche.)
Dietmar
149
stat -c %Y .git/FETCH_HEAD

Vous donnera un horodatage unix de la dernière modification de ce fichier. Git écrit le fichier FETCH_HEAD à chaque fois que vous tirez ou récupérez, même s'il n'y avait rien à extraire.

smoove
la source
17
Horodatage Unix de l'heure modifiée sur OSX:stat -f '%m' .git/FETCH_HEAD
jpillora
18
Git écrit FETCH_HEAD avant la récupération / extraction réelle ... Donc, si l'extraction a échoué ou a été annulée, FETCH_HEAD ne représenterait pas l'état réel du référentiel. Ceci est particulièrement problématique lorsque l'URL du dépôt d'origine ne fonctionne pas, car chaque extraction échouerait mais FETCH_HEAD sera mis à jour à chaque tentative.
rustyx
9
Date de l'heure de modification sous OS X:stat -f '%Sm' $(git rev-parse --show-toplevel)/.git/FETCH_HEAD
Colin vH
7
Vous pouvez également vérifier .git/refs/heads/masterquel horodatage changera lorsque des changements seront git pullapportés à partir de la masterbranche distante , mais l'horodatage ne changera pas si git pullaucun changement n'a été signalé.
Malvineous
6
Pour toute personne utilisant ceci dans un script: Si une extraction ou une extraction n'a pas encore été effectuée, FETCH_HEAD n'existera pas encore et stat retournera le code de sortie 1.
MajicBob
43

Sur une intuition, j'ai essayé "stat -c% y .git / FETCH_HEAD", et j'ai obtenu une impression lisible par l'homme de l'heure:

> stat -c %y .git/FETCH_HEAD
2015-02-24 17:42:08.072094410 -0500

De plus, vous pouvez ajouter when = !stat -c %y .git/FETCH_HEADà la [alias]section dans votre fichier ~ / .gitconfig (il est plus sûr de le faire automatiquement en exécutant la ligne de commande suivante dans n'importe quel dépôt git)

git config --global alias.when '!stat -c %y .git/FETCH_HEAD'

et ensuite vous pouvez trouver cette information avec votre nouvelle "commande", à tout moment:

> git when
2015-02-23 15:07:53.086254218 -0500

[Puis il m'est venu à l'esprit de faire "man stat", et j'ai trouvé qu'il y avait un tas d'autres paramètres% disponibles pour le programme "stat". YMMV.]

Paul McMullin
la source
3
C'est la réponse la plus utile!
Arun
Juste une note. -cn'est pas une option valide statpour Mac.
Abel Callejo
10

Dans un référentiel non nu (et un référentiel nu n'a pas de sens pour git pull), git enregistre toutes les modifications apportées aux conseils de branche et à l'idée de branche actuelle dans "reflogs", dans .git/logs. Vous pouvez les visualiser en utilisant git log -g.

Cependant, bien que les fichiers journaux aient des horodatages, il ne semble pas qu'ils git log -gles imprimeront. Cependant, si vous regardez .git/logs/HEADpar exemple, vous verrez que le format est assez simple à analyser - il se compose de ce que la référence (ou HEAD) a changé, changé en, qui l'a changé, quand et un message d'activité.

araqnid
la source
5
git show -1 --stat  

Cette commande git montre les dernières modifications commits l'heure et la date avec un message

sachin_ur
la source
3

Utilisez python: python -c "import os;print os.stat('.git/FETCH_HEAD').st_mtime"

plus large
la source
a besoin d'un certain formatage, mais une réponse complètement valide pour freebsd où stat ne fonctionne pas de la manière décrite ci-dessus.
Endre
2
python -c "import os, datetime ;print datetime.datetime.fromtimestamp(os.stat('.git/FETCH_HEAD').st_mtime)"

ou

python3 -c "import os, datetime ;print(datetime.datetime.fromtimestamp(os.stat('.git/FETCH_HEAD').st_mtime))"
Redeyed
la source
1

Solution Bash multiplateforme (OSX / Linux)

Fortement inspiré par la @smoovesréponse: https://stackoverflow.com/a/9229377/622276 et commentaires.

Mais je maintiens ma propre intégration git prompt bash

Avec la source ici: https://github.com/neozenith/dotfiles/blob/master/bash-scripts/function_parse_git_prompt.sh

msys La version de Git Bash pour Windows fonctionne de la même manière que la version Linux.

Je compile les options multiplateformes dans une déclaration de cas. Ainsi, il lancera un processus d'extraction sur tout dépôt git dans lequel je navigue et qui date de plus de quinze minutes depuis la dernière extraction, de sorte que le reste de mon script d'invite sait si j'ai des choses à extraire.

Le radar Git avait l' habitude de le faire, mais il fallait enregistrer un fichier avec l'horodatage du dernier appel. Cela n'écrit aucun fichier temporaire.

git rev-parse --show-toplevelsignifie simplement que si je suis n'importe où dans un repo git, il obtiendra la racine du repo afin que nous puissions référencer le .gitchemin du dossier.

# No repo == no more work 
local REPO_ROOT=`git rev-parse --show-toplevel 2> /dev/null`
if [[ -n $REPO_ROOT && -e "$REPO_ROOT/.git/FETCH_HEAD" ]]; then

    case $OSTYPE in
      darwin*)
        local LAST_FETCH="$(stat -f '%m' $REPO_ROOT/.git/FETCH_HEAD)" 
        local FETCH_THRESHOLD="$(date -v-15m +%s)"  
      ;;
      *)
        local LAST_FETCH="$(stat -c %Y $REPO_ROOT/.git/FETCH_HEAD)" 
        local FETCH_THRESHOLD="$(date -d'15 minutes ago' +%s)"  
      ;;
    esac

    # Fork fetch process in background
    if [[ $LAST_FETCH -lt $FETCH_THRESHOLD ]]; then
      git fetch --all --quiet --prune 2> /dev/null &
    fi

fi
Josh Peak
la source
1

Voici un petit wrapper git. Installez-le avec le nom gitet avec les droits chmod a+x git. Puis ajoutez last_successful_fetchà .git/info/exclude.

Lorsque vous voulez voir le résultat, utilisez stat last_successful_fetch.

#!/bin/sh

# This script just invokes git as expected, plus one additional action:
# If there stands last_successful_fetch in .git/info/exclude, then
# this file will be touched in top dir.

"`which --all git | uniq | head -n 2 | tail -n 1`" "$@"
status=$?

if [ _"$1" = _pull -o _"$1" = _fetch ]; then
    if grep last_successful_fetch "`git rev-parse --git-dir`/info/exclude" >/dev/null 2>&1; then
        [ $status = 0 ] && touch last_successful_fetch
    fi
fi
jifb
la source
0
$ # for the latest pull even if there's nothing new
$ stat -c %y .git/FETCH_HEAD
2017-12-15 11:24:25.000000000 +0100
$ 
$ # for records of updated references
$ git reflog --date=iso
db2bba84 (HEAD -> master, origin/master, origin/HEAD) HEAD@{2017-12-14 11:28:39 +0100}: pull: Fast-forward
37fe73ad HEAD@{2017-12-03 17:09:32 +0100}: pull: Fast-forward
c4107fcd HEAD@{2017-11-27 18:53:40 +0100}: clone: from https://github.com/macports/macports-base
$ 
$ # for a more detailed view of the latter
$ git log -g
commit db2bba84d5e8cd82ec94a19129deb91ef62287bb (HEAD -> master, origin/master, origin/HEAD)
Reflog: HEAD@{0} (me <[email protected]>)
Reflog message: pull: Fast-forward
Author: Ryan Schmidt <[email protected]>
Date:   Wed Dec 13 10:23:47 2017 -0600

    portutil.tcl: Fix renames that supply the -force option

    Treat $options as a list not as a string.

    See: https://trac.macports.org/ticket/55492

[snip]
1,61803
la source
-2

Comme suggéré par l'utilisateur: https://stackoverflow.com/users/83646/smoove , vous pouvez trouver quand git pull a été appelé pour la dernière fois sur le dépôt en vérifiant l'horodatage de modification de: .git / FETCH_HEAD comme: git écrit le .git / FETCH_HEAD chaque fois que vous tirez ou récupérez, même s'il n'y avait rien à extraire.

Exemple: {master} vinegupt @ bhling69 (/imsgit_local/work/vinegupt/ims_18.5a/ims_common) $ stat -c% y .git / FETCH_HEAD

12/02/2018 02: 01: 50.487160386 +0530

Vineet Gupta
la source
Fo OSX 10.9.5 J'avais besoin de le faire: stat -f %Sm .git/FETCH_HEADmais semble bien fonctionner pour moi.
Josh
Vous devriez voter pour la réponse de @ smoove au lieu de la copier / coller dans votre propre «réponse».
bfontaine