git log --sinceはどのようにカウントされますか?


85

いくつかのコミットがある単純なテストリポジトリがあり、日付と時刻のフィルタリングされたログを確認したい:

$ git log --author = "automatix" --since = "2013-01-30" --pretty --test
コミットea0719bef142659fa561c9d040b2120012ed0184
日付:2013年1月31日木曜日02:03:12 +0100

コミットab4a8387bc4d9bdb4f67212df77eb1fc3d8b6304
日付:2013年1月31日木曜日01:59:11 +0100

コミットa0b027beba2cd03571bb9475b9db9542f8efe990
日付:2013年1月31日木曜日01:50:38 +0100

add77c8fe2ba9254c11b98e14facede3420dc51cをコミットします
日付:2013年1月31日木曜日01:48:34 +0100

コミットe6e323c05d37c74fcabeb9186b95c0d49b862e6f
日付:2013年1月31日木曜日01:46:27 +0100

コミット8c286391e54d3fc1e210950b1320fd6f013a8f84
日付:2013年1月31日木曜日01:41:27 +0100

コミット9c880595e57f717383796fa2940f41f0f42f7e2a
日付:2013年1月31日木曜日01:38:17 +0100

コミットa95527f36a533e1ecba1aadceea31a9dcbe1a8db
日付:2013年1月31日木曜日01:30:00 +0100

最初に選択されたコミットはa95527f36a533e1ecba1aadceea31a9dcbe1a8dbから2013-01-30 01:30:00です。8つのコミットが選択されています:

$ git log --author = "automatix" --since = "2013-01-30" --format = oneline --test | トイレ
      8 34 498

OK。今私は以来選択します2013-01-31

$ git log --author = "automatix" --since = "2013-01-31" --format = oneline --test | トイレ
      0 0 0

何?わかりました、それはsinceルールが開始日のコミットを除外することを意味するはずです。正しい?

しかし、続けましょう:

$ git log --author = "automatix" --since = "2013-01-31 01:30:00" --pretty --test
コミットea0719bef142659fa561c9d040b2120012ed0184
日付:2013年1月31日木曜日02:03:12 +0100

コミットab4a8387bc4d9bdb4f67212df77eb1fc3d8b6304
日付:2013年1月31日木曜日01:59:11 +0100

コミットa0b027beba2cd03571bb9475b9db9542f8efe990
日付:2013年1月31日木曜日01:50:38 +0100

add77c8fe2ba9254c11b98e14facede3420dc51cをコミットします
日付:2013年1月31日木曜日01:48:34 +0100

コミットe6e323c05d37c74fcabeb9186b95c0d49b862e6f
日付:2013年1月31日木曜日01:46:27 +0100

コミット8c286391e54d3fc1e210950b1320fd6f013a8f84
日付:2013年1月31日木曜日01:41:27 +0100

コミット9c880595e57f717383796fa2940f41f0f42f7e2a
日付:2013年1月31日木曜日01:38:17 +0100

コミットa95527f36a533e1ecba1aadceea31a9dcbe1a8db
日付:2013年1月31日木曜日01:30:00 +0100
$ git log --author = "automatix" --since = "2013-01-31 01:30:00" --format = oneline --test | トイレ
      8 34 498

これで、starttimeも記述しているときに、starttimeのコミットが含まれています。

論理がわかりません。誰かが説明できますか、なぜそれがとても奇妙に機能するのですか?

ありがとう


1
非常に興味深いことです。時間のない日付だけを指定すると、デフォルトでその日の最後の1秒になりますが、それは私が突き刺していることです。これを投稿していただきありがとうございます。とても興味深い!
ilan berci 2013年

1
はい、そう思われるので、時間がない場合、デフォルトでその日の最後の1秒になります。スタンジですが、問題ありません。しかし、秒のない時間が提供されている場合、Gitは結果として同じことを行う必要があります。したがって、 git log --author="automatix" --since="2013-01-31 01:30" --pretty -- test コンテンツ7がコミットする必要があります。ただし、内容は8です。 git log --author="automatix" --since="2013-01-31 01:30" --format=oneline -- test | wc=> 8 34 498
automatix

同意しません。「…月曜日の後に起こった」と言うときは、「月曜日の最後の1秒後に起こった」という意味です。「月曜日」は24時間の期間を表します。「9時以降に発生した」とは、「9:00:00.0000以降に発生した」という意味ですが、「9時」は1つの時点であり、期間ではありません。Gitの解釈が最も理にかなっています。
クロニアル2013年

2
それは良い点です。このロジックは「after」でのみ機能し、「since」では機能しません。しかし、Gitでは、キーワード「since」と「after」は同義語です(言語的には汚いと思います)。git-scm.com/book/en/...
Automatixの

回答:


138

私のようにここに着陸した他の誰かを助ける場合は、少し調べてみると、ISO8601形式を使用しても機能することがわかりました。

git log --since="2014-02-12T16:36:00-07:00"

これにより、秒単位の精度が得られます。注:次のものも使用できます。

git log --after="2014-02-12T16:36:00-07:00"
git log --before="2014-02-12T16:36:00-07:00"
git log --since="1 month ago"
git log --since="2 weeks 3 days 2 hours 30 minutes 59 seconds ago"

もちろん、これは「なぜそれがそれほど奇妙に機能するのかを説明する」ものではありません。しかし、それは確かに私にとって問題を解決しました。


編集:

もう少し調べて
みると、「なぜこれほど奇妙に機能するのか」がわかりました。日付形式を指定しない場合、gitlogはデフォルトで作成者のタイムゾーンまたはコミット日付のいずれかになります。。これは、一貫した動作を意味するため、便利です。次のようなもので日付形式を明示的に宣言します。

git log --date=local

最後に、時間を指定しない場合、コマンドを実行したときのデフォルトの現地時間になります。

簡単に言えば、具体的にすることで問題を解決できるはずです。

git log --date=local --after="2014-02-12T16:36:00-07:00"

また、次のコマンドを使用して、デフォルトの日付形式を永続的に設定できます。

git config log.date local

次のいずれかの値を使用できます。 (relative|local|default|iso|rfc|short|raw)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.