¿Cómo verifico la fecha y hora del último `git pull` que se ejecutó?

91

¿Cómo verifico la fecha y hora del último git pullque se ejecutó? Con frecuencia necesito saber cuándo cambió el código en un servidor cuando algo sale mal.

Chirag Patel
fuente

Respuestas:

28

El git showcomando muestra la fecha de la confirmación más reciente. Esta no es la fecha en la que se extrajo la confirmación al repositorio local, pero Git no guarda esa información de extracción.

Es posible que pueda encontrar la hora de la última extracción utilizando el ctime (hora de creación) de los archivos en el servidor. Por ejemplo:

ls -lct

muestra el ctime de cada archivo, ordenado con el más reciente primero.

Greg Hewgill
fuente
18
Esto no responde a la pregunta; consulte la respuesta de smoove a continuación.
Wilfred Hughes
1
git showmuestra la fecha de la confirmación de sugerencias de la rama actual, que no es necesaria la confirmación más reciente en el repositorio, y mucho menos la fecha de la última recuperación / extracción. También recomiendo verificar la respuesta de smoove.
Stefaan
3
Siento disentir. Esto responde a la pregunta. Si bien no le da la fecha de la última extracción, sí le da la fecha de la confirmación que fue la más reciente cuando lo extrajo por última vez. Para el caso de uso de la pregunta original, esto es perfectamente adecuado. Desea saber cuándo actualizó por última vez el código en un servidor mediante git pull, es decir, qué versión del código se encuentra actualmente en el servidor. git showle dice en qué confirmación se encuentra su clon local. (Sé que esto es antiguo, pero terminé aquí a través de la búsqueda)
Dietmar
151
stat -c %Y .git/FETCH_HEAD

Le dará una marca de tiempo Unix de la última modificación de ese archivo. Git escribe el archivo FETCH_HEAD cada vez que extraes o recuperas, incluso si no había nada que extraer.

suavizar
fuente
18
Marca de tiempo Unix del tiempo modificado en OSX:stat -f '%m' .git/FETCH_HEAD
jpillora
18
Git escribe FETCH_HEAD antes de la extracción / extracción real ... Entonces, si la extracción falló o se canceló, FETCH_HEAD no representaría el estado real del repositorio. Esto es especialmente problemático cuando la URL del repositorio original no funciona, ya que cada extracción fallaría, pero FETCH_HEAD se actualizará en cada intento.
rustyx
9
Fecha de modificación en OS X:stat -f '%Sm' $(git rev-parse --show-toplevel)/.git/FETCH_HEAD
Colin vH
7
También puede verificar .git/refs/heads/mastercuál tendrá su cambio de marca de tiempo cuando los git pullcambios provengan de la mastersucursal remota , pero la marca de tiempo no cambiará cuando git pullinforme que no hay cambios.
Malvineous
6
Para cualquiera que use esto en un script: si aún no se ha realizado una búsqueda o extracción, FETCH_HEAD aún no existirá y la estadística devolverá el código de salida 1.
MajicBob
45

Por una corazonada, probé "stat -c% y .git / FETCH_HEAD" y obtuve una copia impresa legible por humanos de la época:

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

Además, puede agregar when = !stat -c %y .git/FETCH_HEADa la [alias]sección en su archivo ~ / .gitconfig (es más seguro hacerlo automáticamente ejecutando la siguiente línea de comando en cualquier repositorio de git)

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

y luego podrá encontrar esta información con su nuevo "comando", en cualquier momento:

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

[Entonces se me ocurrió hacer "man stat", y descubrí que hay un montón de otros parámetros% disponibles para el programa "stat". YMMV.]

Paul McMullin
fuente
3
¡Esta es la respuesta más útil!
Arun
1
Solo una nota. -cno es una opción válida de statpara Mac.
Abel Callejo
10

En un repositorio no simple (y un repositorio simple no tiene sentido para git pull), git registra todos los cambios en las sugerencias de rama y la idea de rama actual en "reflogs", en formato .git/logs. Puede verlos usandogit log -g .

Sin embargo, aunque los archivos de registro tienen marcas de tiempo, no parece que git log -glo imprima. Sin embargo, si echa un vistazo, .git/logs/HEADpor ejemplo, verá que el formato es bastante simple de analizar: consiste en qué cambió la referencia (o HEAD), a quién cambió, cuándo y un mensaje de actividad.

arácnido
fuente
6
git show -1 --stat  

Este comando git muestra los últimos cambios, confirma la fecha y la hora con el mensaje

sachin_ur
fuente
3

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

Widerin
fuente
necesita algo de formato, pero una respuesta completamente válida para freebsd donde stat no funciona de la manera descrita anteriormente.
Endre
2
python -c "import os, datetime ;print datetime.datetime.fromtimestamp(os.stat('.git/FETCH_HEAD').st_mtime)"

o

python3 -c "import os, datetime ;print(datetime.datetime.fromtimestamp(os.stat('.git/FETCH_HEAD').st_mtime))"
Ojos rojos
fuente
1

Solución Bash multiplataforma (OSX / Linux)

Muy inspirado por la @smoovesrespuesta: https://stackoverflow.com/a/9229377/622276 y comentarios.

Pero estoy manteniendo mi propia integración de git con el indicador de bash

Con la fuente aquí: https://github.com/neozenith/dotfiles/blob/master/bash-scripts/function_parse_git_prompt.sh

msys La versión en Git Bash para Windows funciona de manera idéntica a la versión de Linux.

Estoy compilando las opciones multiplataforma en una declaración de caso. Por lo tanto, bifurcará un proceso de búsqueda en cualquier repositorio de git en el que navegue y que tenga más de quince minutos desde la última búsqueda para que el resto de mi secuencia de comandos de solicitud sepa si tengo cosas que extraer.

El radar de Git solía hacer esto, pero requería guardar un archivo con la marca de tiempo de cuándo se llamó a la última búsqueda. Esto no escribe archivos temporales.

git rev-parse --show-toplevelsolo significa que si estoy en cualquier lugar de un repositorio de git, obtendrá la raíz del repositorio para que podamos hacer referencia a la .gitruta de la carpeta.

# 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
fuente
1

Aquí hay una pequeña envoltura de git. Instálelo con el nombre gity con derechos chmod a+x git. Luego agregue last_successful_fetcha .git/info/exclude.

Cuando quieras ver el resultado, usa 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
fuente
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
fuente
-2

Según lo sugerido por el usuario: https://stackoverflow.com/users/83646/smoove , puede encontrar cuándo se llamó a git pull por última vez en el repositorio al verificar la marca de tiempo de modificación de: .git / FETCH_HEAD como: git escribe el .git / FETCH_HEAD cada vez que extrae o recupera, incluso si no hay nada que extraer.

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

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

Vineet Gupta
fuente
Para OSX 10.9.5 necesitaba hacer esto: stat -f %Sm .git/FETCH_HEADpero parece funcionar bien para mí.
Josh
Debería votar a favor la respuesta de @ smoove en lugar de copiarla / pegarla en su propia "respuesta".
bfontaine