Saya mencoba membuat tambalan dengan perintah
git diff sourcefile >/var/lib/laymab/overlay/category/ebuild/files/thepatch.patch
ketika saya menerapkan tambalan, itu memberi saya
$ patch -v
GNU patch 2.7.5
$ /usr/bin/patch -p1 </var/lib/laymab/overlay/category/ebuild/files/thepatch.patch
patching file sourcefile
Hunk #1 FAILED at 1 (different line endings).
Hunk #2 FAILED at 23 (different line endings).
Hunk #3 FAILED at 47 (different line endings).
Hunk #4 FAILED at 65 (different line endings).
Hunk #5 FAILED at 361 (different line endings).
5 out of 5 hunks FAILED -- saving rejects to file sourcefile.rej
Saya mencoba menerapkan dos2unix pada file src dan patch file, tetapi pesannya tidak hilang ...
UPD: --ignore-whitespace tidak membantu juga
PATCH COMMAND: patch -p1 -g0 -E --no-backup-if-mismatch --ignore-whitespace --dry-run -f < '/var/lib/layman/dotnet/dev-dotnet/slntools/files/remove-wix-project-from-sln-file-v2.patch'
=====================================================
checking file Main/SLNTools.sln
Hunk #1 FAILED at 14 (different line endings).
Hunk #2 FAILED at 49 (different line endings).
Hunk #3 FAILED at 69 (different line endings).
Hunk #4 FAILED at 102 (different line endings).
4 out of 4 hunks FAILED
UPD: menemukan artikel yang sangat bagus: /programming//a/4425433/1709408
sed -i.bak -e 's/\r$//g' something
. Saya tidak berpikir dos2unix menangani campuran end-of-line seagresif yang Anda inginkan.Jawaban:
Saya memiliki masalah yang sama menggunakan
patch
perintah yang datang dengan MSYS2 di Windows. Dalam kasus saya, kedua file sumber dan tambalan memiliki akhiran garis CRLF, dan mengubah keduanya menjadi LF juga tidak berhasil. Apa yang berhasil adalah sebagai berikut:patch
akan mengkonversi akhir baris menjadi LF pada semua file yang ditambal, jadi perlu untuk mengubahnya kembali ke CRLF.Obs:
patch
versi yang saya gunakan adalah 2.7.5sumber
Anda biasanya dapat mengatasi ini menggunakan
-l
opsi :Ini adalah fitur standar (lihat deskripsi tambalan POSIX ).
Namun, OP mengubah pertanyaan untuk mengomentari Bagaimana konversi akhir baris bekerja dengan git core.autocrlf antara sistem operasi yang berbeda , dan menambahkan contoh yang mengisyaratkan bahwa masalah terlihat dengan file pada Windows (berbeda dengan contoh gaya Unix). Sementara
patch
mencoba untuk mengakomodasi ketidaksesuaian antara CRLF dan LF-end-line, ia memiliki bias untuk menganggap bahwa yang terakhir digunakan. Jika file tambalan memiliki ujung CRLF, sementara file yang akan ditambal tidak, itu akan pulih seperti dalam contoh log ini:Memeriksa kode sumber, dalam
similar
fungsinya, GNUpatch
memperlakukan spasi putih sebagai spacedan Tab, dengan beberapa penanganan khusus sesuai dengan apakah baris memiliki LF yang tertinggal. CR tidak disebutkan. Itu memang memperhatikancheck_line_endings
, tetapi menggunakan informasi itu hanya sebagai bagian dari pesan untuk membantu mendiagnosis penolakan. Ini menghapus CR trailing di pget_line kecuali--binary
opsi diberikan.GNU patch tidak memiliki opsi untuk mengatakannya untuk mengubah patch dengan ujung LF menjadi CRLF untuk diterapkan ke file yang ujung-ujungnya CRLF. Untuk menggunakannya secara andal untuk kasus ini, pilihannya adalah
--binary
opsi.sumber
Saya memiliki masalah yang sama pada Cygwin. Dalam kasus saya, perbaikannya adalah menggunakan
-i
flag alih-alih membaca dari stdin.Berikut ini gagal dengan kesalahan akhir baris yang berbeda :
Tetapi yang berikut ini berhasil:
Saya tidak yakin tentang penyebabnya, tetapi meninggalkan ini di sini jika seseorang memiliki masalah yang sama.
sumber