Bagaimana cara memperbaiki pesan "Hunk # 1 GAGAL di 1 (ujung jalur berbeda)"?

22

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

pengguna1709408
sumber
Coba sed -i.bak -e 's/\r$//g' something. Saya tidak berpikir dos2unix menangani campuran end-of-line seagresif yang Anda inginkan.
Arthur2e5
Kejahatan total; jika Anda memiliki tambalan Anda dengan ujung garis CF-LF, sama seperti file, tambalan CR pertama akan dengan senang hati melepaskan tambalan Anda, kemudian melempar kecocokan bahwa ujung garis (yang baru saja putus) tidak cocok.
SF.

Jawaban:

5

Saya memiliki masalah yang sama menggunakan patchperintah 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:

$ dos2unix patch-file.patch
$ patch -p1 < patch-file.patch
$ unix2dos modified-files...

patch akan mengkonversi akhir baris menjadi LF pada semua file yang ditambal, jadi perlu untuk mengubahnya kembali ke CRLF.

Obs: patchversi yang saya gunakan adalah 2.7.5

Fernando Costa Bertoldi
sumber
5

Anda biasanya dapat mengatasi ini menggunakan -lopsi :

gunakan opsi -l atau --ignore-whitespace, yang membuat patch membandingkan karakter kosong (yaitu spasi dan tab) secara longgar sehingga setiap urutan kosong kosong dalam file patch cocok dengan urutan kosong kosong apa pun dalam file input

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 patchmencoba 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:

(Stripping trailing CRs from patch.)
patching file xterm.log.html
(Stripping trailing CRs from patch.)
patching file xterm.man
(Stripping trailing CRs from patch.)
patching file xtermcfg.hin

Memeriksa kode sumber, dalam similarfungsinya, GNU patchmemperlakukan spasi putih sebagai spacedan Tab, dengan beberapa penanganan khusus sesuai dengan apakah baris memiliki LF yang tertinggal. CR tidak disebutkan. Itu memang memperhatikan check_line_endings, tetapi menggunakan informasi itu hanya sebagai bagian dari pesan untuk membantu mendiagnosis penolakan. Ini menghapus CR trailing di pget_line kecuali --binaryopsi 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

  • konversi semua file untuk menggunakan ujung LF, atau
  • konversikan semua file untuk menggunakan ujung CRLF dan tambahkan --binaryopsi.
Thomas Dickey
sumber
5
--ignore-whitespace (tanpa tanda hubung kedua) juga tidak membantu, saya memperbarui pertanyaan
user1709408
0

Saya memiliki masalah yang sama pada Cygwin. Dalam kasus saya, perbaikannya adalah menggunakan -iflag alih-alih membaca dari stdin.

Berikut ini gagal dengan kesalahan akhir baris yang berbeda :

patch -t -N -r - -p0 < patchfile

Tetapi yang berikut ini berhasil:

patch -t -N -r - -p0 -i patchfile

Saya tidak yakin tentang penyebabnya, tetapi meninggalkan ini di sini jika seseorang memiliki masalah yang sama.

Joe
sumber