Làm cách nào để kiểm tra ngày và giờ của `git pull` mới nhất đã được thực thi?


91

Làm cách nào để kiểm tra ngày và giờ mới nhất git pullđã được thực thi? Tôi thường xuyên cần biết khi nào mã thay đổi trên máy chủ khi có sự cố.

Câu trả lời:


27

Các git showchương trình lệnh ngày gần đây nhất cam kết. Đây không phải là ngày mà cam kết được kéo vào kho lưu trữ cục bộ, nhưng Git không giữ thông tin kéo như vậy.

Bạn có thể tìm thấy thời gian của lần kéo cuối cùng bằng cách sử dụng ctime (thời gian tạo) của các tệp trên máy chủ. Ví dụ:

ls -lct

hiển thị thời gian của mỗi tệp, được sắp xếp với tệp đầu tiên gần đây nhất.


18
Điều này không trả lời câu hỏi - hãy xem câu trả lời của Smoove bên dưới.
Wilfred Hughes

1
git showhiển thị ngày cam kết mẹo của nhánh hiện tại, không cần thiết phải cam kết gần đây nhất trong repo, chứ chưa nói đến ngày tìm nạp / kéo gần nhất. Tôi cũng khuyên bạn nên kiểm tra câu trả lời của Smoove.
Stefaan

3
Tôi có ý kiến ​​khác. Điều này trả lời câu hỏi. Mặc dù nó không cung cấp cho bạn ngày thực hiện lần kéo gần nhất, nhưng nó cung cấp cho bạn ngày thực hiện lần cam kết gần đây nhất khi bạn kéo lần cuối cùng. Đối với trường hợp sử dụng trong câu hỏi ban đầu, điều này hoàn toàn phù hợp. Bạn muốn biết lần cuối cùng bạn cập nhật mã trên máy chủ thông qua git pull, tức là phiên bản mã nào hiện có trên máy chủ. git showcho bạn biết bản sao cục bộ của bạn đang ở đâu. (Tôi biết điều này là cũ, nhưng tôi đã kết thúc ở đây qua tìm kiếm.)
Dietmar

149
stat -c %Y .git/FETCH_HEAD

Sẽ cung cấp cho bạn dấu thời gian unix của lần sửa đổi cuối cùng của tệp đó. Git ghi tệp FETCH_HEAD mỗi khi bạn kéo hoặc tìm nạp, ngay cả khi không có gì để kéo.


17
Dấu thời gian Unix về thời gian được sửa đổi trên OSX:stat -f '%m' .git/FETCH_HEAD
jpillora

18
Git ghi FETCH_HEAD trước khi tìm nạp / kéo thực sự ... Vì vậy, nếu kéo không thành công hoặc bị hủy bỏ thì FETCH_HEAD sẽ không đại diện cho trạng thái kho lưu trữ thực tế. Điều này đặc biệt có vấn đề khi URL repo ban đầu không hoạt động, vì mọi lần kéo sẽ không thành công nhưng FETCH_HEAD sẽ được cập nhật sau mỗi lần thử.
gỉ sắt

9
Ngày giờ sửa đổi trên OS X:stat -f '%Sm' $(git rev-parse --show-toplevel)/.git/FETCH_HEAD
Colin vH

7
Bạn cũng có thể kiểm tra xem .git/refs/heads/masterdấu thời gian nào sẽ thay đổi dấu thời gian khi git pulldẫn đến các thay đổi đến từ masterchi nhánh từ xa , nhưng dấu thời gian sẽ không thay đổi khi git pullbáo cáo không có thay đổi.
Malvineous

6
Đối với bất cứ ai sử dụng này trong một kịch bản: Nếu lấy hoặc kéo chưa được thực hiện nhưng sau đó FETCH_HEAD sẽ không tồn tại được nêu ra và stat sẽ trở lại mã thoát 1.
MajicBob

43

Linh cảm, tôi đã thử "stat -c% y .git / FETCH_HEAD" và nhận được một bản in mà con người có thể đọc được vào thời điểm đó:

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

Hơn nữa, bạn có thể thêm when = !stat -c %y .git/FETCH_HEADvào [alias]phần trong tệp ~ / .gitconfig của mình (an toàn nhất là làm điều này tự động bằng cách chạy dòng lệnh sau trong bất kỳ git repo nào)

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

và sau đó bạn có thể tìm thấy thông tin này bằng "lệnh" mới của mình bất cứ lúc nào:

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

[Sau đó, tôi tình cờ làm "man stat" và tôi thấy rằng có một loạt các tham số% khác có sẵn cho chương trình 'stat'. YMMV.]


3
Đây là câu trả lời hữu ích nhất!
Arun

Chỉ là một ghi chú. -ckhông phải là một tùy chọn hợp lệ statcho Mac.
Abel Callejo

10

Trong một kho lưu trữ không trần (và một kho lưu trữ trống không có ý nghĩa đối với git pull), git ghi lại tất cả các thay đổi đối với các mẹo nhánh và ý tưởng nhánh hiện tại trong "reflogs", trong .git/logs. Bạn có thể xem những điều này bằng cách sử dụng git log -g.

Tuy nhiên, mặc dù các tệp nhật ký có dấu thời gian, nhưng nó không xuất hiện để git log -gin nó. Tuy nhiên, nếu bạn xem xét .git/logs/HEADví dụ, bạn sẽ thấy rằng định dạng này khá đơn giản để phân tích cú pháp - nó bao gồm những gì ref (hoặc HEAD) đã thay đổi từ, thay đổi thành, ai đã thay đổi nó, khi nào và một thông báo hoạt động.


5
git show -1 --stat  

Lệnh git này hiển thị các thay đổi mới nhất cam kết ngày và giờ với tin nhắn


3

Sử dụng python: python -c "import os;print os.stat('.git/FETCH_HEAD').st_mtime"


cần một số định dạng, nhưng một câu trả lời hoàn toàn hợp lệ cho freebsd trong đó stat không hoạt động theo cách được mô tả ở trên.
Endre

2
python -c "import os, datetime ;print datetime.datetime.fromtimestamp(os.stat('.git/FETCH_HEAD').st_mtime)"

hoặc là

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

1

Giải pháp Bash nền tảng chéo (OSX / Linux)

Được truyền cảm hứng rất nhiều từ @smoovescâu trả lời: https://stackoverflow.com/a/9229377/622276 và nhận xét.

Nhưng tôi đang duy trì tích hợp git nhắc bash của riêng mình

Với nguồn tại đây: https://github.com/neozenith/dotfiles/blob/master/bash-scripts/ Chức năng_parse_git_prompt.sh

msys phiên bản trong Git Bash dành cho Windows hoạt động giống với phiên bản linux.

Tôi đang biên soạn các tùy chọn nền tảng chéo thành một tuyên bố tình huống. Vì vậy, nó sẽ phân nhánh một quy trình tìm nạp trên bất kỳ git repo nào mà tôi điều hướng vào đó cũ hơn mười lăm phút kể từ lần tìm nạp cuối cùng để phần còn lại của tập lệnh nhắc của tôi biết liệu tôi có nội dung cần kéo hay không.

Git radar đã từng làm điều này nhưng nó yêu cầu lưu một tệp có dấu thời gian về thời điểm lần tìm nạp cuối cùng được gọi. Điều này không ghi tệp tạm thời.

git rev-parse --show-toplevelchỉ có nghĩa là nếu tôi ở bất kỳ đâu trong repo git, nó sẽ lấy gốc repo để chúng tôi có thể tham khảo .gitđường dẫn thư mục.

# 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

Đây là một trình bao bọc git nhỏ. Cài đặt nó với tên gitvà với quyền chmod a+x git. Sau đó thêm last_successful_fetchvào .git/info/exclude.

Khi bạn muốn xem kết quả, hãy sử dụng 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

Theo đề xuất của người dùng: https://stackoverflow.com/users/83646/smoove , bạn có thể tìm thời điểm git pull được gọi lần cuối trên repo bằng cách kiểm tra dấu thời gian sửa đổi của: .git / FETCH_HEAD as: git write the .git / FETCH_HEAD tệp mỗi khi bạn kéo hoặc tìm nạp, ngay cả khi không có gì để kéo.

Ví dụ: {master} dấmgupt @ bhling69 (/imsgit_local/work/vinegupt/ims_18.5a/ims_common) $ stat -c% y .git / FETCH_HEAD

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


Fo OSX 10.9.5 Tôi cần làm điều này: stat -f %Sm .git/FETCH_HEADnhưng dường như hoạt động tốt đối với tôi.
Josh

Bạn nên tán thành câu trả lời của @ Smoove thay vì sao chép / dán nó vào "câu trả lời" của riêng bạn.
bfontaine
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.