it-swarm-id.com

Bagaimana cara mengubah format tanggal log Git

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

Saya tahu bahwa format log cantik %ad menghormati format --date, tetapi satu-satunya format --date 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]"
126
ar3

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 khusus, tetapi Anda dapat melakukan beberapa keajaiban Shell.

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 dengan --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
151
dmedvinsky

Selain --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 memerlukan setidaknya Git v2.6.0-rc0 agar ini 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 ini saya menemukan komit untuk Git sendiri yang menunjukkan format diumpankan langsung ke strftime. Mencari strftime ( di sini atau di sini ) placeholder yang saya temukan cocok dengan placeholder yang terdaftar.

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'" 
148
Ben Allred

Setelah sekian lama mencari cara untuk mendapatkan git log mengeluarkan tanggal dalam format YYYY-MM-DD dengan cara yang akan berfungsi dalam less, saya membuat format berikut:

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

bersamaan dengan sakelar --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 menghapus 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 bernama l dengan beberapa penyesuaian pada format di atas. Ini menunjukkan grafik komit ke kiri, kemudian hash komit, diikuti oleh tanggal, nama pendek, nama ulang dan subjek. Alias ​​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'
36
Bruno Reis

Anda dapat menggunakan opsi pemotongan bidang untuk menghindari karakter %x08 yang cukup 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 %cd akan menghormati --date=<format>, jadi jika Anda ingin YYYY-MM-DD, Anda dapat melakukan ini dan menghindari %< dan %x08 sepenuhnya:

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.

24
dvhart

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

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

--date=format memformat keluaran tanggal di mana --pretty memberi tahu apa yang harus dicetak.

19
lac_dev

Waspadai format "_date=iso_": formatnya tidak persis ISO 8601 .
Lihat commit " 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 parser khusus ISO 8601, mis. orang-orang dari XML toolchains.

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

  • spasi alih-alih pembatas tanggal/waktu T
  • 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 format _%aI_ 'dan' _%cI_ 'dan tambahkan nama format tanggal _--date=iso-strict_' atau '_--date=iso8601-strict_'.

Lihat tas ini untuk diskusi.

15
VonC
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.

11
Cheetah

Opsi format %ai adalah yang saya inginkan:

%ai: tanggal penulis, format seperti ISO 8601

--format="%ai"
5
ThorSummoner

Git 2.7 (Q4 2015) akan memperkenalkan _-local_ sebagai instruksi.
Ini berarti bahwa, 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)
_

Sufiks _-local_ tidak dapat digunakan dengan raw atau relative. Referensi .

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

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

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

date: buat "local" ortogonal ke format tanggal:

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

Patch ini menambahkan bidang "local" boolean ke "_struct date_mode_", dan menjatuhkan elemen _DATE_LOCAL_ dari _date_mode_type_ enum (sekarang hanya _DATE_NORMAL_ ditambah _local=1_ ).
Fitur baru dapat diakses oleh pengguna dengan menambahkan "_-local_" ke mode tanggal apa pun (mis., "_iso-local_"), dan kami mempertahankan "local" sebagai alias untuk "_default-local_ "untuk kompatibilitas mundur.

4
VonC
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]"
3
webb

Gunakan Bash dan perintah tanggal untuk mengonversi dari format mirip-ISO ke yang Anda inginkan. Saya menginginkan org-mode format tanggal (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
2
Liam

Saya perlu tanggal dalam format khusus.

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

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

Lihat commit 110a6a1 , commit b841d4f (29 Jan 2019), dan commit 038a878 , commit 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 perintah git pada saat perintah dieksekusi.

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

Tambahkan tes format tanggal human.

Saat 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 mode 'auto' yang diusulkan dengan '_auto:_'

Selain menambahkan format 'human', tambalan menambahkan kata kunci auto yang dapat digunakan dalam file konfigurasi sebagai cara alternatif untuk menentukan format manusia. Menghapus 'otomatis' membersihkan antarmuka format 'human'.

Menambahkan kemampuan untuk menentukan mode 'foo' jika pager digunakan dengan menggunakan _auto:foo_ sintaks.
Oleh karena itu, '_auto:human_' mode tanggal default ke human jika kita menggunakan pager.
Jadi, Anda dapat melakukan:

_git config --add log.date auto:human
_

dan perintah "_git log_" Anda akan menampilkan format yang dapat dibaca manusia kecuali Anda membuat skrip.

2
VonC