特定のコミットのプッシュ日付を取得する方法はgitにありますか?


91

各コミットに関連付けられたプッシュ日付をgitログで表示する方法があるかどうか疑問に思っています。それが不可能な場合、特定のプッシュですべてのコミットを確認する方法はありますか?

プッシュされたコミットを追跡する必要があるプログラムを書いています。gitログはプッシュ日付ではなくコミット日付順になっているため、プッシュされた最新のコミットを確認できません。たとえば、ユーザーがマスターにプッシュする2日前にローカルリポジトリにコミットした場合、そのコミットはマスターリポジトリログの他のコミットの2日間遅れて配置されます。

回答:


77

ばらばらの情報を集めて、ようやくこの質問に対する最良の答えを見つけるのに、めちゃくちゃ長い時間がかかりましたが、今ではわかっています。たった2行で、コードもフックもありません。

# required for a bare repo
git config core.logAllRefUpdates true

git reflog --date=local master

ついにシンプルに。

警告:とのデフォルト値をオーバーライドしたい場合がgc.reflogExpireありgc.reflogExpireUnreachableます。git help reflog詳細を確認し、これがどのように、なぜ機能するかを理解してください。

上記の2つのコマンドは、プッシュ先のクローン内で実行する必要があります。それができない場合、近似は別の、で実行する永久クローン:

git fetch               origin        # often and *regularly*
git reflog --date=local origin/master

この永久クローンを削除しないでください。削除すると日付が失われます。


2
私の場合、プッシュのリストを表示するために実行する必要があったgit reflog --date=local origin/master(注origin/)ことを追加したいと思います。それ以外の場合は、コミット、チェックアウト、プルのみがリストに含まれていました(これも便利です)。実際、@ JonathanDayの回答で指摘されました。
NIA 2013年

@NIA:origin / masterは概算のみを提供します。私はあなたのコメントに続いて私の答えを更新しました、これは明確ですか?
MarcH 2013年

37

Gitは分散バージョン管理システムであるため、「プッシュ日付」によって何を意味するかを慎重に定義する必要があります。たとえば、ユーザーAがいくつかのコミットをユーザーBのリポジトリにプッシュするとします。しばらくして、ユーザーBは同じコミットを3番目のリポジトリにプッシュします。どの日付に興味がありますか?

共有リポジトリがあり、その共有リポジトリのユーザーが何かがリポジトリにいつ公開されたかを判断できるようにしたいと思っています。それが本当の場合は、共有リポジトリでその情報を収集する必要があります。

悪い知らせ

残念ながら、コミットメッセージに日付を追加する方法はありません。これにより、コミットID(コンテンツのSHA1ハッシュ)が変更され、あらゆる種類の問題が発生します。

良いニュース

幸い、Gitには(比較的新しい)notesという機能があります。この機能を使用すると、git log表示可能なコミットに任意のテキストを添付できます。メモは編集して他のユーザーと共有できます。

メモ機能を使用して、「このコミットは[日付]に受信されました」というメッセージを、共有リポジトリによって受信された各コミットに添付できます。

詳細git help notesについては、を参照してください。

日付を記録する方法

ここに私がお勧めするアプローチがあります:

  1. post-receive共有リポジトリのフックを変更して、更新された参照ごとに新しく到達可能な各コミットをウォークします。
  2. コミットごとに、「[user] of [repository_url] added to this commit to [ref] on [date]」のようなものをコミットのメモに追加します。

    refs/notes/received-onデフォルトではなく、この目的に特化したノート参照(など)を使用することもできますrefs/notes/commits。これにより、他の目的で作成されたメモとの競合を防ぐことができます。

  3. receiveフックを変更して、ノート参照の更新を拒否します(ユーザーが誤ってまたは意図的にノートをいじらないようにします)。
  4. すべてのユーザーに、作業ツリー内から次のコマンドを実行するように伝えます。

    # Fetch all notes from the shared repository.
    # Assumes the shared repository remote is named 'origin'.
    git config --add remote.origin.fetch '+refs/notes/*:refs/remote-notes/origin/*'
    
    # Show all notes from the shared repository when running 'git log'
    git config --add notes.displayRef 'refs/remote-notes/origin/*'
    

    Gitはデフォルトでアップストリームリポジトリの非ブランチ、非タグ参照を無視するため、この手順が必要です。

上記は、参照が高度なものであり、削除または強制更新されないことを前提としています。post-receiveこれらのケースを処理するために、フックに「[日付]に削除された」というメモを追加することもできます。


私は私のブログであなたのアイデアを使用しましたmnaoumov.wordpress.com/2013/01/31/git-get-push-date
mnaoumov

7
git reflog show origin/master --pretty='%h %gd %gs %s' --date=iso

これは私にはかなりうまくいくようです。コミッター日付(%cd)は必ずしもプッシュ日付と同じではないため、誤解を招く可能性があります。--date = isoオプションは、プッシュ/フェッチ日付を出力します

origin / masterからフェッチした場合は、フェッチした日付が出力されます。他の誰かがコミットをプッシュした日付ではありません。

 - %h:  abrev. hash
 - %gd: human readable reflog selector
 - %gs: reflog subject
 - %s:  subject/commit message

おまけ:もちろん、もっときれいなフォーマットをすることができます。これまでのところ、私はこの色分けが好きです。入力するのは少し大変です。これは、SHAを赤に、reflogセレクターをシアンに、reflogを緑に出力します。

git reflog show origin/master --pretty='format:%C(red)%h%Creset %C(cyan)%gd%Creset %C(green)%gs%Creset: %s' --date=iso

こんにちはVCは、コマンド「reflog show origin / master --pretty = '%Cred%h%Creset-%C(yellow)%gd%Creset%Cblue(%gs)%Creset%s'- -date = iso "は" da4c192cd -origin / master @ {2019-02-07 08:13:40 +0100}(プル:早送り)JIRA-2542拡張テストレポート "であり、ブランチJIRAのコンテンツを意味します-2542は、2019-02-07 08:13:40にfast-frowardを介してorigin / masterにマージされましたか?
Simon、

こんにちは、サイモン、はい。あなたはあなたのブランチでgit pullを行い、その時点でそれは早送りによってorigin / masterにマージされました。
VC

それは作者のリポジトリでのみ動作します。リポジトリのクローンを作成すると、値が空になります。他人のプッシュタイムは見えません。
ラムウィン

6

を見てくださいgit reflog show master。おそらくあなたが望む正確なフォーマットではありませんが、あなたを正しい方向に向けるべきです。

別のアイデアは、プッシュフック内でスクリプトを実行することです。


プッシュフックを実行することを考えたが、それは最後の溝の努力でなければならないようです。フックを使用すると、すべてのユーザーがそれぞれのリポジトリでそのフックを使用する必要があるようです。あなたはより具体的にできますgit reflog show masterか?すべてのユーザーの個々のコミットのプッシュ日付を表示できるようにしたい。
justkikuchi

git reflogは、実行したリポジトリの変更の順序を示します。日付を直接取得する方法があるかどうかはわかりませんが.git/logs/refs/heads/master、タイムスタンプが表示されます。
カールビーレフェルト

3
フックについては、あなたがプッシュし、マシン上で実行するフックが受信されているにを。プッシュは特定のレポに関連しているだけなので、実行したい特定の「祝福された」レポがあると想定しています。同じことがgit reflogそのことについても言えます。
カールビーレフェルト

5

リモートでreflogを検査することに関するこの回答は、ブランチがプッシュされた情報を提供することで役立つ場合があります(https://stackoverflow.com/a/8791295/336905)。プッシュされたコミットは表示されませんが、ローカルコミット日後の次のプッシュを見つけることで相互相関できます。間違いないわけではありませんが、以前に投稿された@RichardHansenからの優れたメモの提案をまだ実装していない場合は便利です。


1
reflog of origin/branch現在のマシンで行われた変更のみを表示することに注意してください。これは非常に便利です!日常的な使用ではフックを実装したくないので、簡単な質問「うーん、先週コミットをプッシュしたのはいつですか?」—それは素晴らしい働きをします。
NIA 2013年

4

サーバー自体のgitリポジトリの「objects」ディレクトリにあるコミットオブジェクトファイルのファイル変更時刻を確認することもできます。


2

git AuthorDateがCommitDateと異なるのはなぜですか?

  • AuthorDate コミットが最初に作成されたときです。
  • CommitDate コミットが最後に変更されたときです(例:リベース)。

あなたは--prettyフォーマットオプションでそれらを得ることができます:

       o    %cd: committer date
       o    %cD: committer date, RFC2822 style
       o    %cr: committer date, relative
       o    %ct: committer date, UNIX timestamp
       o    %ci: committer date, ISO 8601 format

そのため、あなたや他の開発者がgit rebase以前git pushにやっていたら、最終的には作成者の日付より後のコミット日付になります

次のコマンドは、コミット日を示しています。 git log --pretty=fuller


1

次の表記を使用してプッシュ日付を取得できると思います:git log -g --date = local

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