Como verifico a data e a hora do último `git pull` executado?

91

Como verifico a data e a hora da última git pullexecução executada? Freqüentemente, preciso saber quando o código foi alterado em um servidor quando algo deu errado.

Chirag Patel
fonte

Respostas:

27

o git show comando mostra a data do commit mais recente. Esta não é a data em que o commit foi puxado para o repositório local, mas o Git não mantém essas informações de pull.

Você pode encontrar a hora da última puxada usando o ctime (hora de criação) dos arquivos no servidor. Por exemplo:

ls -lct

mostra o ctime de cada arquivo, classificado com o mais recente primeiro.

Greg Hewgill
fonte
18
Isso não responde à pergunta - veja a resposta do smoove abaixo.
Wilfred Hughes
1
git showmostra a data do commit de ponta do branch atual, que não é necessário o commit mais recente no repo, muito menos a data do último fetch / pull. Recomendo também verificar a resposta do smoove.
Stefaan,
3
Eu peço desculpa mas não concordo. Isso responde à pergunta. Embora não forneça a data do último pull, ele fornece a data do commit mais recente quando você puxou pela última vez. Para o caso de uso da pergunta original, isso é perfeitamente adequado. Você quer saber quando foi a última vez que atualizou o código em um servidor via git pull, ou seja, qual versão do código está atualmente no servidor. git showinforma em qual commit seu clone local está. (Eu sei que isso é antigo, mas acabei aqui através da pesquisa.)
Dietmar
149
stat -c %Y .git/FETCH_HEAD

Fornecerá um carimbo de data / hora Unix da última modificação daquele arquivo. Git grava o arquivo FETCH_HEAD toda vez que você puxa ou busca, mesmo se não houver nada para puxar.

beijar
fonte
17
Carimbo de data e hora Unix de tempo modificado no OSX:stat -f '%m' .git/FETCH_HEAD
jpillora
18
Git grava FETCH_HEAD antes do fetch / pull real ... Portanto, se o pull falhou ou foi cancelado, FETCH_HEAD não representaria o estado real do repositório. Isso é especialmente problemático quando o URL do repo original não está funcionando, pois todo pull falhará, mas FETCH_HEAD será atualizado a cada tentativa.
rustyx de
9
Data da hora de modificação no OS X:stat -f '%Sm' $(git rev-parse --show-toplevel)/.git/FETCH_HEAD
Colin vH
7
Você também pode verificar .git/refs/heads/masterqual terá seu carimbo de data / hora alterado quando git pullresultar em alterações vindas do masterbranch remoto , mas o carimbo de data / hora não será alterado quando os git pullrelatórios não houver alterações.
Malvineous de
6
Para qualquer um que use isso em um script: Se uma busca ou retirada ainda não foi feita, então FETCH_HEAD não existirá ainda e stat retornará o código de saída 1.
MajicBob
43

Em um palpite, tentei "stat -c% y .git / FETCH_HEAD" e obtive uma impressão legível da época:

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

Além disso, você pode adicionar when = !stat -c %y .git/FETCH_HEADà [alias]seção em seu arquivo ~ / .gitconfig (é mais seguro fazer isso automaticamente executando a seguinte linha de comando em qualquer repositório git)

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

e então você pode encontrar essas informações com seu novo "comando", a qualquer momento:

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

[Então me ocorreu fazer "man stat" e descobri que há vários outros parâmetros% disponíveis para o programa 'stat'. YMMV.]

Paul McMullin
fonte
3
Esta é a resposta mais útil!
Arun
Apenas uma nota. -cnão é uma opção válida statpara Mac.
Abel Callejo
10

Em um repositório não git pullvazio (e um repositório vazio não faz sentido ), o git registra todas as mudanças nas dicas de branch e a ideia de branch atual em "reflogs", em .git/logs. Você pode ver isso usando git log -g.

No entanto, embora os arquivos de log tenham carimbos de data / hora, não parece que git log -girá imprimi-los. No entanto, se você der uma olhada, .git/logs/HEADpor exemplo, verá que o formato é bastante simples de analisar - consiste no que o ref (ou HEAD) mudou de, mudou para, quem mudou, quando e uma mensagem de atividade.

araqnid
fonte
5
git show -1 --stat  

Este comando git mostra as últimas alterações, hora e data dos commits com mensagem

sachin_ur
fonte
3

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

mais amplo
fonte
precisa de alguma formatação, mas uma resposta completamente válida para freebsd onde stat não funciona da maneira descrita acima.
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
fonte
1

Solução Bash de plataforma cruzada (OSX / Linux)

Fortemente inspirado pela @smoovesresposta: https://stackoverflow.com/a/9229377/622276 e comentários.

Mas estou mantendo minha própria integração git do prompt bash

Com a fonte aqui: https://github.com/neozenith/dotfiles/blob/master/bash-scripts/function_parse_git_prompt.sh

msys A versão no Git Bash para Windows funciona de forma idêntica à versão do Linux.

Estou compilando as opções de plataforma cruzada em uma declaração de caso. Portanto, ele bifurcará um processo de busca em qualquer repositório git em que navegar e que tenha mais de quinze minutos desde a última busca, para que o resto do meu script de prompt saiba se tenho algo para extrair.

O radar Git costumava fazer isso, mas exigia salvar um arquivo com o carimbo de data / hora de quando a última busca foi chamada. Isso não grava arquivos temporários.

git rev-parse --show-toplevelapenas significa que se eu estiver em qualquer lugar em um repo git, ele obterá a raiz do repo para que possamos fazer referência ao .gitcaminho da pasta.

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

Aqui está um pequeno invólucro do git. Instale-o com o nome gite com os direitos chmod a+x git. Em seguida, adicione last_successful_fetcha .git/info/exclude.

Quando quiser ver o resultado, use 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
fonte
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
fonte
-2

Conforme sugerido pelo usuário: https://stackoverflow.com/users/83646/smoove , você pode descobrir quando git pull foi chamado pela última vez no repo verificando o timestamp de modificação de: .git / FETCH_HEAD como: git grava o .git / FETCH_HEAD arquivo toda vez que você puxa ou busca, mesmo se não houver nada para puxar.

Exemplo: {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
fonte
Fo OSX 10.9.5 Eu precisava fazer isso: stat -f %Sm .git/FETCH_HEADmas parece funcionar bem para mim.
Josh
Você deve votar positivamente na resposta de @smoove em vez de copiar / colar em sua própria "resposta".
bfontaine