web-dev-qa-db-ja.com

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

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

83
Chirag Patel

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

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

ls -lct

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

21
Greg Hewgill
stat -c %Y .git/FETCH_HEAD

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

132
smoove

ちょっと考えて、「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。]

31
Paul McMullin

非ベアリポジトリ(およびベアリポジトリはgit pullに対して意味をなさない)では、gitはブランチヒントと現在のブランチのアイデアに対するすべての変更を.git/logsの "reflogs"に記録します。これらはgit log -gを使用して表示できます。

ただし、ログファイルにはタイムスタンプがありますが、git log -gが出力するようには見えません。ただし、たとえば.git/logs/HEADを見ると、フォーマットの解析が非常に簡単であることがわかります。これは、ref(またはHEAD)の変更元、変更後、変更者、アクティビティメッセージ。

9
araqnid
git show -1 --stat  

このgitコマンドは、最新の変更のコミット日時をメッセージとともに表示します

2
sachin_ur
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
RedEyed

Pythonを使用:python -c "import os;print os.stat('.git/FETCH_HEAD').st_mtime"

1
widerin
$ # 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
1.61803

クロスプラットフォーム(OSX/Linux)Bashソリューション

@smooves回答: https://stackoverflow.com/a/9229377/622276 およびコメント。

しかし、私は自分自身を維持しています bash Prompt git integration

ここにソースがあります: https://github.com/neozenith/dotfiles/blob/master/bash-scripts/function_parse_git_Prompt.sh

Git Bash for Windowsのmsysバージョンは、Linuxバージョンと同じように機能します。

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

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
0
Josh Peak