ฉันจะตรวจสอบวันที่และเวลาของ "git pull" ล่าสุดที่ดำเนินการได้อย่างไร


91

ฉันจะตรวจสอบวันที่และเวลาล่าสุดgit pullที่ดำเนินการได้อย่างไร? ฉันจำเป็นต้องทราบบ่อยครั้งเมื่อมีการเปลี่ยนแปลงรหัสบนเซิร์ฟเวอร์เมื่อเกิดข้อผิดพลาด

คำตอบ:


28

git showแสดงให้เห็นว่าคำสั่งวันที่ล่าสุดกระทำ นี่ไม่ใช่วันที่ดึงคอมมิตไปยังที่เก็บในเครื่อง แต่ Git จะไม่เก็บข้อมูลดึงดังกล่าว

คุณอาจสามารถค้นหาเวลาของการดึงครั้งสุดท้ายโดยใช้ ctime (เวลาสร้าง) ของไฟล์บนเซิร์ฟเวอร์ ตัวอย่างเช่น:

ls -lct

แสดง ctime ของแต่ละไฟล์โดยเรียงตามลำดับล่าสุดก่อน


19
สิ่งนี้ไม่ตอบคำถาม - ดูคำตอบของ smoove ด้านล่าง
Wilfred Hughes

1
git showแสดงวันที่ของ tip comm ของสาขาปัจจุบันซึ่งไม่จำเป็นต้องเป็นการกระทำล่าสุดใน repo นับประสาวันที่ของการดึง / ดึงล่าสุด ฉันแนะนำให้ตรวจสอบคำตอบของ smoove ด้วย
Stefaan

4
ฉันขอแตกต่าง สิ่งนี้ตอบคำถาม แม้ว่าจะไม่ได้ระบุวันที่ของการดึงครั้งล่าสุด แต่จะให้วันที่ของการกระทำที่เป็นครั้งล่าสุดเมื่อคุณดึงครั้งล่าสุด สำหรับกรณีการใช้งานในคำถามเดิมนี้เหมาะอย่างยิ่ง คุณต้องการทราบว่าคุณอัปเดตโค้ดบนเซิร์ฟเวอร์ครั้งล่าสุดผ่าน git pull เมื่อใดกล่าวคือขณะนี้โค้ดเวอร์ชันใดอยู่บนเซิร์ฟเวอร์ git showบอกคุณว่าการโคลนในเครื่องของคุณอยู่ที่ใด (ฉันรู้ว่ามันเก่าแล้ว แต่ฉันมาที่นี่ผ่านการค้นหา)
Dietmar

157
stat -c %Y .git/FETCH_HEAD

จะให้การประทับเวลายูนิกซ์ของการแก้ไขล่าสุดของไฟล์นั้น Git เขียนไฟล์ FETCH_HEAD ทุกครั้งที่ดึงหรือดึงข้อมูลแม้ว่าจะไม่มีอะไรให้ดึงก็ตาม


18
การประทับเวลา Unix ของเวลาที่แก้ไขบน OSX:stat -f '%m' .git/FETCH_HEAD
jpillora

19
Git เขียน FETCH_HEAD ก่อนการดึง / ดึงจริง ... ดังนั้นหากการดึงล้มเหลวหรือถูกยกเลิก FETCH_HEAD จะไม่แสดงสถานะที่เก็บจริง นี่เป็นปัญหาโดยเฉพาะอย่างยิ่งเมื่อ URL repo ดั้งเดิมไม่ทำงานเนื่องจากการดึงทุกครั้งจะล้มเหลว แต่ 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

50

ในลางสังหรณ์ฉันลอง "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 repo)

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.]


4
นี่คือคำตอบที่มีประโยชน์ที่สุด!
อรุณ

1
เพียงแค่ทราบ -cไม่ใช่ตัวเลือกที่ถูกต้องstatสำหรับ Mac
Abel Callejo

10

ในพื้นที่เก็บข้อมูลที่ไม่ได้เปลือย (และพื้นที่เก็บข้อมูลเปลือยไม่ได้ทำให้ความรู้สึกgit pull) คอมไพล์บันทึกการเปลี่ยนแปลงทั้งหมดในเคล็ดลับสาขาและสาขาความคิดในปัจจุบัน "reflogs" .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 ไม่ทำงานตามที่อธิบายไว้ข้างต้น
สิ้นสุด

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 พร้อมต์ bash

มีแหล่งที่มาที่นี่: https://github.com/neozenith/dotfiles/blob/master/bash-scripts/function_parse_git_prompt.sh

msys เวอร์ชันใน Git Bash สำหรับ Windows ทำงานเหมือนกับเวอร์ชัน linux

ฉันกำลังรวบรวมตัวเลือกข้ามแพลตฟอร์มไว้ในคำสั่งกรณี ดังนั้นมันจะแยกขั้นตอนการดึงข้อมูลใน git repo ใด ๆ ที่ฉันไปที่ซึ่งเก่ากว่าสิบห้านาทีนับตั้งแต่การดึงข้อมูลครั้งสุดท้ายดังนั้นสคริปต์พร้อมต์ที่เหลือของฉันจะรู้ว่าฉันมีสิ่งที่จะดึงหรือไม่

Git radarเคยทำเช่นนี้ แต่ต้องบันทึกไฟล์ที่มีการประทับเวลาเมื่อมีการเรียกครั้งสุดท้าย สิ่งนี้ไม่เขียนไฟล์ชั่วคราว

git rev-parse --show-toplevelหมายความว่าถ้าฉันอยู่ที่ใดก็ได้ใน git repo มันจะได้รับ repo root เพื่อให้เราสามารถอ้างอิง.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 ถูกเรียกครั้งสุดท้ายใน repo โดยตรวจสอบการประทับเวลาการแก้ไขของ: .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แต่ดูเหมือนว่าจะใช้ได้ดีสำหรับฉัน
Josh

คุณควรโหวตคำตอบของ @ smoove แทนที่จะคัดลอก / วางใน "คำตอบ" ของคุณเอง
bfontaine
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.