Bagaimana cara memeriksa tanggal dan waktu `git pull` terbaru yang dijalankan?

91

Bagaimana cara memeriksa tanggal dan waktu terbaru git pullyang dijalankan? Saya sering perlu tahu ketika kode berubah di server ketika terjadi kesalahan.

Chirag Patel
sumber

Jawaban:

28

The git showperintah menunjukkan tanggal terbaru komit. Ini bukanlah tanggal di mana komit ditarik ke repositori lokal, tetapi Git tidak menyimpan informasi tarik tersebut.

Anda mungkin dapat menemukan waktu penarikan terakhir menggunakan ctime (waktu pembuatan) file di server. Sebagai contoh:

ls -lct

menunjukkan waktu setiap file, diurutkan dengan yang terbaru terlebih dahulu.

Greg Hewgill
sumber
18
Ini tidak menjawab pertanyaan - lihat jawaban smoove di bawah.
Wilfred Hughes
1
git showmenunjukkan tanggal komit tip dari cabang saat ini, yang tidak perlu komit terbaru dalam repo, apalagi tanggal pengambilan / penarikan terbaru. Saya juga merekomendasikan untuk memeriksa jawaban smoove.
Stefaan
3
Saya mohon untuk berbeda. Ini menjawab pertanyaan itu. Meskipun tidak memberi Anda tanggal penarikan terbaru, ini memberi Anda tanggal pengikatan yang terbaru saat Anda terakhir menarik. Untuk kasus penggunaan dalam pertanyaan awal, ini sangat cocok. Anda ingin tahu kapan terakhir kali Anda memperbarui kode di server melalui git pull, yaitu versi kode mana yang saat ini ada di server. git showmemberi tahu Anda di mana tempat klon lokal Anda berada. (Saya tahu ini sudah tua, tapi saya berakhir di sini melalui pencarian.)
Dietmar
151
stat -c %Y .git/FETCH_HEAD

Akan memberi Anda stempel waktu unix dari modifikasi terakhir file itu. Git menulis file FETCH_HEAD setiap kali Anda menarik atau mengambil, bahkan jika tidak ada yang menarik.

smoove
sumber
18
Stempel waktu Unix dari waktu yang diubah di OSX:stat -f '%m' .git/FETCH_HEAD
jpillora
18
Git menulis FETCH_HEAD sebelum pengambilan / penarikan yang sebenarnya ... Jadi jika penarikan gagal atau dibatalkan maka FETCH_HEAD tidak akan mewakili status repositori yang sebenarnya. Ini sangat bermasalah ketika URL repo asli tidak berfungsi, karena setiap penarikan akan gagal tetapi FETCH_HEAD akan diperbarui pada setiap upaya.
rustyx
9
Tanggal waktu stat -f '%Sm' $(git rev-parse --show-toplevel)/.git/FETCH_HEAD
perubahan
7
Anda juga dapat memeriksa .git/refs/heads/masterstempel waktunya yang akan berubah ketika git pullhasil dalam perubahan datang dari mastercabang jarak jauh , tetapi stempel waktu tidak akan berubah ketika git pulllaporan tidak ada perubahan.
Malvineous
6
Untuk siapa pun yang menggunakan ini dalam skrip: Jika pengambilan atau penarikan belum dilakukan maka FETCH_HEAD belum akan ada dan stat akan mengembalikan kode keluar 1.
MajicBob
45

Sebuah firasat, saya mencoba "stat -c% y .git / FETCH_HEAD", dan mendapatkan hasil cetakan yang dapat dibaca manusia pada waktunya:

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

Selanjutnya, Anda dapat menambahkan when = !stat -c %y .git/FETCH_HEADke [alias]bagian dalam ~ / .gitconfig berkas (itu paling aman untuk melakukan ini secara otomatis dengan menjalankan baris perintah berikut dalam git repo)

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

dan kemudian Anda dapat menemukan info ini dengan "perintah" baru Anda, kapan saja:

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

[Kemudian saya terpikir untuk melakukan "man stat", dan saya menemukan bahwa ada banyak% parameter lain yang tersedia untuk program 'stat'. YMMV.]

Paul McMullin
sumber
3
Inilah jawaban yang paling berguna!
Arun
Hanya sebuah catatan. -cbukan pilihan yang valid statuntuk Mac.
Abel Callejo
10

Dalam repositori non-bare (dan repositori kosong tidak masuk akal git pull), git mencatat semua perubahan pada tip cabang dan ide cabang saat ini dalam "reflogs", di .git/logs. Anda dapat melihatnya menggunakan git log -g.

Namun, meskipun file log memiliki stempel waktu, tampaknya tidak git log -gakan mencetaknya. Namun, jika Anda perhatikan .git/logs/HEADmisalnya, Anda akan melihat bahwa formatnya cukup sederhana untuk diurai- ini terdiri dari apa ref (atau HEAD) berubah dari, diubah menjadi, siapa yang mengubahnya, kapan dan pesan aktivitas.

araqnid
sumber
6
git show -1 --stat  

Perintah git ini menunjukkan perubahan terbaru melakukan waktu dan tanggal dengan pesan

sachin_ur
sumber
3

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

lebih luas
sumber
membutuhkan beberapa pemformatan, tetapi jawaban yang sepenuhnya valid untuk freebsd di mana stat tidak berfungsi seperti yang dijelaskan di atas.
Endre
2
python -c "import os, datetime ;print datetime.datetime.fromtimestamp(os.stat('.git/FETCH_HEAD').st_mtime)"

atau

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

Solusi Bash Cross Platform (OSX / Linux)

Sangat terinspirasi oleh @smoovesjawaban: https://stackoverflow.com/a/9229377/622276 dan komentar.

Tapi saya mempertahankan integrasi git prompt bash saya sendiri

Dengan sumbernya di sini: https://github.com/neozenith/dotfiles/blob/master/bash-scripts/function_parse_git_prompt.sh

msys versi di Git Bash untuk Windows bekerja sama dengan versi linux.

Saya menyusun opsi lintas platform menjadi pernyataan kasus. Jadi ini akan membagi proses pengambilan pada repo git apa pun yang saya navigasikan yang lebih lama dari lima belas menit sejak pengambilan terakhir sehingga sisa skrip prompt saya tahu apakah saya memiliki sesuatu untuk ditarik.

Radar Git terbiasa dengan ini, tetapi membutuhkan penyimpanan file dengan stempel waktu kapan pengambilan terakhir dipanggil. Ini tidak menulis file sementara.

git rev-parse --show-toplevelhanya berarti jika saya berada di mana saja di git repo itu akan mendapatkan root repo sehingga kita dapat mereferensikan .gitjalur folder.

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

Ini bungkus git kecil. Instal dengan nama gitdan hak chmod a+x git. Kemudian tambahkan last_successful_fetchke .git/info/exclude.

Jika ingin melihat hasilnya, gunakan 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
sumber
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
sumber
-2

Seperti yang disarankan oleh pengguna: https://stackoverflow.com/users/83646/smoove , Anda dapat mengetahui kapan git pull terakhir kali dipanggil di repo dengan memeriksa stempel waktu modifikasi: .git / FETCH_HEAD sebagai: git menulis .git / FETCH_HEAD setiap kali Anda menarik atau mengambil, meskipun tidak ada yang ditarik.

Contoh: {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
sumber
Untuk OSX 10.9.5 Saya perlu melakukan ini: stat -f %Sm .git/FETCH_HEADtetapi tampaknya bekerja dengan baik untuk saya.
Josh
Anda harus memberi suara positif pada jawaban @ smoove daripada menyalin / menempelkannya di "jawaban" Anda sendiri.
bfontaine