実行された最新の「git pull」の日時を確認するにはどうすればよいですか?


91

git pull実行された最新の日時を確認するにはどうすればよいですか?何か問題が発生したときに、サーバー上のコードがいつ変更されたかを頻繁に知る必要があります。

回答:


27

このgit showコマンドは、最新のコミットの日付を表示します。これは、コミットがローカルリポジトリにプルされた日付ではありませんが、Gitはそのようなプル情報を保持しません。

サーバー上のファイルのctime(作成時間)を使用して、最後のプルの時間を見つけることができる場合があります。例えば:

ls -lct

各ファイルのctimeを、最新のものから順に表示します。


18
これは質問には答えません-以下のsmooveの答えを参照してください。
Wilfred Hughes

1
git show現在のブランチのチップコミットの日付を示します。これは、最新のフェッチ/プルの日付はもちろんのこと、リポジトリの最新のコミットである必要はありません。また、smooveの回答を確認することをお勧めします。
Stefaan

3
失礼ですが同意できません。これは質問に答えます。最新のプルの日付は表示されませんが、最後にプルしたときの最新のコミットの日付が表示されます。元の質問のユースケースでは、これは完全に適しています。git pullを介してサーバー上のコードを最後に更新したのはいつか、つまり、現在サーバー上にあるコードのバージョンを知りたいとします。git showローカルクローンがどのコミットにあるかを通知します。(私はこれが古いことを知っていますが、検索によってここに
Dietmar '21

149
stat -c %Y .git/FETCH_HEAD

そのファイルの最終変更のUNIXタイムスタンプを提供します。プルするものがない場合でも、プルまたはフェッチするたびにGitはFETCH_HEADファイルを書き込みます。


17
OSXでの変更時刻のUnixタイムスタンプ:stat -f '%m' .git/FETCH_HEAD
jpillora 2013

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

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

さらに、あなたが追加することができます when = !stat -c %y .git/FETCH_HEAD[alias]、あなたの〜/ .gitconfigファイルのセクション(それはどんな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。]


3
これが最も役立つ答えです。
アルン

ただのメモ。-cstatMac用の有効なオプションではありません。
アベルCallejo

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"


いくつかのフォーマットが必要ですが、statが上記の方法で機能しないfreebsdに対して完全に有効な答えです。
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 Git Bash for Windowsのバージョンは、Linuxバージョンと同じように機能します。

クロスプラットフォームオプションをケースステートメントにコンパイルしています。したがって、最後にフェッチしてから15分以上経過している、私がナビゲートするgitリポジトリのフェッチプロセスがフォークされるため、残りのプロンプトスクリプトは、プルするものがあるかどうかを認識します。

Gitレーダーはこれに慣れていましたが、最後のフェッチが呼び出されたときのタイムスタンプを含むファイルを保存する必要がありました。これは一時ファイルを書き込みません。

git rev-parse --show-toplevelちょうど私がgit repoのどこかにいる場合、それはrepoルートを取得するので、.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が最後にリポで呼び出されたのは、.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


Fo OSX 10.9.5私はこれを行う必要がありましたstat -f %Sm .git/FETCH_HEADが、私にはうまく機能しているようです。
ジョシュ

@smooveの回答を自分の「回答」にコピー/貼り付けるのではなく、賛成投票する必要があります。
bfontaine
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.