Як перевірити дату та час останнього `git pull`, який був виконаний?


91

Як перевірити дату та час останнього, git pullщо було виконано? Мені часто потрібно знати, коли код змінювався на сервері, коли щось пішло не так.

Відповіді:


28

У git showкоманді показує дату самого останньої фіксація. Це не дата, коли коміт було витягнуто до локального сховища, але Git не зберігає таку інформацію про витягування.

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

ls -lct

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


18
Це не відповідає на запитання - див. Відповідь Smoove нижче.
Вільфред Хьюз

1
git showпоказує дату коміту чайової поточної гілки, що не є необхідним для останнього коміту в репо, не кажучи вже про дату останнього завантаження / витягування. Я також рекомендую перевірити відповідь Smoove.
Стефаан,

3
Дозволю собі не погодитися. Це відповідає на запитання. Хоча він не вказує вам дату останнього витягування, він надає вам дату фіксації, яка була останньою, коли ви востаннє витягували. Для випадку використання в оригінальному питанні це цілком підходить. Ви хочете знати, коли ви востаннє оновлювали код на сервері за допомогою git pull, тобто яка версія коду наразі є на сервері. git showповідомляє вам, у якому коміті знаходиться ваш локальний клон. (Я знаю, що це давнє, але я опинився тут через пошук.)
Дітмар,

150
stat -c %Y .git/FETCH_HEAD

Дасть вам мітку часу unix останньої модифікації цього файлу. Git пише файл FETCH_HEAD кожного разу, коли ви тягнете або витягаєте, навіть якщо не було чого тягнути.


17
stat -f '%m' .git/FETCH_HEAD
Мітка

18
Git пише FETCH_HEAD перед фактичним вибором / витяганням ... Отже, якщо витягнення не вдалося або було скасовано, FETCH_HEAD не буде представляти фактичний стан сховища. Це особливо проблематично, коли вихідна URL-адреса репо не працює, оскільки кожне витягнення не вдасться, але FETCH_HEAD буде оновлюватися при кожній спробі.
rustyx

9
Дата зміни часу на OS X:stat -f '%Sm' $(git rev-parse --show-toplevel)/.git/FETCH_HEAD
Колін проти

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
Це найкорисніша відповідь!
Арун

Просто примітка. -cне є дійсним варіантом statдля Mac.
Абель Каллехо

10

У непростому сховищі (а оголене сховище не має сенсу git pull), git реєструє всі зміни до підказок гілок та поточної ідеї гілки у "перезапису", у .git/logs. Ви можете переглянути їх за допомогою git log -g.

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


6
git show -1 --stat  

Ця команда git показує час та дату фіксації останніх змін із повідомленням


3

Використовуйте python: python -c "import os;print os.stat('.git/FETCH_HEAD').st_mtime"


потрібне деяке форматування, але цілком відповідна відповідь для freebsd, де stat не працює описаними вище способами.
Endre

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))"

1

Рішення Bash для різних платформ (OSX / Linux)

Дуже натхненний @smoovesвідповіддю: https://stackoverflow.com/a/9229377/622276 та коментарями.

Але я підтримую власну баш оперативну інтеграцію git

З джерелом тут: https://github.com/neozenith/dotfiles/blob/master/bash-scripts/function_parse_git_prompt.sh

msys версія в Git Bash для Windows працює ідентично версії Linux.

Я збираю варіанти крос-платформних платформ у заяві. Отже, він буде розгалужувати процес отримання на будь-якому репозиторії git, до якого я переходжу, і який перебуває старше п’ятнадцяти хвилин з моменту останнього завантаження, тому решта мого сценарію підказки знає, чи є у мене щось для витягування.

Радар Git використовував це, але він вимагав збереження файлу з позначкою часу, коли був викликаний останній вибір. Це не пише тимчасових файлів.

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

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]

-2

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

Приклад: {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


Для OSX 10.9.5 мені потрібно було це зробити, stat -f %Sm .git/FETCH_HEADале, здається, це добре для мене працює.
Джош

Вам слід проголосувати за відповідь @ smoove замість того, щоб скопіювати / вставити у власну "відповідь".
bfontaine
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.