Làm thế nào tôi có thể áp dụng một bản vá -p0 từ bất kỳ thư mục làm việc?


26

Tôi có một bản vá với các đường dẫn tuyệt đối mà tôi muốn sử dụng. tức là một vài dòng đầu tiên như sau.

--- /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml  2014-10-10 18:47:23.000000000 +1100
+++ /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml.mod  2014-11-11 09:44:17.786200477 +1100

Tuy nhiên, nó thất bại trừ khi tôi đang ở trong thư mục gốc.

~$ cd
~$ sudo patch -i /tmp/fix_kde_icons.patch -p0
Ignoring potentially dangerous file name /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml
Ignoring potentially dangerous file name /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml.mod
can't find file to patch at input line 3
Perhaps you used the wrong -p or --strip option?
...
~$ cd /tmp
/tmp$ sudo patch -i /tmp/fix_kde_icons.patch -p0
... #same error as above
/tmp$ cd /usr
/usr$ sudo patch -i /tmp/fix_kde_icons.patch -p0
... #same error as above
/usr$ cd /
/$ sudo patch -i /tmp/fix_kde_icons.patch -p0
patching file /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml

Có cách nào để patchsử dụng đường dẫn tuyệt đối với bất kỳ thư mục làm việc nào không?


Tôi sẽ chỉnh sửa các bản vá thay thế.
Braiam

@Braiam Tôi sẽ thực hiện các chỉnh sửa cụ thể nào cho bản vá? Về cơ bản tôi đang tự hỏi liệu tôi có thể tránh phải chỉ định bất kỳ đường dẫn đích nào trong patchlệnh không.
Sparhawk

Một số bối cảnh, xin vui lòng. Bạn đang cố gắng áp dụng bản vá này cho một hệ thống đang chạy? Nếu vậy, tại sao? Phân phối / HĐH của bạn là gì? Bản vá này làm gì? Nó trông giống như một bản vá cho một điều KDE. Thành phần nào? Tôi nói chung, nếu bạn phân phối không áp dụng bản vá cho bạn, bạn nên xây dựng lại gói có liên quan từ nguồn với bản vá được áp dụng. Và bạn có thể cắt phần đầu của con đường. Đó không phải là một vấn đề. Bạn cắt bao nhiêu tùy thuộc vào nguồn trông như thế nào.
Faheem Mitha

1
@FaheemMitha Vâng, nó đang chạy, với Arch / KDE. Đó là để sửa lỗi này lỗi . Các sửa chữa hoạt động nếu tôi áp dụng thay đổi thủ công. Tuy nhiên, tôi không nghĩ rằng bối cảnh rất quan trọng trong trường hợp này, vì tôi có thể sao chép vấn đề này bằng một tệp thử nghiệm /tmp/foo. Tôi quan tâm nhiều hơn đến một câu trả lời chung chung áp dụng cho patch.
Sparhawk

Câu trả lời:


35

Nhìn vào mã nguồn của bản vá GNU, hành vi này được xây dựng từ phiên bản 2.7. Kể từ bản vá GNU 2.7.1, chỉ các đường dẫn tương đối không chứa ..được chấp nhận, trừ khi thư mục hiện tại là thư mục gốc.

Để áp dụng một bản vá chứa đường dẫn tuyệt đối, bạn có thể sử dụng

(cd / && sudo patch -p0) <foo.patch

Trong các phiên bản gần đây của bản vá GNU, bạn có thể chỉ cần

sudo patch -d/ -p0 <foo.patch

Được rồi, nó là những gì nó được. Tuy nhiên, nếu bạn kiểm tra các lệnh của tôi, cd /usrcũng thất bại, mặc dù các tệp mục tiêu nằm trong thư mục này.
Sparhawk

@Sparhawk Xin lỗi, mô tả của tôi là một phần không chính xác. Kiểm tra là: nếu thư mục hiện tại không có /, thì từ chối bất kỳ đường dẫn tuyệt đối hoặc đường dẫn có chứa một ..thành phần.
Gilles 'SO- ngừng trở nên xấu xa'

7
Hay đơn giản hơn,sudo patch -d/ -p0 <foo.patch
Qian

@TheoYou Tôi đã bỏ lỡ bình luận đó vào thời điểm đó. Bạn nên viết nó lên như một câu trả lời.
Sparhawk
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.