Kadang dua file yang dibuka tidak berbeda satu karakter pun, tetapi diff mengatakan semua baris berubah, atau hanya baris pertama dan terakhir yang berbeda. Penyebabnya biasanya karakter yang tidak terlihat di layar. Artikel ini merangkum jenis-jenis "perbedaan tak terlihat" tersebut dan cara mengatasinya.
Karakter baris baru: CRLF, LF, CR
Konvensi pergantian baris berbeda-beda di tiap sistem operasi.
| Sebutan | Byte | Tempat umum dipakai |
|---|---|---|
| LF | 0A (\n) | Linux, macOS, sebagian besar alat pengembang |
| CRLF | 0D 0A (\r\n) | Banyak program Windows seperti Notepad, protokol internet seperti email dan HTTP |
| CR | 0D (\r) | Mac OS yang sangat lama (sebelum versi 9) |
Jika satu file disimpan dengan CRLF dan file lain dengan LF, saat dibandingkan per baris setiap akhir baris memiliki satu \r tak terlihat yang terhitung sebagai perbedaan, sehingga seluruh file tampak berubah. GNU diff dapat mengabaikan perbedaan ini dengan --strip-trailing-cr, dan git diff dengan --ignore-cr-at-eol.
Baris baru di akhir file
Menurut konvensi POSIX, baris dalam file teks diakhiri karakter baris baru. Karena itu banyak alat juga menambahkan baris baru setelah baris terakhir, tetapi sebagian editor tidak melakukannya. Perbedaan ini ditampilkan dalam unified diff seperti berikut.
@@ -1,2 +1,2 @@ host=example.com-port=8080\ No newline at end of file+port=8080
\ No newline at end of file berarti tidak ada baris baru di ujung baris tepat di atasnya. Pada contoh di atas isinya sama, dan baris baru terakhir hanya ditambahkan pada file setelah diubah. Banyak panduan gaya penulisan kode mewajibkan baris baru di akhir file, dan hal ini bisa diseragamkan dengan pengaturan editor "sisipkan baris baru di akhir file".
BOM: saat hanya baris pertama yang berbeda
Kadang di awal file UTF-8 terdapat tiga byte EF BB BF. Ini disebut penanda urutan byte (BOM). UTF-8 tidak memerlukan urutan byte, tetapi sebagian program menambahkannya sebagai tanda "file ini UTF-8". BOM tidak terlihat di layar, jadi jika dikatakan hanya baris pertama yang berbeda, curigailah BOM. Situs ini menghapus BOM di awal file saat memuatnya, dan jika opsi abaikan spasi diaktifkan, BOM (U+FEFF) di dalam teks yang ditempel juga diperlakukan seperti spasi.
Tab, spasi, dan spasi khusus
- Tab dan spasi: satu tab dan empat spasi bisa tampak sama di layar, tetapi keduanya karakter yang berbeda.
- Spasi tak terputus (NBSP, U+00A0): sering ikut masuk ke teks yang disalin dari halaman web atau pengolah kata.
- Spasi lebar penuh (U+3000): bisa masuk dari metode input bahasa Tionghoa, Jepang, dan Korea.
- Spasi lebar nol (U+200B): lebarnya nol sehingga sama sekali tidak terlihat, tetapi tetap dihitung sebagai karakter.
Sebagian besar karakter ini tersaring jika opsi abaikan spasi diaktifkan (namun karakter yang tidak digolongkan sebagai spasi, seperti U+200B, bisa tetap tersisa meskipun opsi aktif). Jika perbandingan dalam baris diganti ke karakter, sorotan akan menunjukkan di posisi mana karakter tak terlihat itu berada.
Normalisasi Unicode: huruf sama, byte berbeda
Huruf "é" dapat ditulis sebagai satu karakter (U+00E9) atau sebagai huruf e (U+0065) diikuti tanda aksen gabung (U+0301). Begitu pula suku kata Korea "가" bisa berupa satu karakter (U+AC00) atau gabungan huruf terpisah (U+1100 dan U+1161). Unicode menyebut bentuk pertama NFC dan bentuk kedua NFD (UAX #15). Kedua teks tampak sama persis di layar, tetapi saat dibandingkan merupakan karakter yang berbeda. Contoh yang umum adalah nama file yang dibuat di macOS: di sistem lain nama tersebut kadang tiba dalam bentuk terurai sehingga tidak cocok dengan nama yang terlihat sama. Solusinya adalah mengubah kedua sisi ke NFC sebelum dibandingkan.
Menyeragamkan baris baru di git
Jika repositori dikerjakan dari berbagai sistem operasi, baris baru bisa diseragamkan dengan pengaturan git.
core.autocrlf: jika diatur ketrue, LF diubah menjadi CRLF saat checkout dan CRLF menjadi LF saat commit (terutama di Windows).inputhanya mengubah CRLF menjadi LF saat commit..gitattributes: menetapkan aturan per repositori, sehingga hasilnya sama meskipun pengaturan tiap orang berbeda.
* text=auto
*.sh text eol=lf
*.bat text eol=crlf
text=auto menormalkan baris baru menjadi LF di dalam repositori untuk file yang dianggap git sebagai file teks, sedangkan eol=lf dan eol=crlf menentukan baris baru saat file dikeluarkan ke folder kerja.
Coba di alat ini
Opsi Normalkan akhir baris di Pembanding Teks aktif secara bawaan, sehingga CRLF, CR, dan LF dianggap baris baru yang sama dan ada tidaknya baris baru di akhir file diabaikan. Jika opsi ini dimatikan, CR di akhir baris ditampilkan sebagai ␍ dan baris tanpa baris baru terakhir sebagai ∅, sehingga perbedaan yang tadinya tak terlihat bisa dikenali. Opsi terkait spasi dirangkum di Opsi abaikan spasi, dan arti simbol pada hasil di Cara membaca unified diff.