Warnai di git-log

106

Ketika Anda menjalankan git log --decorate --pretty=onelineoutput akan memiliki entri seperti (HEAD, refs/published/master, master)pewarnaan.

Saya juga memiliki yang berikut ini di gitconfig saya:

[color "branch"]
    current = yellow reverse
    local = yellow
    remote = green

Bagaimana Anda mereplikasi warna-warna tersebut saat melakukan format kustom seperti berikut?

git log --decorate --stat --graph --pretty=format:"%d %Cgreen%h%Creset (%ar - %Cred%an%Creset), %s%n"
NorthIsUp
sumber

Jawaban:

91

Mulai git 1.8.3 (24 Mei 2013), Anda dapat menggunakan %C(auto)untuk menghias %ddalam format string git log.

Dari catatan rilis :

 * "git log --format" specifier learned %C(auto) token that tells Git
   to use color when interpolating %d (decoration), %h (short commit
   object name), etc. for terminal output.)
Elad Shahar
sumber
60

Ini git log --decorateakan dimasukkan secara default:

  • HEAD dalam warna cyan
  • cabang terpencil dengan warna merah
  • tag berwarna hijau

dan dapat diubah melalui color.decorateconfig.

Tetapi git log --formattidak menawarkan cara untuk menampilkan secara khusus HEAD atau remote atau cabang: ketiganya ditampilkan melalui %d, dengan satu warna mungkin.


Perbarui Mei 2013, seperti yang disebutkan di bawah ini oleh Elad Shahar (suara positif), git 1.8.3 menawarkan satu opsi lagi:

git log –formatsekarang menggunakan %C(auto)token yang memberitahu Git untuk menggunakan warna saat menyelesaikan %d(dekorasi), %h(nama objek komit pendek), dll. untuk keluaran terminal.

Posting blog Atlassian ini berkomentar bahwa fitur ini adalah bagian dari beberapa fitur lainnya yang berfokus pada format ( git rebase, git count-objects) dan warna ( git branch -vv)

Ini datang sebagai tambahan dari auto,reset1.8.2 sebelumnya , yang secara otomatis menonaktifkan warna ketika output tidak digunakan untuk terminal1

%C(auto,blue)Hello%C(auto,reset)

Catatan: git 2.4+ (Q2 2015) akan melakukan pekerjaan yang lebih baik untuk mengatur ulang warna di sekitar nama cabang.
Lihat commit 5ee8758 oleh Junio ​​C Hamano ( gitster) :

log --decorate: jangan membocorkan warna "commit" ke item berikutnya

Dalam " git log --decorate", Anda akan melihat header komit seperti ini:

commit ... (HEAD, jc/decorate-leaky-separator-color)

di mana " commit ... (" dilukis color.diff.commit, " HEAD" di color.decorate.head, " ," di color.diff.commit, nama cabang di color.decorate.branchdan kemudian menutup " )" di color.diff.commit.

Jika Anda ingin mengecat HEAD dan nama cabang lokal dengan warna yang sama dengan teks tubuh (mungkin karena cyan dan hijau terlalu redup pada terminal hitam-putih untuk dapat dibaca), Anda tidak ingin mengatakannya

[color "decorate"]
    head = black
    branch = black

karena Anda tidak akan dapat menggunakan kembali konfigurasi yang sama pada terminal putih-hitam. Anda akan berharap secara naif

[color "decorate"]
    head = normal
branch = normal

untuk bekerja, tapi sayangnya tidak.
Ini melukis string " HEAD" dan nama cabang dengan warna yang sama seperti tanda kurung buka atau koma di antara elemen dekorasi.
Ini karena kode lupa menyetel ulang warna setelah mencetak "awalan" dengan warnanya sendiri.


Perhatikan bahwa git 2.5 (Q2 2015) memperbaiki bug:

Lihat commit 429ad20 oleh Junio ​​C Hamano ( gitster) , 13 Mei 2015.
(Digabung oleh Junio ​​C Hamano - gitster- dalam commit fd70780 , 22 Mei 2015)

log: jangan mempersingkat nama dekorasi terlalu dini

Peningkatan " log --decorate" di Git 2.4 yang menunjukkan komit di ujung cabang saat ini misalnya " HEAD -> master", tidak bekerja dengan --decorate = full.


Git 2.9.x + (Q3 2016) akan memperbaiki bug dan kehormatan color=autountuk%C(auto)


Git 2.10.2 (Okt. 2016) memperbaiki bug lain dengan commit 82b83da (29 Sep 2016), dan commit c99ad27 (17 Sep 2016) oleh René Scharfe (``) .
(Digabung oleh Junio ​​C Hamano - gitster- di commit 76796d4 , 28 Okt 2016)

pretty: hindari menambahkan reset %C(auto)jika output kosong

Kami mengeluarkan urutan escape untuk menyetel ulang warna dan atribut untuk %C(auto)memastikan pewarnaan otomatis ditampilkan sebagaimana dimaksud.
Berhenti melakukan itu jika output strbuf kosong , yaitu ketika %C(auto)muncul di awal format string, karena tidak perlu reset dan kami menyimpan beberapa byte pada output.

pretty: biarkan %C(auto)setel ulang semua atribut

Ulang warna dan atribut pada %C(auto)untuk mengaktifkan kontrol otomatis penuh atas mereka; jika tidak, atribut seperti tebal atau terbalik masih bisa berlaku dari %Cplaceholder sebelumnya .

VonC
sumber
3
apakah tidak ada cara untuk menggunakan --decorate dan --pretty = "... stuff"?
NorthIsUp
8
@NorthlsUp: --decoratetampaknya memiliki implementasi dan konfigurasinya sendiri, sementara --prettymenawarkan informasi yang sama melalui %dsebagai satu blok, yang berarti Anda tidak dapat memiliki tingkat konfigurasi warna yang sama dengan yang --prettyAnda miliki --decorate.
VonC
Satu-satunya perbedaan yang saya lihat ketika saya menambahkan "--decorate" setelah "git log" adalah repo dimulai dengan "refs / heads / ..." atau "refs / remote ...". Warnanya muncul dengan cara apa pun. Tahu apa yang menyebabkan ini? Alasan saya bertanya adalah .gitconfig saya tidak menunjukkan properti warna apa pun. Saya bertanya-tanya di mana saya bisa menemukan properti "color.decorate" saya. Saya tidak melihatnya di file .gitconfig saya.
J Woodchuck
@JWoodchuck Coba git config --show-origin -l: Anda akan melihat semua konfigurasi Anda. Anda kemudian dapat grep untuk "warna".
VonC
Ya, tidak ada yang muncul ketika saya grep untuk warna, yang membuat pengaturan muncul begitu misterius.
J Woodchuck
9

Buat mereka menjadi kurung:

%C(...): color specification, as described in color.branch.* config option

Jadi %C(yellow reverse)akan berhasil.

Josh Lee
sumber
1
tidak cukup, %dapakah semua cabang jadi akan terlihat seperti (HEAD, master), dalam hal ini head harus biru dan master harus hijau (saya yakin itu adalah warna default). di mana %C(yellow)%d%Cresetakan membuatnya menjadi warna yang sama.
NorthIsUp
2
Oh, mewarnai dekorasi individu. Saya pikir itu tidak mungkin. Kode untuk membuat entri log pada dasarnya diterapkan dua kali.
Josh Lee
1
Sayang sekali ini tidak mungkin ... Saya akan senang melakukannyagit log --decorate --oneline --date=...
mgalgs
8

Opsi konfigurasi log.decoratedapat mengaktifkan / menonaktifkan dekorasi default di log.

git config --global log.decorate full

Setelah selesai, Anda dapat menggunakannya color.decorate.*untuk bermain-main dengan warna

Henrik Gustafsson
sumber
3
log.decorate=fullmenyebabkan nama ref dicetak dengan awalannya ( refs/heads/, dll.); Saya merasa log.decorate=shortlebih berguna.
musiphil
1
Pengaturan yang sangat berguna, meskipun saya juga lebih shortsuka daripadafull
Thomas Levesque
4

Beberapa mungkin ingin menggunakan ini: %C(colorname) Ini tidak perlu mengubah konfigurasi warna.

Contoh: Mewarnai nama penulis dengan warna kuning

--pretty=format:"%C(yellow)%an%Creset"

Warna ANSI biasa harus berfungsi https://en.wikipedia.org/wiki/ANSI_escape_code

  • hitam
  • merah
  • hijau
  • kuning
  • biru
  • magenta
  • cyan
  • putih
NullPointerWizard
sumber