Jak sprawdzić datę i godzinę ostatniego wykonania polecenia „git pull”?

91

Jak sprawdzić datę i godzinę ostatniego git pullwykonania? Często muszę wiedzieć, kiedy kod zmienił się na serwerze, gdy coś poszło nie tak.

Chirag Patel
źródło

Odpowiedzi:

28

Do git showpodaje komunikat daty najnowszego popełnić. To nie jest data ściągnięcia zatwierdzenia do lokalnego repozytorium, ale Git nie przechowuje takich informacji o ściągnięciu.

Możesz być w stanie znaleźć czas ostatniego ściągnięcia za pomocą ctime (czasu utworzenia) plików na serwerze. Na przykład:

ls -lct

pokazuje ctime każdego pliku, posortowane od najnowszych jako pierwsze.

Greg Hewgill
źródło
18
To nie odpowiada na pytanie - zobacz odpowiedź Smoove poniżej.
Wilfred Hughes
1
git showpokazuje datę zatwierdzenia końcówki bieżącej gałęzi, co nie jest konieczne, ostatnie zatwierdzenie w repozytorium, nie mówiąc już o dacie ostatniego pobrania / ściągnięcia. Polecam też sprawdzić odpowiedź Smoove.
Stefaan
3
Pozwolę sobie być innego zdania. To odpowiada na pytanie. Chociaż nie podaje daty ostatniego wyciągnięcia, podaje datę zatwierdzenia, która była ostatnią, kiedy ostatnio wyciągałeś. W przypadku użycia w pierwotnym pytaniu jest to idealnie odpowiednie. Chcesz wiedzieć, kiedy ostatnio aktualizowałeś kod na serwerze za pomocą git pull, tj. Która wersja kodu znajduje się obecnie na serwerze. git showpowie ci, w którym zatwierdzeniu znajduje się twój lokalny klon. (Wiem, że to jest stare, ale znalazłem się tutaj przez wyszukiwanie).
Dietmar
151
stat -c %Y .git/FETCH_HEAD

Poda uniksowy znacznik czasu ostatniej modyfikacji tego pliku. Git zapisuje plik FETCH_HEAD za każdym razem, gdy ściągasz lub pobierasz, nawet jeśli nie było nic do ściągnięcia.

wygładzić
źródło
18
Uniksowy znacznik czasu modyfikacji na OSX:stat -f '%m' .git/FETCH_HEAD
jpillora
18
Git zapisuje FETCH_HEAD przed faktycznym pobieraniem / ściąganiem ... Więc jeśli ściąganie nie powiodło się lub zostało anulowane, wówczas FETCH_HEAD nie reprezentowałby rzeczywistego stanu repozytorium. Jest to szczególnie problematyczne, gdy oryginalny adres URL repozytorium nie działa, ponieważ każde ściąganie nie powiedzie się, ale FETCH_HEAD będzie aktualizowany przy każdej próbie.
rustyx
9
Data modyfikacji czasu na OS X:stat -f '%Sm' $(git rev-parse --show-toplevel)/.git/FETCH_HEAD
Colin vH
7
Możesz również sprawdzić, .git/refs/heads/masterktóry z nich zmieni sygnaturę czasową, gdy git pullspowoduje to zmiany przychodzące ze zdalnej mastergałęzi, ale sygnatura czasowa nie zmieni się, gdy w git pullraportach nie będzie żadnych zmian.
Malvineous
6
Dla każdego, kto używa tego w skrypcie: Jeśli pobieranie lub ściąganie nie zostało jeszcze wykonane, FETCH_HEAD jeszcze nie będzie istnieć, a stat zwróci kod zakończenia 1.
MajicBob
45

W pewnym sensie wypróbowałem „stat -c% y .git / FETCH_HEAD” i otrzymałem czytelny dla człowieka wydruk czasu:

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

Ponadto możesz dodać when = !stat -c %y .git/FETCH_HEADdo [alias]sekcji w swoim pliku ~ / .gitconfig (najbezpieczniej jest to zrobić automatycznie, uruchamiając następującą linię poleceń w dowolnym repozytorium git)

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

a następnie możesz znaleźć te informacje za pomocą nowego „polecenia” w dowolnym momencie:

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

[Potem przyszło mi do głowy, żeby zrobić "man stat" i odkryłem, że jest kilka innych parametrów% dostępnych dla programu "stat". YMMV.]

Paul McMullin
źródło
3
To najbardziej przydatna odpowiedź!
Arun
Tylko uwaga. -cnie jest prawidłową opcją statdla komputerów Mac.
Abel Callejo
10

W repozytorium non-bare (i repozytorium gołym nie ma sensu git pull), git rejestruje wszystkie zmiany we wskazówkach dotyczących gałęzi i bieżącej idei gałęzi w "reflogs" w formacie .git/logs. Możesz je przeglądać za pomocą git log -g.

Jednak chociaż pliki dziennika mają sygnatury czasowe, nie wydaje się, git log -gaby je wydrukować. Jeśli jednak spojrzysz na .git/logs/HEADprzykład, zobaczysz, że format jest dość prosty do przeanalizowania - składa się z tego, z czego zmienił się ref (lub HEAD), zmienił się na, kto go zmienił, kiedy i komunikat o aktywności.

araqnid
źródło
6
git show -1 --stat  

To polecenie git pokazuje najnowsze zmiany zatwierdza godzinę i datę wraz z komunikatem

sachin_ur
źródło
3

Użyj Pythona: python -c "import os;print os.stat('.git/FETCH_HEAD').st_mtime"

szerszej
źródło
wymaga pewnego formatowania, ale całkowicie poprawnej odpowiedzi dla freebsd, gdzie stat nie działa w sposób opisany powyżej.
Endre
2
python -c "import os, datetime ;print datetime.datetime.fromtimestamp(os.stat('.git/FETCH_HEAD').st_mtime)"

lub

python3 -c "import os, datetime ;print(datetime.datetime.fromtimestamp(os.stat('.git/FETCH_HEAD').st_mtime))"
RedEyed
źródło
1

Rozwiązanie Bash dla wielu platform (OSX / Linux)

Mocno zainspirowana @smoovesodpowiedzią: https://stackoverflow.com/a/9229377/622276 i komentarzami.

Ale utrzymuję własną integrację git z szybkim bash

Ze źródłem tutaj: https://github.com/neozenith/dotfiles/blob/master/bash-scripts/function_parse_git_prompt.sh

msys wersja w Git Bash dla Windows działa identycznie jak wersja dla Linuksa.

Kompiluję opcje międzyplatformowe w instrukcji case. Więc rozwidli proces pobierania w każdym repozytorium git, do którego się przechodzę, starszym niż piętnaście minut od ostatniego pobierania, więc reszta mojego skryptu zachęty wie, czy mam coś do ściągnięcia.

Radar Git kiedyś to robił, ale wymagał zapisania pliku z sygnaturą czasową, kiedy wywołano ostatnie pobieranie. To nie zapisuje plików tymczasowych.

git rev-parse --show-topleveloznacza tylko, że jeśli jestem w dowolnym miejscu w repozytorium git, otrzyma katalog główny repozytorium, abyśmy mogli odwołać się do .gitścieżki folderu.

# 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
źródło
1

Oto małe opakowanie gita. Zainstaluj go z nazwą giti uprawnieniami chmod a+x git. Następnie dodaj last_successful_fetchdo .git/info/exclude.

Jeśli chcesz zobaczyć wynik, użyj 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
źródło
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
źródło
-2

Zgodnie z sugestią użytkownika: https://stackoverflow.com/users/83646/smoove , możesz sprawdzić, kiedy git pull był ostatnio wywoływany w repozytorium, sprawdzając sygnaturę czasową modyfikacji: .git / FETCH_HEAD as: git zapisuje .git / Plik FETCH_HEAD za każdym razem, gdy ściągasz lub pobierasz, nawet jeśli nie było nic do ściągnięcia.

Przykład: {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
źródło
Fo OSX 10.9.5 Musiałem to zrobić: stat -f %Sm .git/FETCH_HEADale wydaje mi się, że działa dobrze.
Josh
Powinieneś głosować za odpowiedzią @ smoove zamiast kopiować / wklejać ją we własnej „odpowiedzi”.
bfontaine