如何检查最近执行的“ git pull”的日期和时间?


Answers:


27

git show命令显示最近提交的日期。这不是将提交拉到本地存储库的日期,但是Git不会保留此类拉取信息。

您也许可以使用服务器上文件的ctime(创建时间)来查找上次提取的时间。例如:

ls -lct

显示每个文件的ctime,以最新的优先顺序排序。


18
这不能回答问题-请参阅下面的smoove回答。
Wilfred Hughes

1
git show显示当前分支的尖端提交的日期,这不一定是回购中的最新提交,更不用说最新获取/拉取的日期了。我还建议检查smoove的答案。
Stefaan,2012年

3
我不敢苟同。这确实回答了问题。虽然它没有提供最新拉取的日期,但确实提供了上次拉取时的最新提交日期。对于原始问题中的用例,这是非常合适的。您想知道何时最后一次通过git pull更新服务器上的代码,即服务器上当前是哪个版本的代码。git show告诉您本地克隆位于哪个提交。(我知道这很旧了,但我最终还是通过搜索找到了。)
Dietmar,2017年

149
stat -c %Y .git/FETCH_HEAD

将为您提供该文件的最后修改的Unix时间戳。即使没有东西要拉,Git也会在每次拉或取时写入FETCH_HEAD文件。


17
在OSX上修改时间的Unix时间戳:stat -f '%m' .git/FETCH_HEAD
jpillora

18
Git 在实际的获取/拉取之前写入FETCH_HEAD ...因此,如果拉取失败或被取消,则FETCH_HEAD将不代表实际的存储库状态。当原始存储库URL不起作用时,这尤其成问题,因为每次拉动都会失败,但是每次尝试都会更新FETCH_HEAD。
rustyx 2014年

9
在OS X上修改时间的日期:stat -f '%Sm' $(git rev-parse --show-toplevel)/.git/FETCH_HEAD
Colin vH 2015年

7
您还可以检查从远程分支.git/refs/heads/master传入的更改git pull导致时间戳更改master,但是在git pull报告没有更改时时间戳不会更改。
Malvineous

6
对于在脚本中使用此命令的任何人:如果尚未完成获取或提取操作,则FETCH_HEAD将不存在,并且stat将返回退出代码
1。– MajicBob

43

凭直觉,我尝试了“ 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)

请注意。-c不是statMac 的有效选项。
亚伯·卡莱霍

10

在非裸仓库(对于而言,裸仓库没有意义git pull),git将所有对分支提示的更改和当前分支构想记录在中的“ reflogs”中.git/logs。您可以使用查看这些git log -g

但是,尽管日志文件确实带有时间戳,但似乎不会git log -g打印出来。但是,.git/logs/HEAD例如,如果您看一下,您会发现该格式非常易于解析-它由ref(或HEAD)的更改,更改,更改者,时间以及活动消息组成。


5
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

跨平台(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语句。因此,它将在我导航到的任何git存储库中派生一个获取过程,该过程距上一次获取已超过15分钟,因此其余提示脚本会知道我是否有东西要提取。

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 / FETCH_HEAD的修改时间戳来查找上次在回购上调用git pull的时间,因为: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


Fo OSX 10.9.5我需要这样做:stat -f %Sm .git/FETCH_HEAD但是似乎对我来说很好。
乔什

您应该投票@smoove的答案,而不是将其复制/粘贴到自己的“答案”中。
bfontaine
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.