Aku bertanya-tanya mengapa git memberitahuku ini :?
$ git diff MyFile.txt
diff --git a/MyFile.txt b/MyFile.txt
index d41a4f3..15dcfa2 100644
Binary files a/MyFile.txt and b/MyFile.txt differ
Bukankah itu file teks?
Saya telah memeriksa .gitattributes dan kosong. Mengapa saya menerima pesan ini? Saya tidak bisa mendapatkan difs seperti yang saya gunakan lagi
TAMBAH:
Saya perhatikan ada @
di dalam izin file, apa ini? Dapatkah ini menjadi alasan?
$ls -all
drwxr-xr-x 5 nacho4d staff 170 28 Jul 17:07 .
drwxr-xr-x 16 nacho4d staff 544 28 Jul 16:39 ..
-rw-r--r--@ 1 nacho4d staff 6148 28 Jul 16:15 .DS_Store
-rw-r--r--@ 1 nacho4d staff 746 28 Jul 17:07 MyFile.txt
-rw-r--r-- 1 nacho4d staff 22538 5 Apr 16:18 OtherFile.txt
ls
manual di Mac OS X: Jika file atau direktori memiliki atribut yang diperluas, bidang izin yang dicetak oleh-l
opsi diikuti oleh@
karakter . Gunakan opsi-@
untuk melihat atribut yang diperluas ini.vger.kernel.org
daftar, Anda tidak harus berlangganan untuk mengirim (orang akan membuat Anda mendapat CC'ed untuk jawaban) dan agaknya tidak diberi volume[email protected]
daftar yang cukup tinggi .Jawaban:
Ini hanya berarti bahwa ketika git memeriksa konten sebenarnya dari file (itu tidak tahu bahwa ekstensi yang diberikan bukan file biner - Anda dapat menggunakan file atribut jika Anda ingin mengatakannya secara eksplisit - lihat halaman manual).
Setelah memeriksa isi file, ia telah melihat hal-hal yang tidak dalam karakter ascii dasar. Menjadi UTF16 saya berharap itu akan memiliki karakter 'lucu' sehingga menganggapnya biner.
Ada beberapa cara untuk memberitahu git jika Anda memiliki internasionalisasi (i18n) atau format karakter yang diperluas untuk file tersebut. Saya tidak cukup yakin tentang metode yang tepat untuk pengaturan itu - Anda mungkin perlu RT [Lengkap] M ;-)
Sunting: pencarian cepat SO yang ditemukan can-i-make-git-mengenali-file-utf-16-sebagai-teks yang akan memberi Anda beberapa petunjuk.
sumber
.gitattributes
)..gitattributes
dll.Jika Anda belum menetapkan tipe file, Git mencoba menentukannya secara otomatis dan file dengan garis yang sangat panjang dan mungkin beberapa karakter lebar (mis. Unicode) diperlakukan sebagai biner. Dengan file .gitattributes Anda dapat menentukan bagaimana Git menafsirkan file. Mengatur atribut diff secara manual memungkinkan Git menginterkrip isi file sebagai teks dan akan melakukan diff biasa.
Cukup tambahkan .gitattributes ke folder root repositori Anda dan atur atribut diff ke paths atau file. Ini sebuah contoh:
Jika Anda ingin memeriksa apakah ada atribut yang ditetapkan pada file, Anda dapat melakukannya dengan bantuan git check-attr
Referensi bagus lainnya tentang atribut Git dapat ditemukan di sini .
sumber
diff
tidaktext
. Thetext
atribut tidak memberitahu git untuk diff menggunakan teks melainkan kontrol bagaimana akhir baris ditangani (normalisasi untuk LF). Lihat tautan Anda ke .gitattributes untuk lebih jelasnya.diff=xml
bukan hanyadiff
.Saya mengalami masalah ini ketika Git GUI dan SourceTree memperlakukan file Java / JS sebagai biner dan karenanya tidak dapat melihat perbedaan
Membuat file bernama "atribut" di folder .git \ info dengan konten berikut menyelesaikan masalah
Jika Anda ingin membuat perubahan ini untuk semua repositori maka Anda dapat menambahkan file atribut di lokasi berikut $ HOME / .config / git / atribut
sumber
<project-root>/.gitattributes
file, yang membuat perubahan aktif untuk semua kontributor, dan hanya untuk proyek yang relevan.* diff
bermanfaat bagi saya: ini menunjukkan perbedaan dalam semua jenis file. Tetapi solusi Anda lebih baik, karena menghindari menunjukkan perbedaan yang tidak perlu dalam file biner besar.Git bahkan akan menentukan bahwa itu adalah biner jika Anda memiliki satu baris super panjang dalam file teks Anda. Saya putus String panjang, mengubahnya menjadi beberapa baris kode sumber, dan tiba-tiba file berubah dari 'biner' menjadi file teks yang bisa saya lihat (di SmartGit).
Jadi jangan terus mengetik terlalu jauh ke kanan tanpa menekan 'Enter' di editor Anda - jika tidak nanti Git akan berpikir Anda telah membuat file biner.
sumber
Saya memiliki masalah yang sama setelah mengedit salah satu file saya di editor baru. Ternyata editor baru menggunakan pengkodean yang berbeda (Unicode) dari editor lama saya (UTF-8). Jadi saya hanya mengatakan kepada editor baru saya untuk menyimpan file saya dengan UTF-8 dan kemudian git menunjukkan perubahan saya dengan benar lagi dan tidak melihatnya sebagai file biner.
Saya pikir masalahnya hanya git yang tidak tahu bagaimana membandingkan file dari jenis pengkodean yang berbeda. Jadi tipe pengkodean yang Anda gunakan benar-benar tidak masalah, asalkan tetap konsisten.
Saya tidak mengujinya, tapi saya yakin jika saya hanya akan melakukan file saya dengan pengkodean Unicode baru, kali berikutnya saya membuat perubahan pada file itu akan menunjukkan perubahan dengan benar dan tidak terdeteksi sebagai biner, karena maka itu akan membandingkan dua file yang dikodekan Unicode, dan bukan file UTF-8 ke file Unicode.
Anda dapat menggunakan aplikasi seperti Notepad ++ untuk dengan mudah melihat dan mengubah jenis penyandian file teks; Buka file di Notepad ++ dan gunakan menu Encoding di bilah alat.
sumber
Saya memiliki masalah yang sama. Saya menemukan utas ketika saya mencari solusi di google, masih saya tidak menemukan petunjuk. Tapi saya pikir saya menemukan alasan setelah belajar, contoh di bawah ini akan menjelaskan dengan jelas petunjuk saya.
untuk saat ini, file new.txt dianggap sebagai file teks.
Anda akan mendapatkan hasil ini
dan coba ini
Anda akan mendapatkan di bawah ini
sumber
Kami memiliki kasus ini di mana file .html dilihat sebagai biner setiap kali kami mencoba membuat perubahan di dalamnya. Sangat tidak keren untuk tidak melihat diff. Sejujurnya, saya tidak memeriksa semua solusi di sini tetapi yang berhasil bagi kami adalah sebagai berikut:
git deletion
. Kata GitDeleted file with mode 100644 (Regular) Binary file differs
New file with mode 100644 (Regular) 1 chunk, 135 insertions, 0 deletions
File itu sekarang ditambahkan sebagai file teks biasaMulai sekarang, setiap perubahan yang saya buat dalam file dilihat sebagai perbedaan teks biasa. Anda juga dapat menekan komitmen ini (1, 2, dan 3 sebagai perubahan aktual yang Anda buat) tetapi saya lebih suka untuk dapat melihat di masa depan apa yang saya lakukan. Squashing 1 & 2 akan menampilkan perubahan biner.
sumber
Per jawaban yang bermanfaat ini , Anda dapat bertanya langsung kepada Git mengapa ia memperlakukan file dengan cara tertentu:
Ini menghasilkan keluaran yang bermanfaat seperti ini:
sumber
file
bukan perintah git. Ini adalah alat yang sepenuhnya terpisah yang dikemas dengan git di Windows. Apakah ada dokumentasi yang menunjukkan bahwa inilah yang digunakan git untuk deteksi file biner?Ini juga disebabkan (pada Windows setidaknya) oleh file teks yang memiliki UTF-8 dengan pengkodean BOM . Mengubah encoding ke UTF-8 biasa segera membuat Git melihat file sebagai type = teks
sumber
Saya memiliki contoh di mana
.gitignore
berisi\r
urutan ganda (carriage return) dengan sengaja.File itu diidentifikasi sebagai biner oleh git. Menambahkan
.gitattributes
file membantu.sumber
Jika
git check-attr --all -- src/my_file.txt
menunjukkan bahwa file Anda ditandai sebagai biner, dan Anda belum menetapkannya sebagai biner.gitattributes
, periksa di/.git/info/attributes
.sumber
Ubah Aux.js ke nama lain, seperti Sig.js.
Source tree masih menunjukkannya sebagai file biner, tetapi Anda bisa membuat stage (menambahkan) dan komit.
sumber
Saya memiliki masalah yang sama ketika saya menempelkan beberapa teks dari pesan biner Kafka, yang menyisipkan karakter yang tidak terlihat dan membuat git berpikir file tersebut biner.
Saya menemukan karakter yang menyinggung dengan mencari file menggunakan regex
[^ -~\n\r\t]+
.[
cocokkan karakter dalam set ini^
karakter yang cocok tidak ada di set ini-~
cocok dengan semua karakter dari '' (spasi) hingga '~'\n
garis baru\r
Kereta kembali\t
tab]
set dekat+
cocokkan satu atau lebih dari karakter inisumber
Saya hanya menghabiskan beberapa jam memeriksa semua yang ada di daftar ini mencoba mencari tahu mengapa salah satu proyek pengujian dalam solusi saya tidak menambahkan tes apa pun pada penjelajah.
Ternyata dalam kasus saya bahwa entah bagaimana (mungkin karena git miskin bergabung di suatu tempat) yang VS telah kehilangan referensi proyek sama sekali. Itu masih membangun tetapi saya perhatikan bahwa itu hanya membangun ketergantungan.
Saya kemudian memperhatikan bahwa itu tidak muncul dalam daftar dependensi itu sendiri, jadi saya menghapus dan menambahkan kembali proyek uji dan semua tes saya akhirnya muncul.
sumber