Bagaimana cara mengubah format tanggal log Git

150

Saya mencoba untuk menampilkan komit terakhir dalam Git, tetapi saya perlu tanggal dalam format khusus.

Saya tahu bahwa format log cantik %admenghormati --dateformat, tetapi satu-satunya --dateformat yang dapat saya temukan adalah "pendek". Saya ingin tahu yang lain, dan apakah saya bisa membuat yang khusus seperti:

git -n 1 --date=**YYMMDDHHmm** --pretty=format:"Last committed item in this release was by %%an, %%aD, message: %%s(%%h)[%%d]"
ar3
sumber
1
Saya selalu menemukan dokumentasi resmi Linux Kernel Git sebagai sumber yang bagus untuk pertanyaan-pertanyaan semacam ini.
2
Catatan: Anda sekarang (November 2014, Git 2.2) memiliki --date=iso-strict: lihat jawaban saya di bawah ini
VonC
4
Dengan git 2.7 (Q4 2015), Anda dapat meminta untuk menggunakan zona waktu lokal untuk format tanggal apa pun! Lihat jawaban saya di bawah ini . Ini berarti, sebagai tambahan --date=(relative|local|default|iso|iso-strict|rfc|short|raw), Anda juga akan memiliki:--date=(relative-local|default-local|iso-local|iso-strict-local|rfc-local|short-local|raw-local)
VonC

Jawaban:

167

Yang lain adalah (dari git help log):

--date=(relative|local|default|iso|rfc|short|raw)
  Only takes effect for dates shown in human-readable format,
  such as when using "--pretty".  log.date config variable
  sets a default value for log command’s --date option.

--date=relative shows dates relative to the current time, e.g. "2 hours ago".

--date=local shows timestamps in user’s local timezone.

--date=iso (or --date=iso8601) shows timestamps in ISO 8601 format.

--date=rfc (or --date=rfc2822) shows timestamps in RFC 2822 format,
  often found in E-mail messages.

--date=short shows only date but not time, in YYYY-MM-DD format.

--date=raw shows the date in the internal raw git format %s %z format.

--date=default shows timestamps in the original timezone
  (either committer’s or author’s).

Tidak ada cara bawaan yang saya tahu untuk membuat format kustom, tetapi Anda dapat melakukan beberapa shell magic.

timestamp=`git log -n1 --format="%at"`
my_date=`perl -e "print scalar localtime ($timestamp)"`
git log -n1 --pretty=format:"Blah-blah $my_date"

Langkah pertama di sini memberi Anda cap waktu milidetik. Anda dapat mengubah baris kedua untuk memformat stempel waktu yang Anda inginkan. Contoh ini memberi Anda sesuatu yang mirip --date=local, dengan hari yang empuk.


Dan jika Anda ingin efek permanen tanpa mengetik ini setiap waktu, cobalah

git config log.date iso 

Atau, untuk efek pada semua penggunaan git Anda dengan akun ini

git config --global log.date iso
dmedvinsky
sumber
15
Dan jika Anda ingin efek permanen tanpa mengetik ini setiap waktu, cobalah sesuatu seperti git config log.date isoatau, untuk efek pada semua penggunaan git Anda dengan akun inigit config --global log.date iso
Stéphane Gourichon
12
Anda dapat menggunakan format Anda sendiri. lihat jawaban Ben Allred . --format:<args>akan melewati <args>strftime.
Kapten Man
190

Selain itu --date=(relative|local|default|iso|iso-strict|rfc|short|raw), seperti yang disebutkan orang lain, Anda juga dapat menggunakan format tanggal log kustom

--date=format:'%Y-%m-%d %H:%M:%S'

Ini menghasilkan sesuatu seperti 2016-01-13 11:32:13.

CATATAN: Jika Anda melihat komit yang ditautkan ke bawah, saya yakin Anda setidaknya membutuhkan Git v2.6.0-rc0ini untuk bekerja.

Dalam perintah penuh itu akan menjadi seperti:

git config --global alias.lg "log --graph --decorate 
-30 --all --date-order --date=format:'%Y-%m-%d %H:%M:%S' 
--pretty=format:'%C(cyan)%h%Creset %C(black bold)%ad%Creset%C(auto)%d %s'" 

Saya belum dapat menemukan ini di dokumentasi di mana pun (jika seseorang tahu di mana menemukannya, silakan komentar) jadi saya awalnya menemukan placeholder melalui coba-coba.

Dalam pencarian saya untuk dokumentasi tentang ini saya menemukan komit untuk Git itu sendiri yang menunjukkan format diumpankan langsung ke strftime. Mencari strftime(di sini atau di sini ) placeholder yang saya temukan cocok dengan placeholder yang tercantum.

Placeholder meliputi:

%a      Abbreviated weekday name
%A      Full weekday name
%b      Abbreviated month name
%B      Full month name
%c      Date and time representation appropriate for locale
%d      Day of month as decimal number (01 – 31)
%H      Hour in 24-hour format (00 – 23)
%I      Hour in 12-hour format (01 – 12)
%j      Day of year as decimal number (001 – 366)
%m      Month as decimal number (01 – 12)
%M      Minute as decimal number (00 – 59)
%p      Current locale's A.M./P.M. indicator for 12-hour clock
%S      Second as decimal number (00 – 59)
%U      Week of year as decimal number, with Sunday as first day of week (00 – 53)
%w      Weekday as decimal number (0 – 6; Sunday is 0)
%W      Week of year as decimal number, with Monday as first day of week (00 – 53)
%x      Date representation for current locale
%X      Time representation for current locale
%y      Year without century, as decimal number (00 – 99)
%Y      Year with century, as decimal number
%z, %Z  Either the time-zone name or time zone abbreviation, depending on registry settings
%%      Percent sign

Dalam perintah penuh itu akan menjadi sesuatu seperti

git config --global alias.lg "log --graph --decorate -30 --all --date-order --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%C(cyan)%h%Creset %C(black bold)%ad%Creset%C(auto)%d %s'" 
Ben Allred
sumber
4
@ Shiva: Saya baru-baru ini mengalami kasus yang tidak berfungsi dan mungkin Anda mengalami hal yang sama. Saya menggunakan mesin pasangan dengan Git versi lama. Ketika saya memperbarui Git, format tanggal kustom mulai berfungsi. Jika Anda melihat komit yang ditautkan di atas, saya yakin Anda memerlukan setidaknya v2.6.0-rc0. Contoh yang diberikan adalah persis apa yang saya gunakan. Dalam perintah penuh itu akan menjadi sepertigit config --global alias.lg "log --graph --decorate -30 --all --date-order --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%C(cyan)%h%Creset %C(black bold)%ad%Creset%C(auto)%d %s'"
Ben Allred
1
Ben terima kasih! Saya menyisipkan perintah Anda apa adanya dan menjalankan git lgdan saya masih mendapatkan kesalahan berikut. fatal: unknown date format format:%Y-%m-%d %H:%M:%S. Saya menjalankan git di windows. Ini versi git saya. git version 1.9.5.msysgit.1. Jadi, apakah saya harus meningkatkan ke versi yang lebih baru?
Shiva
Hai Ben, saya menggunakan versi yang lebih lama. Saya meningkatkan ke terbaru dan ini berfungsi. Jadi saya mengedit jawaban Anda untuk membuatnya lebih jelas (memindahkan komentar Anda ke atas) dan juga memberi +1 pada Anda! Terima kasih!!
Shiva
Ini berhasil! Menggunakan skrip bash sederhana untuk mengekspor csv, sekarang saya dapat memiliki kolom untuk tahun, bulan, minggu, dll. Senang.
Jamie Taylor
1
@EdRandall: Jika Anda mengacu pada %X, ~~ Saya hanya mencobanya di komputer saya dan pasti mendapatkan waktu di zona waktu saya. ~~ Hmm, sekarang saya tidak yakin. Saya mengkloning repo dari seseorang yang tidak berada di zona waktu saya dan mencoba lagi. Saya pikir saya hanya mendapatkan waktu yang diformat menggunakan pengaturan lokal saat ini tetapi dengan zona waktu terpotong.
Ben Allred
36

Setelah sekian lama mencari cara untuk mendapatkan git logkeluaran tanggal dalam format YYYY-MM-DDdengan cara yang akan bekerja less, saya datang dengan format berikut:

%ad%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08

bersama dengan saklar --date=iso.

Ini akan mencetak tanggal dalam format ISO (yang panjang), dan kemudian mencetak 14 kali karakter backspace (0x08), yang, di terminal saya, secara efektif menghilangkan semuanya setelah bagian YYYY-MM-DD. Sebagai contoh:

git log --date=iso --pretty=format:'%ad%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%aN %s'

Ini memberikan sesuatu seperti:

2013-05-24 bruno This is the message of the latest commit.
2013-05-22 bruno This is an older commit.
...

Apa yang saya lakukan adalah membuat alias ldengan beberapa tweak pada format di atas. Ini menunjukkan grafik komit ke kiri, kemudian hash komit, diikuti oleh tanggal, nama pendek, nama ulang dan subjek. Aliasnya adalah sebagai berikut (dalam ~ / .gitconfig):

[alias]
        l = log --date-order --date=iso --graph --full-history --all --pretty=format:'%x08%x09%C(red)%h %C(cyan)%ad%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08 %C(bold blue)%aN%C(reset)%C(bold yellow)%d %C(reset)%s'
Bruno Reis
sumber
2
Ini bekerja sangat baik untuk saya. Menggunakan 6 dari% x08 menghapus persis zona waktu tertinggal untuk saya.
Penghe Geng
7
Bagaimana dengan--date=short shows only date but not time, in YYYY-MM-DD format.
Paaske
3
Dalam zsh dan bash ini menunjukkan Anda output pada terminal, tetapi jika Anda menyalurkannya ke apa saja, data "mundur" masih ada. Ini berarti hal-hal seperti | sort | uniqtidak berfungsi.
chmac
5
Ini konyol dan mengagumkan pada saat bersamaan. Saya menggunakan %C(bold cyan)%ai%x08%x08%x08%x08%x08%x08%x08%x08%x08%C(reset) %C(bold green)(%ar%x08%x08%x08%x08)%C(reset)untuk mendapatkan format 2015-01-19 11:27 (11 days). +1
naught101
2
sekarang jawaban ini stackoverflow.com/a/34778736/907576 lebih cocok (karena Git v2.6.0-rc0)
radistao
25

Anda dapat menggunakan opsi pemotongan bidang untuk menghindari %x08karakter yang sangat banyak . Sebagai contoh:

git log --pretty='format:%h %s%n\t%<(12,trunc)%ci%x08%x08, %an <%ae>'

setara dengan:

git log --pretty='format:%h %s%n\t%ci%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08%x08, %an <%ae>'

Dan sedikit lebih mudah di mata.

Lebih baik lagi, untuk contoh khusus ini, menggunakan %cdakan menghormati --date=<format>, jadi jika Anda mau YYYY-MM-DD, Anda dapat melakukan ini dan menghindari %<dan %x08sepenuhnya:

git log --date=short --pretty='format:%h %s%n\t%cd, %an <%ae>'

Saya hanya memperhatikan ini agak melingkar sehubungan dengan posting asli tetapi saya akan meninggalkannya kalau-kalau orang lain tiba di sini dengan parameter pencarian yang sama saya lakukan.

dvhart
sumber
23

Saya membutuhkan hal yang sama dan menemukan hal berikut ini berfungsi untuk saya:

git log -n1 --pretty='format:%cd' --date=format:'%Y-%m-%d %H:%M:%S'

The --date=formatformat output tanggal di mana --prettymemberitahu apa yang harus dicetak.

lac_dev
sumber
2
Ini tidak berhasil untuk saya. Saya mendapatkan "format tanggal yang tidak diketahui"
Ray
versi git apa yang Anda miliki?
lac_dev
Diperbarui menggunakan medium.com/@katopz/how-to-upgrade-git-ff00ea12be18
barista amatir
git log --pretty=format:"%h%x09%cd%x09%s" --date=format:'%Y-%m-%d %H:%M:%S %p'
barista amatir
@amateurbarista yang tidak menunjukkan komit terakhir, baca permintaan. ar3 sedang mencoba menunjukkan komit terakhir, bukan komit terakhir.
lac_dev
16

Menyadari " date=iso" format: tidak persis ISO 8601 .
Lihat komit " 466fb67 " dari Beat Bolli ( bbolli) , untuk Git 2.2.0 (November 2014)

cantik: menyediakan format tanggal ISO 8601 yang ketat

Format tanggal "ISO" Git tidak benar-benar sesuai dengan standar ISO 8601 karena perbedaan kecil, dan itu tidak dapat diuraikan oleh pengurai khusus ISO 8601, misalnya yang ada pada XML toolchains.

Output dari " --date=iso" menyimpang dari ISO 8601 dengan cara berikut:

  • spasi alih-alih Tpembatas tanggal / waktu
  • ruang antara waktu dan zona waktu
  • tidak ada titik dua antara jam dan menit dari zona waktu

Tambahkan format tanggal ISO 8601 yang ketat untuk menampilkan tanggal committer dan penulis.
Gunakan penentu format ' %aI' dan ' %cI' dan tambahkan nama format tanggal ' --date=iso-strict' atau ' --date=iso8601-strict'.

Lihat utas ini untuk diskusi.

VONC
sumber
11
date -d @$(git log -n1 --format="%at") +%Y%m%d%H%M

Perhatikan bahwa ini akan dikonversi ke zona waktu lokal Anda, jika hal itu penting untuk kasus penggunaan Anda.

Cheetah
sumber
Terima kasih. Saya men-tweak-nya dengan% ct
cagney
5

Git 2.7 (Q4 2015) akan diperkenalkan -localsebagai instruksi.
Artinya, selain:

--date=(relative|local|default|iso|iso-strict|rfc|short|raw)

Anda juga akan memiliki:

--date=(default-local|iso-local|iso-strict-local|rfc-local|short-local)

The -localakhiran tidak dapat digunakan dengan rawatau relative. Referensi .

Anda sekarang dapat meminta format tanggal apa pun menggunakan zona waktu lokal . Lihat

Lihat komit add00ba , komit 547ed71 (03 Sep 2015) oleh Jeff King ( peff) .
(Digabung oleh Junio ​​C Hamano - gitster- dalam komit 7b09c45 , 05 Okt 2015)

Secara khusus, yang terakhir dari atas (melakukan add00ba) menyebutkan:

date: buat " local" format orthogonal to date:

Sebagian besar --datemode kami adalah tentang format tanggal: item mana yang kami tampilkan dan dalam urutan apa.
Tapi " --date=local" agak aneh. Ini berarti "tampilkan tanggal dalam format normal, tetapi gunakan zona waktu lokal".
Zona waktu yang kami gunakan adalah ortogonal dengan format aktual, dan tidak ada alasan kami tidak dapat memiliki "iso8601 terlokalisasi", dll.

Patch ini menambahkan " local" bidang boolean ke " struct date_mode", dan menjatuhkan DATE_LOCALelemen dari date_mode_typeenum (sekarang hanya DATE_NORMALditambah local=1).
Fitur baru dapat diakses oleh pengguna dengan menambahkan " -local" ke mode tanggal apa pun (misalnya, " iso-local"), dan kami mempertahankan " local" sebagai alias untuk " default-local" untuk kompatibilitas ke belakang.

VONC
sumber
2
Saya harus mencatat bahwa ini format-localjuga berhasil! Jadi sangat sempurna yang menggabungkan kekuatan antara format favorit dan lokal.
Acgtyrant
5

Opsi format %aiadalah apa yang saya inginkan:

%ai: tanggal penulis, format seperti ISO 8601

--format="%ai"
ThorSummoner
sumber
5

Saya perlu tanggal dalam format khusus.

Dengan Git 2.21 (Q1 2019), format tanggal baru " --date=human" yang berubah tergantung pada seberapa jauh waktu dari waktu saat ini telah diperkenalkan .

" --date=auto" dapat digunakan untuk menggunakan format baru ini ketika output menuju ke pager atau ke terminal dan sebaliknya format default.

Lihat komit 110a6a1 , komit b841d4f (29 Jan 2019), dan komit 038a878 , komit 2fd7c22 (21 Jan 2019) oleh Stephen P. Smith (``) .
Lihat commit acdd377 (18 Jan 2019) oleh Linus Torvalds ( torvalds) .
(Digabung oleh Junio ​​C Hamano - gitster- di commit ecbe1be , 07 Feb 2019)

Tambahkan dokumentasi format tanggal 'manusia'

Tampilkan informasi tanggal dan waktu dalam format yang mirip dengan cara orang menulis tanggal dalam konteks lain.
Jika tahun tidak ditentukan, maka pembaca menyimpulkan bahwa tanggal yang diberikan adalah tahun berjalan .

Dengan tidak menampilkan informasi yang berlebihan, pembaca berkonsentrasi pada informasi yang berbeda .
Patch melaporkan tanggal relatif berdasarkan informasi yang disimpulkan dari tanggal pada mesin yang menjalankan gitperintah pada saat perintah dieksekusi.

Sementara format lebih bermanfaat bagi manusia dengan menjatuhkan informasi yang disimpulkan, tidak ada yang membuatnya menjadi manusia.
Jika relativeformat tanggal belum diterapkan, maka menggunakan ' relative' sudah tepat.

Tambahkan humantes format tanggal.

Ketika menggunakan human beberapa bidang ditekan, tergantung pada perbedaan waktu antara tanggal referensi dan tanggal komputer lokal.

  • Dalam kasus di mana perbedaannya kurang dari satu tahun, bidang tahun ditekan.
  • Jika waktunya kurang dari sehari; bulan dan tahun ditekan.
check_date_format_human 18000       "5 hours ago"       #  5 hours ago
check_date_format_human 432000      "Tue Aug 25 19:20"  #  5 days ago
check_date_format_human 1728000     "Mon Aug 10 19:20"  #  3 weeks ago
check_date_format_human 13000000    "Thu Apr 2 08:13"   #  5 months ago
check_date_format_human 31449600    "Aug 31 2008"       # 12 months ago
check_date_format_human 37500000    "Jun 22 2008"       #  1 year, 2 months ago
check_date_format_human 55188000    "Dec 1 2007"        #  1 year, 9 months ago
check_date_format_human 630000000   "Sep 13 1989"       # 20 years ago

## Ganti automode ' ' yang diusulkan dengan 'auto: '

Selain menambahkan humanformat ' ', tambalan menambahkan autokata kunci yang dapat digunakan dalam file konfigurasi sebagai cara alternatif untuk menentukan format manusia. Menghapus 'otomatis' membersihkan humanantarmuka format ' '.

Menambahkan kemampuan untuk menentukan mode ' foo' jika pager sedang digunakan dengan menggunakan auto:foosintaks.
Karena itu, auto:humanmode tanggal ' ' default ke humanjika kita menggunakan pager.
Jadi kamu bisa melakukan:

git config --add log.date auto:human

dan " git log" perintah Anda akan menampilkan format yang dapat dibaca manusia kecuali Anda membuat skrip.


Git 2.24 (Q4 2019) menyederhanakan kode.

Lihat komit 47b27c9 , komit 29f4332 (12 Sep 2019) oleh Stephen P. Smith (``) .
(Digabung oleh Junio ​​C Hamano - gitster- di commit 36d2fca , 07 Okt 2019)

Berhenti lewat 'sekarang' ke kode tanggal

Commit b841d4f (Tambahkan humanformat ke alat uji, 2019-01-28, Git v2.21.0-rc0) menambahkan get_time()fungsi yang memungkinkan $GIT_TEST_DATE_NOWdi lingkungan untuk menimpa waktu saat ini.
Jadi kita tidak perlu lagi menafsirkan variabel itu di cmd__date().

Karenanya, kita bisa berhenti meneruskan nowparameter " " ke bawah melalui fungsi tanggal, karena tidak ada yang menggunakannya.
Perhatikan bahwa kami perlu memastikan semua penelepon sebelumnya yang mengambil nowparameter " " menggunakan dengan benar get_time().

VONC
sumber
2
git log -n1 --format="Last committed item in this release was by %an, `git log -n1 --format=%at | awk '{print strftime("%y%m%d%H%M",$1)}'`, message: %s (%h) [%d]"
webb
sumber
Mau menguraikan? Selain itu, jawaban Anda sudah memiliki bidang dan riwayat penulis. tidak perlu menandatanganinya.
Kissaki
2

Gunakan Bash dan perintah tanggal untuk mengonversi dari format mirip ISO ke format yang Anda inginkan. Saya ingin format tanggal mode-org (dan daftar item), jadi saya melakukan ini:

echo + [$(date -d "$(git log --pretty=format:%ai -1)" +"%Y-%m-%d %a %H:%M")] \
    $(git log --pretty=format:"%h %s" --abbrev=12 -1)

Dan hasilnya misalnya:

+ [2015-09-13 Sun 22:44] 2b0ad02e6cec Merge pull request #72 from 3b/bug-1474631
Liam
sumber