如何查看最近执行的`git pull`的日期和时间?

问题描述 投票:0回答:13

如何查看最近执行的

git pull
的日期和时间?当出现问题时,我经常需要知道服务器上的代码何时发生更改。

git git-pull
13个回答
175
投票
stat -c %Y .git/FETCH_HEAD

将为您提供该文件最后一次修改的 unix 时间戳。 每次拉取或获取时,Git 都会写入 FETCH_HEAD 文件,即使没有任何内容可拉取。


67
投票

凭直觉,我尝试了“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
到 ~/.gitconfig 文件中的
[alias]
部分(通过在任何 git 存储库中运行以下命令行来自动执行此操作是最安全的)

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


38
投票

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

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

ls -lct

显示每个文件的 ctime,按最新的排在最前面。


13
投票
git show -1 --stat  

此 git 命令显示最新更改提交时间和日期以及消息


12
投票

在非裸存储库中(裸存储库对于

git pull
没有意义),git 将所有对分支提示的更改和当前分支想法记录在
.git/logs
中的“reflogs”中。您可以使用
git log -g
查看这些内容。

但是,虽然日志文件确实有时间戳,但

git log -g
似乎不会打印它。但是,例如,如果您看一下
.git/logs/HEAD
,您会发现该格式非常易于解析 - 它由 ref(或 HEAD)更改自、更改为、谁更改、何时更改以及活动讯息。


3
投票

跨平台 (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

Windows 版 Git Bash 中的

msys
版本与 Linux 版本的工作方式相同。

我正在将跨平台选项编译成案例陈述。因此,它将在我导航到的任何 git 存储库上分叉一个提取过程,该过程自上次提取以来已经超过十五分钟,这样我的提示脚本的其余部分就知道我是否有东西要提取。

Git Radar 曾经这样做过,但它需要保存一个文件,其中包含上次调用时的时间戳。这不会写入临时文件。

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

3
投票

使用Python:

$ python3 -c "import os; print(os.stat('.git/FETCH_HEAD').st_mtime)"`
1716489746.8263276

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
投票

这是一个小的 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 <[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]

0
投票

根据用户的建议: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


0
投票

就我而言,我必须返回以获取倒数第二个拉取(前一个),因此使用了此 reflog 命令,请注意,reflog 默认在 90 天后过期。希望这对某人有帮助。

 master ± -> git reflog --date=iso|grep pull
67718cc11 HEAD@{2022-01-25 10:14:31 +0530}: pull: Fast-forward
9bb64364a HEAD@{2021-12-13 18:22:17 +0530}: pull: Fast-forward
f5cf7c887 HEAD@{2021-11-29 13:08:14 +0530}: pull: Fast-forward

然后您可以签出该哈希并创建一个分支。 (在下面的命令中分离头部)

git checkout 9bb64364a 

0
投票

为什么不使用最简单的

ls -l .git/FETCH_HEAD 

只要不到1岁就可以使用
并且您只需要日期(时间 hh:mm 仅在不到 1 天时显示)

应该适用于任何操作系统(系统)、任何具有任何 shell 的 FS(文件系统)
除非有人在 .git 文件夹中搞砸了

顺便说一句, ls -c 可以使用 statuschangedatetime 来排序和/或打印 不是 creation 日期时间(在某些情况下可能匹配)。
男人l
-c 使用文件状态上次更改的时间进行排序或打印。

© www.soinside.com 2019 - 2024. All rights reserved.