実行されたgit pull
の最新の日時を確認するにはどうすればよいですか?何か問題が発生したときに、サーバー上でコードがいつ変更されたかを頻繁に知る必要があります。
git show
コマンドは、最新のコミットの日付を表示します。これは、コミットがローカルリポジトリにプルされた日付ではありませんが、Gitはそのようなプル情報を保持しません。
サーバー上のファイルのctime(作成時刻)を使用して、最後のプルの時刻を見つけることができる場合があります。例えば:
ls -lct
は、各ファイルのctimeを最新のものから順に表示します。
stat -c %Y .git/FETCH_HEAD
そのファイルの最終変更のUNIXタイムスタンプを提供します。 Gitは、プルするものがなくても、プルまたはフェッチするたびにFETCH_HEADファイルを書き込みます。
ちょっと考えて、「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。]
非ベアリポジトリ(およびベアリポジトリはgit pull
に対して意味をなさない)では、gitはブランチヒントと現在のブランチのアイデアに対するすべての変更を.git/logs
の "reflogs"に記録します。これらはgit log -g
を使用して表示できます。
ただし、ログファイルにはタイムスタンプがありますが、git log -g
が出力するようには見えません。ただし、たとえば.git/logs/HEAD
を見ると、フォーマットの解析が非常に簡単であることがわかります。これは、ref(またはHEAD)の変更元、変更後、変更者、アクティビティメッセージ。
git show -1 --stat
このgitコマンドは、最新の変更のコミット日時をメッセージとともに表示します
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))"
Pythonを使用:python -c "import os;print os.stat('.git/FETCH_HEAD').st_mtime"
$ # 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]
@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