Gitログで各コミットに関連付けられたプッシュ日付を表示する方法があるかどうか疑問に思っています。それが不可能な場合、特定のプッシュですべてのコミットを確認する方法はありますか。
プッシュされたコミットを追跡する必要があるプログラムを作成します。 gitログは、プッシュ日付ではなくコミット日付順に並べられているため、プッシュされた最新のコミットを確認できません。たとえば、ユーザーがマスターにプッシュする2日前にローカルリポジトリにコミットすると、そのコミットはマスターリポジトリログ内の他の2日間のコミットの背後に配置されます。
散らばった情報を収集し、最終的にこの質問に対する最良の答えを見つけるのに非常に長い時間がかかりましたが、今ではそれを知っています。わずか2行で、コードもフックもありません。
# required for a bare repo
git config core.logAllRefUpdates true
git reflog --date=local master
ついにシンプル。
警告:おそらくデフォルト値のgc.reflogExpire
およびgc.reflogExpireUnreachable
。チェックgit help reflog
詳細と、これが機能する方法と理由を理解するため。
上記の2つのコマンドを実行する必要がありますプッシュするクローン内。それが不可能な場合、approximationを別の場所で実行しますpermanent clone:
git fetch Origin # often and *regularly*
git reflog --date=local Origin/master
この永久クローンを削除しないと、日付が失われます。
Gitは分散バージョン管理システムであるため、「プッシュ日付」の意味を慎重に定義する必要があります。たとえば、ユーザーAがユーザーBのリポジトリにいくつかのコミットをプッシュするとします。しばらくして、ユーザーBが同じコミットを3番目のリポジトリにプッシュします。どの日付に興味がありますか?
共有リポジトリがあり、その共有リポジトリのユーザーが何かがリポジトリに公開されたときを判断できるようにしたいと思っています。その場合は、共有リポジトリでその情報を収集する必要があります。
残念ながら、コミットメッセージに日付を追加する方法はありません。これにより、コミットID(コンテンツのSHA1ハッシュ)が変更され、あらゆる種類の問題が発生します。
幸いなことに、Gitにはnotesと呼ばれる(比較的新しい)機能があります。この機能により、任意のテキストをコミットに添付して、_git log
_で表示できます。メモは編集して他の人と共有できます。
メモ機能を使用して、共有リポジトリが受信した各コミットに「このコミットは[日付]に受信されました」というメッセージを添付できます。
詳細については、_git help notes
_を参照してください。
私が推奨するアプローチは次のとおりです。
post-receive
_フックを変更して、更新された参照ごとに新しく到達可能な各コミットを調べます。コミットごとに、「[repository_url]の[user]が[date]に[ref]にこのコミットを追加した」などの内容をコミットのメモに追加します。
デフォルトの_refs/notes/received-on
_の代わりに、この目的専用のメモ参照(_refs/notes/commits
_など)を使用できます。これにより、他の目的のために作成されたノートとの競合が防止されます。
receive
フックを変更して、ノート参照の更新を拒否します(ユーザーが誤ってまたは意図的にノートを操作しないようにします)。すべてのユーザーに、作業ツリー内から次のコマンドを実行するように指示します。
_# 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
_フックにこれらのケースを処理するために「[日付]に削除」のメモを追加することもできます。
を見てみましょう git reflog show master
。おそらくあなたが望む正確なフォーマットではありませんが、正しい方向にあなたを向けるべきです。
別のアイデアは、プッシュフック内でスクリプトを実行することです。
リモートでのreflogの検査に関するこの回答は、ブランチがプッシュされた情報を表示しても表示されないため、役立つ場合があります( https://stackoverflow.com/a/8791295/336905 )どのコミットがプッシュされましたが、ローカルコミット日後に次のプッシュを見つけることで相互相関できます。フールプルーフではありませんが、前に投稿した@RichardHansenからの優れたメモの提案をまだ実装していない場合に便利です
サーバー自体のgitリポジトリの「objects」ディレクトリにあるコミットオブジェクトファイルのファイル変更時間を確認することもできます。
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
なぜ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
を実行している場合、commit dateになります著者日付よりも.
次のコマンドは、コミット日を表示します:git log --pretty=fuller
次の表記を使用してプッシュ日付を取得できると思います:git log -g --date = local