git diff menampilkan warna secara tidak benar

46

Untuk mendapatkan hasil berwarna dari semua perintah git, saya mengatur yang berikut:

git config --global color.ui true

Namun, ini menghasilkan output seperti ini untuk git diff,git log

tangkapan layar git diff

sedangkan perintah seperti git statusdisplay fine

tangkapan layar git status

Mengapa ia tidak mengenali kode warna yang lolos hanya dalam beberapa perintah dan bagaimana cara memperbaikinya?

Saya menggunakan iTerm 2 (tipe terminal xterm-256color) pada OS X 10.8.2 dan zsh sebagai shell saya

zsh --version
zsh 5.0.0 (x86_64-apple-darwin12.0.0)

git --version                                                                                                                      
git version 1.7.9.6 (Apple Git-31.1)
Gilles 'SANGAT berhenti menjadi jahat'
sumber

Jawaban:

65

Anda melihat urutan escape yang memberitahu terminal untuk mengubah warna yang ditampilkan dengan karakter escape ditampilkan ESC, sedangkan perilaku yang diinginkan adalah bahwa sequence escape memiliki efek yang diinginkan.

Perintah seperti git diffdan git logmenyalurkan outputnya ke pager , lesssecara default. Git mencoba memberi tahu lessuntuk memungkinkan karakter kontrol memiliki efek kontrolnya, tetapi ini tidak berfungsi untuk Anda.

Jika lesspager Anda tetapi Anda memiliki variabel lingkungan yang LESSdisetel ke nilai yang tidak termasuk -ratau -R, git tidak dapat memberi tahu lessuntuk menampilkan warna. Biasanya lewat LESS=-FRSX, tetapi tidak jika LESSsudah diatur di lingkungan. Perbaikan adalah untuk secara eksplisit melewatkan -Ropsi untuk memberitahu lessuntuk menampilkan warna ketika dipanggil oleh git:

git config --global core.pager 'less -R'

Jika lessbukan pager Anda, beralihlah ke lessatau cari tahu cara membuat warna pager Anda ditampilkan.

Jika Anda tidak ingin git menampilkan warna saat memunculkan pager, setel color.uike autobukan true.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Ah terima kasih. Sementara saya tahu bahwa lessperlu -Rmenampilkan warna, saya lupa itu git logdan git diffmenyalurkan output ke less. Terima kasih :)
5
Terima kasih! Saya tidak memperhatikan bahwa default ~/.profiledi FreeBSD punyaPAGER=more; export PAGER
Jeffrey Goldberg
Terima kasih. Saya telah LESSmenetapkan untuk -Kkarena saya suka bisa CTRL-Csegalanya. Saya pikir itu sesuatu yang funky dengan variabel itu, dan sekarang saya tahu cara memperbaikinya.
trysis
2

Memperbaiki jawaban Gilles , Anda dapat menyimpan $LESSopsi lama dengan menggunakan ini di konfigurasi git Anda (misalnya dalam ~/.gitconfig):

[core]
pager = less -+$LESS -FRX
quazgar
sumber
Jawaban quazgar bagus. Saya miliki LESS=-idi bashrc saya, Jadi saya harus melakukan pager `[core] = less $ KURANG -FR` Saya mengeluarkan X, karena dengan X, konten terminal saya yang ada terhapus, saya lebih suka konten terminal tetap.
Wayne Walker
1

Anda juga dapat melihat output ini jika Anda memiliki Busybox . Alpine Linux adalah contoh bagus dari distro populer yang menggunakannya. Lihat https://wiki.alpinelinux.org/wiki/Alpine_Linux:FAQ#How_to_enable.2Ffix_colors_for_git.3F

Cara mudah untuk mengetahui apakah Anda saat ini menggunakan Busybox adalah menjalankan:

realpath `which less`

Atau jika Anda menggunakan kulit ikan

realpath (which less)

Jika hasilnya /bin/busybox, maka Anda dapat memecahkan masalah Anda dengan menginstal gnu lebih sedikit .

Di Alpine:

sudo apk --update add less

Perintah akan berbeda tergantung pada Anda distro / manajer paket.

Christian Rondeau
sumber