Saya melacak file mesin virtual PC Virtual (* .vmc) di git, dan setelah melakukan perubahan git mengidentifikasi file tersebut sebagai biner dan tidak akan membedakannya untuk saya. Saya menemukan bahwa file itu dikodekan dalam UTF-16.
Bisakah git diajarkan untuk mengenali bahwa file ini adalah teks dan menanganinya dengan tepat?
Saya menggunakan git di bawah Cygwin, dengan core.autocrlf disetel ke false. Saya bisa menggunakan mSysGit atau git di bawah UNIX, jika perlu.
Ada solusi yang sangat sederhana yang berfungsi di luar kotak pada Unices.
Misalnya, dengan
.strings
file Apple, cukup:Buat
.gitattributes
file di root repositori Anda dengan:Tambahkan yang berikut ke
~/.gitconfig
file Anda :Sumber: Diff .strings file dalam Git (dan posting lama dari 2010).
sumber
iconv
adalah "alat lain" dengan cara yang sama seperti Vim atau Beyond Compare (bukan bagian dari git suite).vimdiff
daniconv
keduanya sudah ada di macOS sehingga Anda tidak perlu repot bertanya-tanya di mana mendapatkannya, dan mereka melakukan pekerjaanSudahkah Anda mencoba mengatur Anda
.gitattributes
untuk memperlakukannya sebagai file teks?misalnya:
Detail lebih lanjut di http://www.git-scm.com/docs/gitattributes.html .
sumber
set
dandiff
...*.vmc diff
,*.sql diff
dll. Diperlukan untuk mengatur atribut 'diff' untuk path yang ditentukan. (Saya tidak dapat mengedit jawabannya). Namun 2 peringatan: diff ditampilkan dengan spasi di antara masing-masing karakter, dan tidak mungkin untuk "stage hunk" atau "discus hunk" untuk file-file bermasalah.Secara default, sepertinya
git
tidak akan bekerja dengan baik dengan UTF-16; untuk file seperti itu Anda harus memastikan bahwa tidak adaCRLF
pemrosesan yang dilakukan padanya, tetapi Anda ingindiff
danmerge
berfungsi sebagai file teks biasa (ini mengabaikan apakah terminal / editor Anda dapat menangani UTF-16).Tetapi melihat
.gitattributes
manualnya , berikut adalah atribut khusus yaitubinary
:Jadi menurut saya Anda dapat mendefinisikan atribut khusus di tingkat atas Anda
.gitattributes
untukutf16
(perhatikan bahwa saya menambahkan gabungan di sini untuk memastikan itu diperlakukan sebagai teks):Dari sana Anda akan dapat menentukan
.gitattributes
sesuatu dalam file apa saja seperti:Perhatikan juga bahwa Anda masih bisa
diff
mendapatkan file, meskipungit
dianggap biner dengan:Edit
Jawaban ini pada dasarnya mengatakan bahwa GNU berbeda dengan UTF-16 atau bahkan UTF-8 tidak bekerja dengan baik. Jika Anda ingin
git
menggunakan alat yang berbeda untuk melihat perbedaan (via--ext-diff
), jawaban itu menyarankan Guiffy .Tapi apa yang Anda butuhkan mungkin hanya untuk
diff
file UTF-16 yang hanya berisi karakter ASCII. Cara untuk membuatnya berfungsi adalah dengan menggunakan--ext-diff
dan skrip shell berikut:Perhatikan bahwa mengonversi ke UTF-8 mungkin bekerja untuk penggabungan juga, Anda hanya perlu memastikan itu dilakukan di kedua arah.
Adapun output ke terminal ketika melihat perbedaan file UTF-16:
GNU diff tidak terlalu peduli tentang unicode, jadi ketika Anda menggunakan diff --text itu hanya diffs dan menampilkan teks. Masalahnya adalah bahwa terminal yang Anda gunakan tidak dapat menangani UTF-16 yang dipancarkan (dikombinasikan dengan tanda diff yang merupakan karakter ASCII).
sumber
Solusinya adalah dengan menyaring
cmd.exe /c "type %1"
. cmd'stype
builtin akan melakukan konversi, sehingga Anda dapat menggunakannya dengan kemampuan textconv dari git diff untuk mengaktifkan pembedaan teks dari file UTF-16 (harus bekerja dengan UTF-8 juga, walaupun belum diuji).Mengutip dari halaman manual gitattributes:
Melakukan perbedaan teks dari file biner
Kadang-kadang diinginkan untuk melihat perbedaan versi teks-dikonversi dari beberapa file biner. Misalnya, dokumen pengolah kata dapat dikonversi ke representasi teks ASCII, dan perbedaan teks yang ditampilkan. Meskipun konversi ini kehilangan beberapa informasi, perbedaan yang dihasilkan berguna untuk dilihat manusia (tetapi tidak dapat diterapkan secara langsung).
Opsi konfigurasi textconv digunakan untuk menentukan program untuk melakukan konversi tersebut. Program harus mengambil argumen tunggal, nama file yang akan dikonversi, dan menghasilkan teks yang dihasilkan pada stdout.
Misalnya, untuk memperlihatkan perbedaan informasi exif dari file dan bukan dengan informasi biner (dengan asumsi Anda menginstal alat exif), tambahkan bagian berikut ke
$GIT_DIR/config
file Anda (atau$HOME/.gitconfig
file):Sebuah solusi untuk mingw32 , penggemar cygwin mungkin harus mengubah pendekatannya. Masalahnya adalah dengan meneruskan nama file untuk dikonversi ke cmd.exe - itu akan menggunakan garis miring ke depan, dan cmd mengasumsikan pemisah direktori backslash.
Langkah 1:
Buat skrip argumen tunggal yang akan melakukan konversi ke stdout. c: \ path \ to \ some \ script.sh:
Langkah 2:
Atur git untuk dapat menggunakan file skrip. Di dalam konfigurasi git Anda (
~/.gitconfig
atau.git/config
atau lihatman git-config
), menempatkan ini:Langkah 3:
Tunjukkan file untuk menerapkan workarond ini dengan menggunakan file .gitattributes (lihat man gitattributes (5)):
kemudian gunakan
git diff
pada file Anda.sumber
cmd //c type "${1//\//\\}"
.textconv = powershell -NoProfile -Command \"& {Get-Content \\$args[0]}\"
git baru-baru ini mulai memahami pengkodean seperti utf16. Lihat dokumentasi gitattributes , cari
working-tree-encoding
[Pastikan halaman manualmu cocok karena ini cukup baru!]
Jika (katakanlah) file tersebut adalah UTF-16 tanpa BOM pada mesin Windows kemudian tambahkan ke
.gitattributes
file AndaJika UTF-16 (dengan bom) pada * nix membuatnya:
(Ganti
*.vmc
dengan*.whatever
untukwhatever
jenis file yang perlu Anda tangani)Lihat: Mendukung pengkodean pohon-kerja "UTF-16LE-BOM" .
Ditambahkan nanti
Mengikuti @ Hacklash, orang mungkin menemukan bahwa ini tidak cukup
Untuk mendapatkan perbedaan teks yang Anda butuhkan
Puting keduanya bekerja juga
Tapi itu bisa dibilang
eol=...
menyiratkantext
Masalah
Git memiliki atribut makro
binary
yang artinya-text -diff
. Sebaliknya+text +diff
tidak tersedia built-in tetapi git memberikan alat (saya pikir!) Untuk mensintesisnyaSolusinya
Git memungkinkan seseorang untuk mendefinisikan atribut makro baru.
Saya akan mengusulkan bagian atas
.gitattributes
file yang Anda milikiKemudian untuk semua jalur yang perlu dilakukan adalah teks dan diff
Perhatikan bahwa dalam kebanyakan kasus, kita menginginkan penyandian default (utf-8) dan default eol (asli) dan karenanya dapat dihapus.
Sebagian besar garis akan terlihat seperti
Mengapa tidak menggunakan diff saja?
Praktis: Dalam kebanyakan kasus, kami menginginkan asli eol. Yang berarti tidak
eol=...
. Jaditext
tidak akan tersirat dan perlu dimasukkan secara eksplisit.Konseptual: Teks Vs biner adalah perbedaan mendasar. eol, encoding, diff dll hanyalah beberapa aspeknya.
Penolakan
Karena masa aneh yang kita tinggali, aku tidak punya mesin dengan git yang berfungsi saat ini. Jadi saya saat ini tidak dapat memeriksa penambahan terbaru. Jika seseorang menemukan sesuatu yang salah, saya akan memperbaiki / menghapus.
sumber
*.vmc diff working-tree-encoding=UTF-16LE-BOM eol=CRLF
text
sendirian Anda tidak mendapatkan perbedaan teks yang bagus? Bisakah Anda memeriksanya dengan keduanyatext
dandiff
semuanya berfungsi dengan baik? Dalam hal ini saya akan membuat rekomendasi yang berbedatext
hasil saja dalam membandingkan biner. Aku bisa melakukannyadiff
atautext diff
dan bekerja. Saya perlu menambahkan-BOM
hanya karena file saya punya BOM, YMMV.Saya telah menulis driver git-diff kecil
to-utf8
,, yang seharusnya memudahkan untuk melakukan diff file non-ASCII / UTF-8. Anda dapat menginstalnya menggunakan instruksi di sini: https://github.com/chaitanyagupta/gitutils#to-utf8 (to-utf8
skrip tersedia dalam repo yang sama).Perhatikan bahwa skrip ini membutuhkan keduanya
file
daniconv
perintah harus tersedia di sistem.sumber
Punya masalah ini pada Windows baru-baru ini, dan
dos2unix
danunix2dos
sampah yang dikirimkan dengan git untuk windows melakukan trik. Secara default mereka berlokasi diC:\Program Files\Git\usr\bin\
. Perhatikan ini hanya akan berfungsi jika file Anda tidak perlu UTF-16. Sebagai contoh, seseorang secara tidak sengaja menyandikan file python sebagai UTF-16 ketika tidak perlu (dalam kasus saya).dan
sumber