Ketika melakukan git diff
itu dikatakan "Tidak ada baris baru di akhir file" .
Oke, tidak ada baris baru di akhir file. Apa masalahnya?
Apa pentingnya pesan itu dan apa yang ingin disampaikannya kepada kami?
Ketika melakukan git diff
itu dikatakan "Tidak ada baris baru di akhir file" .
Oke, tidak ada baris baru di akhir file. Apa masalahnya?
Apa pentingnya pesan itu dan apa yang ingin disampaikannya kepada kami?
Jawaban:
Ini menunjukkan bahwa Anda tidak memiliki baris baru (biasanya '\n'
, alias CR atau CRLF) di akhir file.
Artinya, cukup berbicara, byte terakhir (atau byte jika Anda menggunakan Windows) dalam file tersebut bukan baris baru.
Pesan ditampilkan karena jika tidak, tidak ada cara untuk mengetahui perbedaan antara file di mana ada baris baru di akhir dan di mana tidak. Diff harus mengeluarkan baris baru, atau hasilnya akan lebih sulit untuk dibaca atau diproses secara otomatis.
Perhatikan bahwa ini adalah gaya yang baik untuk selalu menempatkan baris baru sebagai karakter terakhir jika diizinkan oleh format file. Lebih jauh, misalnya, untuk file header C dan C ++ diperlukan oleh standar bahasa.
Ini bukan hanya gaya yang buruk, itu dapat menyebabkan perilaku yang tidak terduga saat menggunakan alat lain pada file.
Ini adalah test.txt
:
first line
second line
Tidak ada karakter baris baru di baris terakhir. Mari kita lihat berapa banyak baris dalam file:
$ wc -l test.txt
1 test.txt
Mungkin itu yang Anda inginkan, tetapi dalam kebanyakan kasus Anda mungkin berharap ada 2 baris dalam file.
Juga, jika Anda ingin menggabungkan file, mungkin tidak berlaku seperti yang Anda harapkan:
$ cat test.txt test.txt
first line
second linefirst line
second line
Akhirnya, itu akan membuat diff Anda sedikit lebih berisik jika Anda menambahkan baris baru. Jika Anda menambahkan baris ketiga, itu akan menampilkan suntingan ke baris kedua serta tambahan baru.
Satu-satunya alasan adalah bahwa Unix secara historis memiliki konvensi dari semua file teks yang dapat dibaca manusia yang diakhiri dengan baris baru. Pada saat itu, ini menghindari pemrosesan ekstra ketika menampilkan atau menggabungkan file teks, dan menghindari memperlakukan file teks secara berbeda untuk file yang berisi jenis data lain (misalnya data biner mentah yang tidak dapat dibaca manusia).
Karena konvensi ini, banyak alat dari era itu mengharapkan baris akhir, termasuk editor teks, alat diffing, dan alat pemrosesan teks lainnya. Mac OS X dibangun di atas BSD Unix, dan Linux dikembangkan agar kompatibel dengan Unix, sehingga kedua sistem operasi ini mewarisi konvensi, perilaku, dan alat yang sama.
Windows tidak dikembangkan untuk menjadi Unix-kompatibel, sehingga tidak memiliki konvensi yang sama, dan sebagian besar perangkat lunak Windows akan berurusan dengan baik tanpa baris baru.
Tetapi, sejak Git dikembangkan untuk Linux terlebih dahulu, dan banyak perangkat lunak open-source dibangun di atas sistem yang kompatibel dengan Unix seperti Linux, Mac OS X, FreeBSD, dll, sebagian besar komunitas open-source dan alat-alat mereka (termasuk bahasa pemrograman) terus berlanjut untuk mengikuti konvensi ini.
Ada alasan teknis yang masuk akal pada tahun 1971, tetapi di era ini kebanyakan konvensi dan mempertahankan kompatibilitas dengan alat yang ada.
Jika Anda menambahkan baris teks baru di akhir file yang sudah ada yang belum memiliki newline character
di akhir, diff akan menunjukkan baris terakhir yang lama telah dimodifikasi, meskipun secara konseptual tidak.
Ini setidaknya satu alasan bagus untuk menambahkan newline character
di akhir.
File berisi:
A() {
// do something
}
Hexdump:
00000000: 4128 2920 7b0a 2020 2020 2f2f 2064 6f20 A() {. // do
00000010: 736f 6d65 7468 696e 670a 7d something.}
Anda sekarang mengeditnya
A() {
// do something
}
// Useful comment
Hexdump:
00000000: 4128 2920 7b0a 2020 2020 2f2f 2064 6f20 A() {. // do
00000010: 736f 6d65 7468 696e 670a 7d0a 2f2f 2055 something.}.// U
00000020: 7365 6675 6c20 636f 6d6d 656e 742e 0a seful comment..
Dif git akan menampilkan:
-}
\ No newline at end of file
+}
+// Useful comment.
Dengan kata lain, ini menunjukkan perbedaan yang lebih besar daripada yang terjadi secara konseptual. Ini menunjukkan bahwa Anda menghapus baris }
dan menambahkan baris }\n
. Ini sebenarnya adalah apa yang terjadi, tetapi bukan itu yang terjadi secara konseptual , sehingga dapat membingungkan.
Alasan konvensi ini dipraktikkan adalah karena pada sistem operasi mirip UNIX karakter baris baru diperlakukan sebagai terminator garis dan / atau batas pesan (ini termasuk pemipaan antara proses, penyangga garis, dll.).
Pertimbangkan, misalnya, bahwa file dengan karakter baris baru diperlakukan sebagai satu baris kosong. Sebaliknya, file dengan panjang nol byte sebenarnya adalah file kosong dengan garis nol. Ini dapat dikonfirmasi sesuai denganwc -l
perintah.
Secara keseluruhan, perilaku ini masuk akal karena tidak akan ada cara lain untuk membedakan antara file teks kosong versus file teks dengan satu baris kosong jika \n
karakternya hanya pemisah baris daripada pemisah garis. Dengan demikian, file teks yang valid harus selalu diakhiri dengan karakter baris baru. Satu-satunya pengecualian adalah jika file teks dimaksudkan untuk kosong (tanpa baris).
Ada satu hal yang tidak saya lihat dalam tanggapan sebelumnya. Peringatan tentang tidak ada end-of-line bisa menjadi peringatan ketika sebagian file telah terpotong. Ini bisa menjadi gejala hilangnya data.
Masalah inti adalah apa yang Anda tentukan baris dan apakah urutan karakter end-on-line adalah bagian dari baris atau tidak. Editor berbasis UNIX (seperti VIM) atau alat (seperti Git) menggunakan urutan karakter EOL sebagai terminator garis, oleh karena itu bagian dari baris. Ini mirip dengan penggunaan titik koma (;) di C dan Pascal. Dalam C titik koma mengakhiri pernyataan, dalam Pascal itu memisahkan mereka.
Ini sebenarnya menyebabkan masalah karena ujung baris secara otomatis memodifikasi file yang kotor tanpa membuat perubahan. Lihat posting ini untuk resolusi.
File sumber sering digabungkan dengan alat (C, C ++: file header, Javascript: bundlers). Jika Anda menghilangkan karakter baris baru, Anda bisa memperkenalkan bug jahat (di mana baris terakhir dari satu sumber disatukan dengan baris pertama dari file sumber berikutnya). Mudah-mudahan semua alat kode sumber concat di luar sana menyisipkan baris baru di antara file-file bersatu tetapi itu tidak selalu terjadi.
Inti masalahnya adalah - di sebagian besar bahasa, baris baru memiliki makna semantik dan file akhir bukanlah alternatif yang ditentukan bahasa untuk karakter baris baru. Jadi, Anda harus mengakhiri setiap pernyataan / ekspresi dengan karakter baris baru - termasuk yang terakhir.
//
komentar gaya di tengah kode.
File asli Anda mungkin tidak memiliki karakter baris baru.
Namun, beberapa editor menyukai gedit di linux diam-diam menambahkan baris baru di akhir file. Anda tidak dapat menyingkirkan pesan ini saat menggunakan editor semacam ini.
Apa yang saya coba atasi masalah ini adalah membuka file dengan editor kode studio visual
Editor ini dengan jelas menunjukkan baris terakhir dan Anda dapat menghapus baris sesuai keinginan.
Untuk apa nilainya, saya menemukan ini ketika saya membuat proyek IntelliJ pada Mac, dan kemudian memindahkan proyek ke mesin Windows saya. Saya harus membuka setiap file secara manual dan mengubah pengaturan penyandian di bagian kanan bawah jendela IntelliJ. Mungkin tidak terjadi pada kebanyakan orang jika ada yang membaca pertanyaan ini tetapi itu bisa menyelamatkan saya beberapa jam kerja ...