Mewarnai ruang putih pada output git-diff

151

Mengenai pemformatan kode saya agak murni :). Saya sangat sering menghilangkan spasi putih yang tidak perlu (garis dengan hanya ws, ws di akhir baris dll). Saya bahkan telah mengatur vim untuk menunjukkan garis-garis semacam itu yang diwarnai merah.

Masalah saya adalah bahwa menggunakan git-diff saya sering melihat sesuatu seperti ini:

-      else{ 
+      else{

Bahkan jika saya memiliki git-diff berwarna saya tidak dapat melihat perbedaan (dalam situasi tertentu saya menghapus 1 ws di akhir baris). Apakah ada cara untuk memberitahu git-diff untuk menunjukkan bahwa kita diwarnai merah? (misalnya yang cocok dengan / \ s + $ / regexp).

radarek
sumber
4
Jika Anda membalikkan warna (swap foreground dan background), perubahan spasi putih seperti ini akan muncul. Cara mudah untuk mencapai ini di banyak terminal adalah dengan menyorot teks yang dimaksud dengan mouse. Trik ini hanya bekerja dengan diff berwarna, tentu saja.
Phlarx

Jawaban:

172

Anda mungkin perlu mengatur pengaturan konfigurasi color.diff.whitespace, misalnya dengan:

 git config color.diff.whitespace "red reverse"

(Saya berasumsi bahwa Anda sudah memiliki color.diffatau color.uimengatur autosejak Anda mengatakan bahwa Anda melihat tambalan berwarna dari git difftetap.)

Jika Anda ingin memperbaiki jenis kesalahan spasi putih yang disorot dalam warna merah, Anda kemudian dapat mengubah core.whitespace, tetapi blank-at-eoldiaktifkan secara default sehingga Anda mungkin tidak perlu mengubahnya untuk contoh yang Anda sebutkan.

Sumber kebingungan yang mungkin adalah bahwa dalam output git diff, kesalahan spasi putih hanya disorot pada baris yang diperkenalkan, bukan yang dihapus. ( Pembaruan: seperti yang ditunjukkan Paul Whittaker dalam jawabannya , yang harus Anda pilih :), Anda dapat melihatnya dengan membalikkan arti dari diff git diff -R.)

Anda dapat menemukan lebih banyak dokumentasi tentang opsi-opsi konfigurasi ini di halaman manual git config

Jika Anda tidak ingin menggunakan -Rkludge, Anda dapat menggunakan opsi Sorotan Kesalahan WhiteSpace dari halaman manual yang berbeda .

--ws-error-highlight =

Sorot kesalahan spasi putih pada garis yang ditentukan oleh dalam warna yang ditentukan oleh color.diff.whitespace. adalah daftar yang dipisahkan koma dari konteks lama, baru,. Ketika opsi ini tidak diberikan, hanya kesalahan spasi putih di baris baru yang disorot. Misalnya --ws-error-highlight = baru, sorotan lama whitespace kesalahan pada baris yang dihapus dan ditambahkan. semua dapat digunakan sebagai kependekan dari konteks lama, baru, dan baru.

git diff --ws-error-highlight=new,old <file>

atau

git diff --ws-error-highlight=all <file>

Saya tidak tahu cara untuk mengaktifkannya secara permanen dan menyimpannya di konfigurasi selain menggunakan alias:

git config alias.df 'diff --ws-error-highlight=all'

Sekarang Anda dapat menggunakan:

git df <file>

Untuk melihat perubahan warna merah.

Perhatikan bahwa dengan Git 2.11 (Q4 2016) , alias ini mungkin diganti dengan:

git config diff.wsErrorHighlight all

Lihat dokumen terusgit diff dan terusgit config .

Mark Longair
sumber
33
"Sumber kebingungan yang mungkin adalah bahwa dalam output git diff, kesalahan spasi putih hanya disorot dalam baris yang diperkenalkan, bukan yang dihapus." Persis! Dan tidak ada cara untuk menunjukkannya juga untuk garis yang dihapus? (hei, ini beda :))
radarek
6
Tambahkan --global untuk diset di ~ / .gitconfig
simlmx
17
@radarek: Anda dapat menggunakan opsi sebaliknya:git diff -R
blueyed
6
Apakah ada laporan bug untuk ini? Jika tidak, sepertinya harus ada.
Ajedi32
3
ini berhasil git config diff.wsErrorHighlight all. Gunakan git config --global [...]untuk membuat perubahan global (yaitu mempengaruhi semua repo).
Felipe Alvarez
141

Gunakan git diff -Runtuk mengubah garis yang dihapus menjadi garis yang ditambahkan. Kemudian spasi spasi tambahan akan disorot.

(Ini mengasumsikan Anda sudah mengaktifkan hightlighting spasi putih, sesuai pengaturan warna dari jawaban Markus. Kredit untuk metode ini masuk ke pos Junio ​​di http://git.661346.n2.nabble.com/Highlighting-whitespace-on-removal- dengan-git-diff-td5653205.html .)

Sebagai contoh, ketika mengkonversi file dari akhir baris DOS ke Unix, git diff -Rjelas menunjukkan kepada saya ^Mkarakter (dis) muncul di ujung baris. Tanpa -R(dan juga tanpa -wdll.) Itu menunjukkan bahwa seluruh file telah berubah, tetapi tidak menunjukkan caranya.

Paul Whittaker
sumber
4
Tentu saja, Anda juga dapat melakukannya git diff | cat -A | less -Sjika Anda putus asa, tetapi selain pengembalian carriage, ia catjuga akan menampilkan warna apa pun yang menyoroti kode pelarian secara harfiah.
Paul Whittaker
3
@ Paul_Whittaker cat -Atidak portabel. Pada kucing BSD, tidak ada opsi seperti itu. Silakan gunakan cat -vetsebagai gantinya.
7heo.tk
9

Gunakan git diff --color | less -R. Itu -Rmembuat kode kontrol warna ramah manusia.

Kemudian Anda dapat menggunakan lesspencarian ekspresi reguler, mis

/[[:space:]]+$
Kelvin
sumber
Ekspresi reguler ini juga berfungsi vim, omong-omong.
Jose Alban
Ide terakhir ini less -Rhanya membuat lebih mudah bagi saya untuk pipa ls --colormelalui less.
Menachem
0

Versi saya git diffsudah sepertinya melakukan ini - Saya punya git 1.7.4.1 dan telah ditetapkan color.ui = auto.

pendatang
sumber
12
Saya baru saja menguji dengan git 1.7.5.1 dan tentu saja tidak menyoroti spasi spasi di garis yang dihapus.
Infiltrator