106

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

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

4

8 に答える 8

84

散らばった情報を収集し、最終的にこの質問に対する最良の答えを見つけるのに非常に長い時間がかかりましたが、今ではそれを持っていることがわかりました. わずか 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

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

于 2012-10-03T08:36:53.510 に答える
39

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

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

悪いニュース

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

良いニュース

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

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

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

日付の書き方

私がお勧めするアプローチは次のとおりです。

  1. post-receive共有リポジトリのフックを変更して、更新された参照ごとに新しく到達可能な各コミットを実行します。
  2. コミットごとに、「[repository_url] の [user] が [date] にこのコミットを [ref] に追加しました」などをコミットのメモに追加します。

    refs/notes/received-onデフォルトの の代わりに、この目的専用の notes ref ( など) を使用することもできます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これらのケースを処理するために、フックに「[date] に削除されました」というメモも追加することをお勧めします。

于 2011-07-23T07:42:03.850 に答える
5

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

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

于 2011-07-22T20:17:56.047 に答える
5

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

于 2013-02-04T03:38:51.243 に答える
4

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

于 2014-11-24T12:20:45.343 に答える
1

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

于 2014-10-09T14:29:54.993 に答える