최근에 실행 된`git pull`의 날짜와 시간을 어떻게 확인하나요?


91

최근 git pull에 실행 된 날짜와 시간을 어떻게 확인 합니까? 뭔가 잘못되었을 때 서버에서 코드가 언제 변경되었는지 자주 알아야합니다.

답변:


28

git show명령은 가장 최근 커밋 날짜를 보여줍니다. 이것은 커밋이 로컬 저장소로 가져온 날짜가 아니지만 Git은 이러한 가져 오기 정보를 유지하지 않습니다.

서버에있는 파일의 ctime (생성 시간)을 사용하여 마지막 풀 시간을 찾을 수 있습니다. 예를 들면 :

ls -lct

가장 최근의 순서로 정렬 된 각 파일의 ctime을 표시합니다.


18
이것은 질문에 대한 답변이 아닙니다. 아래 smoove의 답변을 참조하십시오.
Wilfred Hughes

1
git show현재 브랜치의 팁 커밋 날짜를 보여줍니다. 이는 최신 가져 오기 / 풀 날짜는 말할 것도없고 저장소의 가장 최근 커밋 일 필요는 없습니다. 나는 또한 smoove의 대답을 확인하는 것이 좋습니다.
Stefaan 2012 년

3
나는 다를 것을 간청한다. 이것은 질문에 대한 대답입니다. 최근 풀 날짜는 제공하지 않지만 마지막으로 풀링했을 때 가장 최근의 커밋 날짜를 제공합니다. 원래 질문의 사용 사례의 경우 이것은 완벽하게 적합합니다. git pull을 통해 서버의 코드를 마지막으로 업데이트 한시기, 즉 현재 서버에있는 코드 버전을 알고 싶습니다. git show로컬 클론이있는 커밋을 알려줍니다. (나는 이것이 오래
Dietmar

151
stat -c %Y .git/FETCH_HEAD

해당 파일의 마지막 수정에 대한 유닉스 타임 스탬프를 제공합니다. Git은 가져올 것이 없더라도 가져 오거나 가져올 때마다 FETCH_HEAD 파일을 작성합니다.


17
OSX에서 수정 된 시간의 Unix 타임 스탬프 :stat -f '%m' .git/FETCH_HEAD
jpillora

18
Git은 실제 가져 오기 / 가져 오기 전에 FETCH_HEAD 씁니다 . 따라서 가져 오기가 실패하거나 취소 된 경우 FETCH_HEAD는 실제 저장소 상태를 나타내지 않습니다. 이는 모든 가져 오기가 실패하지만 FETCH_HEAD가 모든 시도에서 업데이트되므로 원래 repo URL이 작동하지 않을 때 특히 문제가됩니다.
rustyx

9
OS X에서 수정 된 시간 날짜 :stat -f '%Sm' $(git rev-parse --show-toplevel)/.git/FETCH_HEAD
Colin vH

7
또한 원격 지점 에서 변경 사항이 들어올 .git/refs/heads/master때 타임 스탬프가 변경되는 것을 확인할 수도 있지만 변경 사항이 보고 되지 않으면 타임 스탬프가 변경되지 않습니다 . git pullmastergit 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

또한 ~ / .gitconfig 파일 when = !stat -c %y .git/FETCH_HEAD[alias]섹션에 추가 할 수 있습니다 (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.]


3
이것이 가장 유용한 답변입니다!
Arun 19

메모입니다. Mac -cstat대한 유효한 옵션이 아닙니다 .
Abel Callejo

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 -c "import os;print os.stat('.git/FETCH_HEAD').st_mtime"


일부 형식이 필요하지만 stat가 위에서 설명한 방식으로 작동하지 않는 freebsd에 대한 완전히 유효한 대답이 필요합니다.
Endre dec

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

크로스 플랫폼 (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 Windows 용 Git Bash의 버전은 Linux 버전과 동일하게 작동합니다.

크로스 플랫폼 옵션을 case 문으로 컴파일하고 있습니다. 따라서 마지막 가져 오기 이후 15 분이 지난 모든 git repo에서 가져 오기 프로세스를 포크하므로 나머지 프롬프트 스크립트는 가져올 항목이 있는지 알 수 있습니다.

Git 레이더는 여기에 사용되었지만 마지막 가져 오기가 호출 된 타임 스탬프와 함께 파일을 저장해야했습니다. 이것은 임시 파일을 쓰지 않습니다.

git rev-parse --show-toplevel단지 내가 git repo의 어느 곳에 있든 .git폴더 경로를 참조 할 수 있도록 repo 루트를 얻을 수 있다는 뜻 입니다.

# 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 / FETCH_HEAD의 수정 타임 스탬프를 확인하여 저장소에서 git pull이 마지막으로 호출 된시기를 찾을 수 있습니다. .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


Fo OSX 10.9.5이 작업이 필요 stat -f %Sm .git/FETCH_HEAD했지만 잘 작동하는 것 같습니다.
Josh

자신의 "답변"에 복사 / 붙여 넣기 대신 @smoove의 답변을 찬성해야합니다.
bfontaine
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.