Как мне проверить дату и время последнего выполненного `git pull`?

91

Как я могу проверить дату и время последнего git pullисполнения? Мне часто нужно знать, когда код меняется на сервере, когда что-то идет не так.

Чираг Патель
источник

Ответы:

28

Команда git showпоказывает дату самой последней фиксации. Это не дата, когда фиксация была извлечена в локальный репозиторий, но Git не хранит такую ​​информацию извлечения.

Вы можете узнать время последнего извлечения, используя ctime (время создания) файлов на сервере. Например:

ls -lct

показывает ctime каждого файла, отсортированного самым последним первым.

Грег Хьюгилл
источник
18
Это не отвечает на вопрос - см. Ответ smoove ниже.
Уилфред Хьюз,
1
git showпоказывает дату фиксации подсказки текущей ветки, которая не является обязательной для самой последней фиксации в репо, не говоря уже о дате последней выборки / извлечения. Я также рекомендую проверить ответ smoove.
Стефан 08
3
Позволю себе не согласиться. Это действительно ответ на вопрос. Хотя он не дает вам дату последнего извлечения, он дает вам дату фиксации, которая была последней, когда вы в последний раз извлекали. Для варианта использования в исходном вопросе это идеально подходит. Вы хотите знать, когда вы в последний раз обновляли код на сервере с помощью git pull, то есть какая версия кода в настоящее время находится на сервере. git showсообщает вам, в каком коммите находится ваш локальный клон. (Я знаю, что это старый, но я оказался здесь через поиск.)
Дитмар
151
stat -c %Y .git/FETCH_HEAD

Выдаст вам временную метку unix последней модификации этого файла. Git записывает файл FETCH_HEAD каждый раз, когда вы извлекаете или извлекаете, даже если тянуть нечего.

улыбаться
источник
18
Временная метка Unix измененного времени в OSX:stat -f '%m' .git/FETCH_HEAD
jpillora
18
Git записывает FETCH_HEAD перед фактическим извлечением / извлечением ... Таким образом, если извлечение не удалось или было отменено, то FETCH_HEAD не будет представлять фактическое состояние репозитория. Это особенно проблематично, когда исходный URL-адрес репо не работает, поскольку каждое извлечение завершится ошибкой, но FETCH_HEAD будет обновляться при каждой попытке.
rustyx
9
Дата изменения в OS X:stat -f '%Sm' $(git rev-parse --show-toplevel)/.git/FETCH_HEAD
Colin vH
7
Вы также можете проверить, для .git/refs/heads/masterкакой из них будет изменена метка времени, когда в git pullрезультате будут поступать изменения из удаленной masterветки, но метка времени не изменится, если будет сообщено git pullоб отсутствии изменений.
Malvineous
6
Для тех, кто использует это в скрипте: если выборка или извлечение еще не было выполнено, тогда FETCH_HEAD еще не существует, и stat вернет код выхода 1.
MajicBob
45

Думая, я попробовал "stat -c% y .git / FETCH_HEAD" и получил удобочитаемую распечатку времени:

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

Кроме того, вы можете добавить when = !stat -c %y .git/FETCH_HEADв [alias]раздел вашего файла ~ / .gitconfig (безопаснее всего сделать это автоматически, запустив следующую командную строку в любом репозитории git)

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

а затем вы сможете найти эту информацию с помощью новой «команды» в любое время:

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

[Тогда мне пришло в голову сделать "man stat", и я обнаружил, что есть множество других% параметров, доступных для программы "stat". YMMV.]

Пол Макмаллин
источник
3
Это самый полезный ответ!
Arun
1
Просто примечание. -cне подходит statдля Mac.
Abel
10

В репозитории, git pullотличном от чистого (а пустой репозиторий не имеет смысла ), git регистрирует все изменения в подсказках веток и текущую идею ветвления в «reflogs» в .git/logs. Вы можете просмотреть их, используя git log -g.

Однако, хотя в файлах журнала есть отметки времени, похоже, что git log -gони не будут печататься. Однако, если вы посмотрите, .git/logs/HEADнапример, вы увидите, что формат довольно прост для синтаксического анализа - он состоит из того, что ref (или HEAD) изменилось, на что изменилось, кто изменил его, когда и сообщение активности.

аракнид
источник
6
git show -1 --stat  

Эта команда git показывает последние изменения, время и дату фиксации с сообщением

sachin_ur
источник
3

Используйте python: python -c "import os;print os.stat('.git/FETCH_HEAD').st_mtime"

Widerin
источник
требует некоторого форматирования, но вполне допустимый ответ для freebsd, где stat не работает описанными выше способами.
Эндре
2
python -c "import os, datetime ;print datetime.datetime.fromtimestamp(os.stat('.git/FETCH_HEAD').st_mtime)"

или

python3 -c "import os, datetime ;print(datetime.datetime.fromtimestamp(os.stat('.git/FETCH_HEAD').st_mtime))"
RedEyed
источник
1

Кросс-платформенное (OSX / Linux) решение Bash

Сильно вдохновлен @smoovesответом: https://stackoverflow.com/a/9229377/622276 и комментариями.

Но я поддерживаю свою собственную интеграцию с подсказкой bash и git

Источник здесь: https://github.com/neozenith/dotfiles/blob/master/bash-scripts/function_parse_git_prompt.sh

msys версия в Git Bash для Windows работает идентично версии для Linux.

Я компилирую кроссплатформенные варианты в оператор case. Таким образом, он будет разветвлять процесс выборки для любого репозитория git, в который я перехожу, который старше пятнадцати минут с момента последней выборки, поэтому остальная часть моего сценария подсказки знает, есть ли у меня что-то вытащить.

Git radar привык к этому, но для этого требовалось сохранить файл с отметкой времени, когда была вызвана последняя выборка. При этом не записываются временные файлы.

git rev-parse --show-toplevelпросто означает, что если я где-нибудь в репозитории git, он получит корень репо, чтобы мы могли ссылаться на .gitпуть к папке.

# 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
Джош Пик
источник
1

Вот небольшая обертка от git. Установите его с именем gitи с правами chmod a+x git. Затем добавьте last_successful_fetchв .git/info/exclude.

Если хотите увидеть результат, используйте 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
источник
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 <me@machine.local>)
Reflog message: pull: Fast-forward
Author: Ryan Schmidt <ryandesign@macports.org>
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
источник
-2

Как было предложено пользователем: https://stackoverflow.com/users/83646/smoove , вы можете узнать, когда git pull последний раз был вызван в репо, проверив временную метку модификации: .git / FETCH_HEAD как: git записывает .git / FETCH_HEAD каждый раз, когда вы извлекаете или извлекаете, даже если тянуть было нечего.

Пример: {master} winegupt @ bhling69 (/imsgit_local/work/vinegupt/ims_18.5a/ims_common) $ stat -c% y .git / FETCH_HEAD

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

Винит Гупта
источник
Для OSX 10.9.5 мне нужно было это сделать: stat -f %Sm .git/FETCH_HEADно, похоже, у меня это хорошо работает.
Джош
Вы должны проголосовать за ответ @ smoove вместо того, чтобы копировать / вставлять его в свой собственный «ответ».
bfontaine