Git günlük tarihi biçimlerini değiştirme


150

Git'teki son işlemi göstermeye çalışıyorum, ancak tarihe özel bir formatta ihtiyacım var.

Ben günlük oldukça biçimi olduğunu biliyoruz %adsaygı--date , ancak --datebulabildiğim tek biçim "kısa" olduğunu biliyorum. Diğerlerini ve ben gibi özel bir oluşturmak olup olmadığını bilmek istiyorum:

git -n 1 --date=**YYMMDDHHmm** --pretty=format:"Last committed item in this release was by %%an, %%aD, message: %%s(%%h)[%%d]"

1
Her zaman resmi Linux Kernel Git belgelerini bu tür sorular için mükemmel bir kaynak olarak görüyorum .

2
Not: Şimdi (Kasım 2014, Git 2.2) var --date=iso-strict: Aşağıdaki cevabımı gör
VonC

4
Git 2.7 (4. Çeyrek 2015) ile yerel saat dilimini herhangi bir tarih biçimi için kullanmayı isteyebilirsiniz ! Bkz aşağıda Cevabımı . Buna ek olarak --date=(relative|local|default|iso|iso-strict|rfc|short|raw), ayrıca sahip olacaksınız:--date=(relative-local|default-local|iso-local|iso-strict-local|rfc-local|short-local|raw-local)
VonC

Yanıtlar:


167

Diğerleri 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).

Özel bir biçim oluşturmayı bildiğim yerleşik bir yol yok, ancak kabuk büyüsü yapabilirsiniz.

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

Buradaki ilk adım size milisaniyelik bir zaman damgası kazandırır. İkinci satırı istediğiniz zaman damgasını biçimlendirecek şekilde değiştirebilirsiniz. Bu örnek, --date=localyastıklı bir güne benzer bir şey verir .


Ve bunu her seferinde yazmadan kalıcı bir etki istiyorsanız, deneyin

git config log.date iso 

Veya bu hesapla tüm git kullanımınızı etkilemek için

git config --global log.date iso

15
Ve bunu her seferinde yazmadan kalıcı bir etki istiyorsanız git config log.date iso, bu hesapla tüm git kullanımınızı etkilemek için veya gibi bir şey deneyingit config --global log.date iso
Stéphane Gourichon 13:13

12
Kendi biçimlerinizi kullanabilirsiniz. Ben Allred'in cevabına bakınız . strftime --format:<args>geçecek <args>.
Kaptan Adam

190

Ayrıca etmek --date=(relative|local|default|iso|iso-strict|rfc|short|raw)diğerleri de söylediğim gibi, aynı zamanda ile özel bir günlük tarih biçimini kullanabilirsiniz

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

Böyle bir şey çıktı 2016-01-13 11:32:13.

NOT: Aşağıdakine bağlı taahhüdüne bakarsanız, en azından Git v2.6.0-rc0bunun çalışması için ihtiyacınız olacağını düşünüyorum .

Tam komutta şöyle bir şey olurdu:

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 herhangi bir yerde (birisi nerede bulmak için bilirseniz, lütfen yorum) belgelerde bulamadım bu yüzden başlangıçta deneme yanılma yoluyla yer tutucular bulundu.

Bu konudaki dokümanları araştırmamda Git'in kendisine formatın doğrudan beslendiğini gösteren bir taahhüt buldum strftime. Bulduğum yer tutucular strftime( burada veya burada ) ararken listelenen yer tutucularla eşleşir.

Yer tutucular şunları içerir:

%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

Tam bir komutta, şöyle bir şey olurdu:

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'" 

4
@Shiva: Son zamanlarda işe yaramadığı bir durumla karşılaştım ve karşılaştığınız şey de olabilir. Git'in eski bir sürümüne sahip bir eşleştirme makinesi kullanıyordum. Git'i güncellediğimde özel tarih formatı çalışmaya başladı. Yukarıdaki bağlantıya bir göz atarsanız, en azından v2.6.0-rc0'a ihtiyacınız olacağını düşünüyorum. Verilen örnek tam olarak kullandığım şey. Tam bir komutla böyle bir şey olurdugit 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
Teşekkürler Ben! Komutunuzu olduğu gibi yapıştırdım ve koştum git lgve hala aşağıdaki hatayı alıyorum. fatal: unknown date format format:%Y-%m-%d %H:%M:%S. Git pencerelerde koşuyorum. İşte benim git versiyonum. git version 1.9.5.msysgit.1. Bu yüzden yeni sürüme geçmem gerekiyor mu?
Shiva

Merhaba Ben, eski versiyondaydım. En son sürüme geçtim ve bu işe yarıyor. Bu yüzden cevabınızı daha net hale getirmek (yorumunuzu en üste taşımak) için düzenledim ve sizi + 1'ledi! Teşekkürler!!
Shiva

Bu bir tedavi çalışır! Bir csv vermek için basit bir bash komut dosyası kullanarak, şimdi yıl, ay, hafta vb için sütunlar olabilir.
Jamie Taylor

1
@EdRandall: Eğer atıfta bulunuyorsanız %X, ~~ Sadece makinemde denedim ve kesinlikle saat dilimimde zamanlar alıyorum. ~~ Hmm, şimdi emin değilim. Saat dilimimde olmayan birinden bir repo kopyaladım ve tekrar denedim. Ben sadece geçerli yerel ayarları kullanarak biçimlendirilmiş zaman alıyorum ama zaman dilimi kapalı ile düşünüyorum.
Ben Allred

36

Uzun bir süre, git logçıktıyı tarih biçiminde YYYY-MM-DDçalışacak şekilde almanın bir yolunu lessaradıktan sonra, aşağıdaki biçimi buldum:

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

anahtarı ile birlikte --date=iso.

Bu, tarihi ISO biçiminde (uzun bir tarih) yazdırır ve daha sonra terminalimde YYYY-AA-GG parçasından sonraki her şeyi etkili bir şekilde kaldıran arka boşluk karakterinin (0x08) 14 katı yazdırır. Örneğin:

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

Bu şöyle bir şey verir:

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

Yaptığım şey lyukarıdaki formatta bazı ince ayarlarla adlandırılmış bir takma ad oluşturmaktı . Önce soldaki grafik, daha sonra işlemin karmasını, ardından tarih, kısa adlar, yeniden adlar ve konuyu gösterir. Diğer ad aşağıdaki gibidir (~ / .gitconfig içinde):

[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'

2
Bu benim için çok iyi çalışıyor. % X08'in 6'sını kullanmak benim için sondaki saat dilimini tamamen kaldırır.
Penghe Geng

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

3
Zsh ve bash'da bu, terminalde çıkışınızı gösterir, ancak herhangi bir şeye bağlarsanız, "backspaced" verileri hala oradadır. Bu, | sort | uniqişe yaramaz gibi şeyler anlamına gelir .
chmac

5
Bu aynı zamanda çok saçma ve harika. %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)Biçimi almak için kullanıyorum 2015-01-19 11:27 (11 days). +1
naught101

2
şimdi bu cevap stackoverflow.com/a/34778736/907576 (Git v2.6.0-rc0'dan beri) daha uygun
radistao

25

Çok fazla %x08karakterden kaçınmak için alan kesme seçeneğini kullanabilirsiniz . Örneğin:

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

şuna eşittir:

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>'

Ve gözler üzerinde biraz daha kolay.

Daha da iyisi, bu özel örnek için, kullanmak %cdşuna saygı duyacaktır --date=<format>, böylece isterseniz YYYY-MM-DDbunu yapabilir ve önleyebilirsiniz %<ve %x08tamamen:

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

Ben sadece bu orijinal yazı ile ilgili olarak biraz dairesel olduğunu fark ettim ama diğerleri buraya aynı arama parametreleri ile geldi durumunda bırakacağım.


23

Aynı şeye ihtiyacım vardı ve benim için aşağıdakilerin çalıştığını buldum:

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

--date=formatNerede tarih çıkışını biçimlendirir --prettyyazdırmak ne söyler.


2
Bu benim için işe yaramıyor. "Bilinmeyen tarih biçimi" alıyorum
Ray

git'in hangi versiyonuna sahipsiniz?
lac_dev


git log --pretty=format:"%h%x09%cd%x09%s" --date=format:'%Y-%m-%d %H:%M:%S %p'
amatör barista

Son işlem göstermeyen @amateurbarista isteği okuyun. ar3, son birkaç taahhüdü değil, son taahhüdü göstermeye çalışıyor.
lac_dev

16

" date=iso" Biçiminin farkında olun : tam olarak ISO 8601 değil . Git 2.2.0 (Kasım 2014) için Beat Bolli ( ) 'den gelen
" 466fb67 " taahhüdüne bakınbbolli

güzel: katı bir ISO 8601 tarih biçimi sağlayın

Git'in "ISO" tarih biçimi, küçük farklılıklar nedeniyle ISO 8601 standardına uymuyor ve yalnızca ISO 8601 ayrıştırıcıları, örneğin XML araç zincirleri gibi ayrıştırılamıyor.

" --date=iso" Çıktısı ISO 8601'den şu şekillerde sapmaktadır:

  • yerine bir boşluk Ttarih / saat sınırlayıcı
  • zaman ve zaman dilimi arasındaki boşluk
  • saat dilimi ile saatler arasında iki nokta üst üste işaret yok

Committer ve yazar tarihlerini görüntülemek için katı bir ISO 8601 tarih biçimi ekleyin.
' %aI' Ve ' %cI' biçim belirleyicilerini kullanın ve ' --date=iso-strict' veya ' --date=iso8601-strict' tarih biçimi adları ekleyin .

Tartışma için bu konuya bakın .


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

Kullanım durumunuz için önemliyse, bunun yerel saat diliminize dönüştürüleceğini unutmayın.


Teşekkürler. % Ct
cagney ile

5

Git 2.7 (4. Çeyrek 2015) -localtalimat olarak tanıtacaktır .
Bu, aşağıdakilere ek olarak anlamına gelir:

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

ayrıca:

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

-localEki ile kullanılamaz rawveya relative. Referans .

Artık yerel saat dilimini kullanarak herhangi bir tarih biçimi isteyebilirsiniz . Görmek

Bkz. Taahhüt add00ba , taahhüt 547ed71 (03 Eylül 2015), Jeff King ( peff) .
(Tarafından Birleştirilmiş - Junio C Hamano gitster- içinde 7b09c45 taahhüt 2015 05 Eki)

Özellikle, yukarıdakilerden sonuncusu (add00ba taahhüdü):

date: " local" tarih biçimini dik yap:

" --date" Modlarımızın çoğu tarih biçimiyle ilgilidir: hangi öğeleri hangi sırayla gösteririz.
Ama " --date=local" biraz tuhaf bir oyun. "Tarihi normal biçimde, ancak yerel saat dilimini kullanarak göster" anlamına gelir.
Kullandığımız saat dilimi, gerçek biçime diktir ve "yerelleştirilmiş iso8601" vb.'ye sahip olmamamız için hiçbir neden yoktur.

Bu düzeltme eki " local" alanına " " boole alanı ekler struct date_modeve DATE_LOCALöğeyi date_mode_typenumaralandırmadan kaldırır (artık yalnızca DATE_NORMALartıdır local=1).
Yeni özelliğe, -localherhangi bir tarih moduna "(" iso-local"") ekleyerek kullanıcılar erişebilir ve geriye doğru uyumluluk localiçin " default-local" için " " takma adı olarak kalırız .


2
format-localİşlerin de olduğuna dikkat etmeliyim ! Bu nedenle, favori format ile yerel arasındaki gücü birleştirmek çok mükemmel.
acgtyrant

5

Biçim seçeneği %aiistediğim şeydi:

%ai: yazar tarihi, ISO 8601 benzeri biçim

--format="%ai"

5

Tarihe özel bir formatta ihtiyacım var.

Git 2.21 (1. Çeyrek 2019) ile, geçerli saatten ne kadar süre kaldığına bağlı olarak çıktısını değiştiren yeni bir tarih biçimi olan " --date=human" tanıtıldı .

" --date=auto", çıktı çağrı cihazına veya terminale giderken bu yeni formatı ve başka bir şekilde varsayılan formatı kullanmak için kullanılabilir.

Bkz 110a6a1 işlemek , b841d4f taahhüt (29 Ocak 2019) ve 038a878 taahhüt , 2fd7c22 taahhüt tarafından (21 Oca 2019) Stephen P. Smith ( ``) .
Bakınız Linus Torvalds ( ) tarafından kaydedilmiş acdd377 (18 Jan 2019 ) . (Göre Birleştirilmiş Junio Cı Hamano - - içinde işlemek ecbe1be , 7 Şubat 2019)torvalds
gitster

'İnsan' tarih formatı belgeleri ekleyin

Tarih ve saat bilgilerini, kişilerin diğer bağlamlarda tarih yazma şekline benzer bir biçimde görüntüleyin.
Yıl belirtilmezse, okuyucu verilen tarihin geçerli yıl olduğunu belirtir .

Gereksiz bilgileri görüntülemeyen okuyucu farklı bilgilere odaklanır .
Düzeltme eki git, komutun yürütüldüğü sırada komutu çalıştıran makinedeki tarihten çıkarılan bilgilere dayalı olarak göreli tarihleri ​​bildirir .

Biçim, çıkarılmış bilgiyi bırakarak insanlar için daha yararlı olsa da, aslında insan yapan hiçbir şey yoktur.
Eğer ' relative' tarih formatı henüz uygulanmamışsa, ' relative' kullanmak uygun olurdu.

humanTarih formatı testleri ekleyin .

humanBirkaç alan kullanılırken , referans tarih ile yerel bilgisayar tarihi arasındaki zaman farkına bağlı olarak bastırılır.

  • Farkın bir yıldan az olduğu durumlarda yıl alanı bastırılır.
  • Zaman bir günden az ise; ay ve yıl bastırılır.
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

## Önerilen ' auto' modunu ' auto:' ile değiştirin

humanYama , ' ' biçimini eklemenin yanı sıra auto, yapılandırma biçiminde insan biçimini belirtmek için alternatif bir yol olarak kullanılabilecek anahtar sözcüğü ekledi . 'Otomatik' kaldırıldığında ' human' biçim arayüzü temizlenir .

fooÇağrı cihazı auto:foosözdizimi kullanılarak kullanılıyorsa ' ' modunu belirleme özelliği eklendi .
Bu nedenle, ' auto:human' tarih modu human, çağrı cihazını kullanıyorsanız varsayılan olarak ayarlanır.
Böylece şunları yapabilirsiniz:

git config --add log.date auto:human

ve " git log" komutlarınız, komut dosyaları yazmadığınız sürece okunabilir biçimi gösterir.


Git 2.24 (4. Çeyrek 2019) kodu basitleştirdi.

Bkz 47b27c9 işlemek , 29f4332 taahhüt tarafından (12 Eyl 2019) ( ``) Stephen P. Smith .
(Tarafından Birleştirilmiş - Junio C Hamano gitster- içinde 36d2fca taahhüt 2019, 07 Eki)

'Şimdi' tarih koduna geçmeyi bırak

Teslim b841d4f (ekle humanbir ilave deney aleti, 2019-01-28, Git v2.21.0-rc0 biçimi) get_time()sağlar fonksiyon $GIT_TEST_DATE_NOWşimdiki zaman geçersiz kılmak için bir ortamda.
Bu nedenle, bu değişkeni artık yorumlamamız gerekmiyor cmd__date().

Bu nedenle, " now" parametresini tarih işlevlerinden geçirmeyi durdurabiliriz , çünkü kimse kullanmaz.
" now" Parametresini alan önceki tüm arayanların doğru şekilde kullanıldığından emin olmamız gerektiğini unutmayın get_time().


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]"

Ayrıntılı düşünmek ister misiniz? Ayrıca, cevabınızın zaten bir yazar alanı ve geçmişi var. imzalamaya gerek yok.
Kissaki

2

ISO benzeri bir formattan istediğiniz biçime dönüştürmek için Bash ve tarih komutunu kullanın. Bir kuruluş modu tarih biçimi (ve liste öğesi) istedim, bu yüzden bunu yaptım:

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

Ve sonuç, örneğin:

+ [2015-09-13 Sun 22:44] 2b0ad02e6cec Merge pull request #72 from 3b/bug-1474631
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.