Làm cách nào để sửa tin nhắn Hunk # 1 FAILED tại 1 (kết thúc dòng khác nhau)


22

Tôi đang cố gắng tạo một bản vá với lệnh

git diff sourcefile >/var/lib/laymab/overlay/category/ebuild/files/thepatch.patch

Khi tôi áp dụng các bản vá, nó mang lại cho tôi

$ 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

Tôi đã thử áp dụng dos2unix cho cả tệp src và tệp vá, nhưng thông báo không biến mất ...

CẬP NHẬT: --ignore-whitespace không giúp quá

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

CẬP NHẬT: tìm thấy một bài viết rất tốt: /programming//a/4425433/1709408


Hãy thử sed -i.bak -e 's/\r$//g' something. Tôi không nghĩ dos2unix xử lý mạnh mẽ các kết thúc cuối dòng như bạn muốn.
Arthur2e5

Hoàn toàn xấu xa; nếu bạn có bản vá của mình với các kết thúc dòng CF-LF, giống như các tệp, trước tiên, nó sẽ vui vẻ loại bỏ CR khỏi bản vá của bạn, sau đó ném một kết thúc phù hợp với dòng kết thúc (mà nó vừa bị hỏng) không khớp.
SF.

Câu trả lời:


5

Tôi gặp vấn đề tương tự khi sử dụng patchlệnh đi kèm với MSYS2 trên Windows. Trong trường hợp của tôi, cả tệp nguồn và bản vá đều có dòng kết thúc CRLF và việc chuyển đổi cả hai thành LF cũng không hoạt động. Những gì đã làm việc như sau:

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

patch sẽ chuyển đổi các kết thúc dòng thành LF trên tất cả các tệp được vá, vì vậy cần phải chuyển đổi chúng trở lại CRLF.

Quan sát: patchphiên bản tôi đang sử dụng là 2.7.5


5

Bạn thường có thể làm việc xung quanh điều này bằng cách sử dụng -ltùy chọn :

sử dụng tùy chọn -l hoặc --ignore-khoảng trắng, làm cho bản vá so sánh các ký tự trống (nghĩa là khoảng trắng và tab) một cách lỏng lẻo để bất kỳ chuỗi khoảng trống không trống nào trong tệp vá khớp với bất kỳ chuỗi khoảng trống không trống nào trong các tệp đầu vào

Đây là một tính năng tiêu chuẩn (xem mô tả bản vá POSIX ).

Tuy nhiên, OP đã sửa đổi câu hỏi để nhận xét về cách chuyển đổi kết thúc dòng hoạt động với git core.autocrlf giữa các hệ điều hành khác nhau và thêm một ví dụ gợi ý rằng vấn đề được nhìn thấy với các tệp trên Windows (ngược lại với ví dụ kiểu Unix). Mặc dù patchcố gắng điều chỉnh sự không phù hợp giữa các kết thúc dòng CRLF và LF, nhưng nó có xu hướng cho rằng cái sau được sử dụng. Nếu tệp vá có kết thúc CRLF, trong khi các tệp được vá không có, nó sẽ phục hồi như trong nhật ký ví dụ này:

(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

Kiểm tra mã nguồn, trong similarhàm, GNU patchxử lý khoảng trắng như spaceTab, với một số xử lý đặc biệt tùy theo các dòng có một đường dẫn LF hay không. CR không được đề cập. Nó không chú ý đến check_line_endings, nhưng chỉ sử dụng thông tin đó như một phần của tin nhắn để giúp chẩn đoán từ chối. Nó loại bỏ các CR theo sau trong pget_line trừ khi --binarytùy chọn được đưa ra.

Bản vá GNU không có tùy chọn để yêu cầu nó chuyển đổi một bản vá có kết thúc LF thành CRLF để áp dụng cho các tệp có kết thúc dòng là CRLF. Để sử dụng nó đáng tin cậy cho trường hợp này, các lựa chọn là

  • chuyển đổi tất cả các tệp để sử dụng kết thúc LF, hoặc
  • chuyển đổi tất cả các tệp để sử dụng kết thúc CRLF và thêm --binarytùy chọn.

5
--ignore-whitespace (không có dấu gạch ngang thứ hai) cũng không giúp được gì, tôi đã cập nhật câu hỏi
user1709408

0

Tôi đã có một vấn đề tương tự trên Cygwin. Trong trường hợp của tôi, sửa lỗi là sử dụng -icờ thay vì đọc từ stdin.

Lỗi sau đây với lỗi kết thúc dòng khác nhau :

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

Nhưng sau đây đã thành công:

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

Tôi không chắc chắn về nguyên nhân, nhưng để điều này ở đây trong trường hợp ai đó có cùng một vấn đề.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.