Apakah ada cara untuk mendapatkan tanggal push untuk komit tertentu?

93

Saya ingin tahu apakah ada cara untuk melihat tanggal push yang terkait dengan setiap komit di log git. Jika itu tidak memungkinkan, apakah ada cara untuk melihat semua komit di bawah dorongan tertentu.

Saya menulis sebuah program yang perlu melacak komitmen saat mereka didorong. Karena git log diurutkan berdasarkan tanggal komit, bukan tanggal push, saya tidak dapat melihat komit terbaru yang didorong. Misalnya, jika pengguna melakukan komit ke repositori lokalnya 2 hari sebelum dia mendorong ke master, komit itu akan ditempatkan di belakang 2 hari dari komit lain di log repositori master.

justkikuchi
sumber

Jawaban:

77

Saya membutuhkan waktu yang sangat lama untuk mengumpulkan informasi yang tersebar dan akhirnya menemukan jawaban terbaik untuk pertanyaan ini, tetapi sekarang saya tahu saya memilikinya. Hanya dalam dua baris, tanpa kode dan tanpa kait:

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

git reflog --date=local master

Sederhana akhirnya.

Peringatan: Anda mungkin ingin mengganti nilai default gc.reflogExpiredan gc.reflogExpireUnreachable. Periksa git help reflogdetailnya dan untuk memahami bagaimana dan mengapa ini berhasil.

Kedua perintah di atas harus dijalankan di dalam klon yang Anda dorong . Jika itu tidak memungkinkan, maka perkiraan akan dijalankan di klon permanen lainnya :

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

Jangan pernah menghapus klon permanen ini atau Anda akan kehilangan tanggalnya.

Maret
sumber
2
Saya ingin menambahkan bahwa dalam kasus saya, saya harus melakukan git reflog --date=local origin/master(catatan origin/) untuk melihat daftar dorongan. Jika tidak, hanya komit, pembayaran, dan penarikan yang ada dalam daftar (yang juga berguna). Sebenarnya, saya diarahkan oleh jawaban @ JonathanDay .
NIA
@NIA: origin / master hanya akan memberi Anda perkiraan. Saya telah memperbarui jawaban saya setelah komentar Anda, apakah ini menjelaskan?
MarcH
37

Git adalah sistem kontrol versi terdistribusi, jadi Anda harus menentukan dengan cermat apa yang Anda maksud dengan "tanggal dorong". Misalnya, pengguna A mendorong beberapa komitmen ke repositori pengguna B. Beberapa poin kemudian, pengguna B mendorong komit yang sama ke repositori ketiga. Tanggal berapa Anda tertarik?

Saya berspekulasi bahwa Anda memiliki repositori bersama dan ingin pengguna dari repositori bersama itu dapat menentukan kapan sesuatu diterbitkan ke repositori. Jika itu benar, Anda harus mengumpulkan informasi itu di repositori bersama.

Kabar buruknya

Sayangnya, tidak ada cara untuk menambahkan tanggal ke pesan komit. Itu akan mengubah ID komit (yang merupakan hash SHA1 dari konten), menyebabkan segala macam masalah.

Berita bagus

Untungnya, Git memiliki fitur (yang relatif baru) yang disebut catatan . Fitur ini memungkinkan Anda melampirkan teks arbitrer ke komit, yang git logdapat ditampilkan. Catatan dapat diedit dan dibagikan dengan orang lain.

Anda bisa menggunakan fitur catatan untuk melampirkan pesan "komit ini diterima pada [tanggal]" ke setiap komit saat diterima oleh repositori bersama.

Lihat git help notesuntuk detailnya.

Bagaimana cara merekam tanggal

Inilah pendekatan yang saya rekomendasikan:

  1. Ubah post-receivehook pada repositori bersama Anda untuk menjalankan setiap komit yang baru dijangkau untuk setiap referensi yang diperbarui.
  2. Untuk setiap komit, tambahkan sesuatu seperti "[pengguna] dari [repository_url] menambahkan komit ini ke [ref] pada [tanggal]" ke catatan komit.

    Anda mungkin ingin menggunakan catatan ref yang didedikasikan untuk tujuan ini (seperti refs/notes/received-on) daripada default refs/notes/commits. Ini akan mencegah konflik dengan catatan yang dibuat untuk tujuan lain.

  3. Ubah receivehook Anda untuk menolak pembaruan pada referensi catatan Anda (untuk mencegah pengguna secara tidak sengaja atau sengaja mengotak-atik catatan).
  4. Beri tahu semua pengguna untuk menjalankan perintah berikut dari dalam pohon kerja mereka:

    # 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/*'
    

    Langkah ini diperlukan karena Git mengabaikan referensi non-cabang, non-tag di repositori upstream secara default.

Di atas mengasumsikan bahwa referensi hanya tingkat lanjut, tidak pernah dihapus atau diperbarui secara paksa. Anda mungkin ingin agar post-receivehook juga menambahkan catatan "dihapus pada [tanggal]" untuk menangani kasus ini.

Richard Hansen
sumber
Saya telah menggunakan ide Anda di blog saya mnaoumov.wordpress.com/2013/01/31/git-get-push-date
mnaoumov
8
git reflog show origin/master --pretty='%h %gd %gs %s' --date=iso

Ini tampaknya bekerja cukup baik untuk saya. Tanggal pelaku (% cd) menyesatkan karena belum tentu sama dengan tanggal push. Opsi --date = iso, bagaimanapun akan menampilkan tanggal push / fetch .

Catatan, jika Anda mengambil dari origin / master, itu akan mencetak tanggal Anda mengambilnya; BUKAN tanggal orang lain mendorong komit.

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

Bonus: Anda tentu saja dapat melakukan pemformatan yang lebih cantik. Sejauh ini, saya suka kode warna ini. Agak banyak untuk mengetik. Ini akan mengeluarkan SHA menjadi merah, reflog selector menjadi cyan, dan reflog menjadi hijau.

git reflog show origin/master --pretty='format:%C(red)%h%Creset %C(cyan)%gd%Creset %C(green)%gs%Creset: %s' --date=iso
VC
sumber
Hai VC apakah itu berarti bahwa jika output dari perintah "reflog show origin / master --pretty = '% Cred% h% Creset -% C (yellow)% gd% Creset% Cblue (% gs)% Creset% s' - -date = iso "is" da4c192cd -origin / master @ {2019-02-07 08:13:40 +0100} (pull: fast-forward) JIRA-2542 tingkatkan laporan pengujian ", itu berarti konten cabang JIRA saya -2542 digabungkan pada origin / master melalui fast-froward pada 2019-02-07 08:13:40?
Simon
Hai Simon, ya. Anda melakukan git pull pada cabang Anda dan cabang tersebut digabungkan pada origin / master melalui fast-forward pada saat itu.
VC
Ini hanya berfungsi di repositori penulis. Jika saya menggandakan repositori, nilainya kosong. Anda tidak dapat melihat waktu push orang lain.
ramwin
6

Coba lihat git reflog show master. Mungkin bukan format yang Anda inginkan, tetapi harus mengarahkan Anda ke arah yang benar.

Ide lainnya adalah menjalankan skrip di dalam push hook.

Karl Bielefeldt
sumber
Saya berpikir untuk menjalankan push hook, tetapi sepertinya itu harus menjadi upaya terakhir. Dengan kail, sepertinya setiap pengguna harus memiliki kail itu di setiap repositori mereka. Bisakah Anda lebih spesifik tentang git reflog show master? Saya ingin dapat melihat tanggal push dari setiap komitmen individu pengguna.
justkikuchi
git reflog menunjukkan urutan perubahan dalam repo apa pun yang Anda jalankan. Saya tidak yakin apakah ada cara langsung untuk mendapatkan tanggalnya, tetapi di .git/logs/refs/heads/masterdalamnya menunjukkan stempel waktu.
Karl Bielefeldt
3
Adapun kait, ada menerima kait yang berjalan pada mesin Anda mendorong untuk . Karena mendorong hanya relevan relatif terhadap repo tertentu, saya berasumsi Anda memiliki repo "diberkati" tertentu yang ingin Anda jalankan. Hal yang sama berlaku untuk git reflogmasalah itu.
Karl Bielefeldt
5

Jawaban mengenai pemeriksaan reflog di remote ini dapat membantu ( https://stackoverflow.com/a/8791295/336905 ) dengan memberi Anda informasi tentang cabang mana yang didorong meskipun tidak menunjukkan komitmen mana yang didorong, tetapi Anda bisa berkorelasi silang dengan mencari dorongan berikutnya setelah tanggal komit lokal. Bukan bukti yang bodoh, tetapi berguna jika Anda belum menerapkan saran catatan luar biasa dari @RichardHansen yang diposting sebelumnya

Jonathan Day
sumber
1
Dengan catatan bahwa reflog origin/branchhanya akan menampilkan perubahan yang dibuat pada mesin saat ini, ini sangat berguna! Untuk penggunaan sehari-hari saya tidak ingin menerapkan pengait apa pun, jadi untuk pertanyaan sederhana "Hmmm, ketika saya mendorong commit itu minggu lalu?" - itu bekerja dengan baik.
NIA
4

Anda juga dapat melihat waktu modifikasi file dari file objek komit di direktori "objek" di repositori git di server itu sendiri.

Kaya
sumber
3

Mengapa git AuthorDate berbeda dengan CommitDate?

  • AuthorDate adalah saat komit pertama kali dibuat.
  • CommitDate adalah saat komit terakhir diubah (mis. rebase).

Anda bisa mendapatkannya dengan --prettyopsi pemformatan:

       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

Jadi, jika Anda dan pengembang lain melakukannya git rebasesebelumnya git push, Anda akan mendapatkan tanggal komit yang lebih lama dari tanggal pembuat .

Perintah ini menunjukkan tanggal komit: git log --pretty=fuller

tidak tahu
sumber
1

Saya kira Anda dapat menggunakan notasi berikutnya untuk mendapatkan tanggal push: git log -g --date = local

Pashh PGH
sumber