Câu trả lời:
Nếu bạn không đưa ra bất kỳ tùy chọn nào patch
khác -pN
, nó chỉ tạo các tệp đó khi một bản vá không được áp dụng sạch.
Vì vậy, một lựa chọn là ngừng tạo (hoặc chấp nhận) các bản vá xấu. :)
Trở lại trong thế giới thực, đây là một tính năng. Khi patch(1)
không áp dụng phân đoạn vá cho tệp gốc, nó sẽ lưu tệp gốc tạm thời sao chép lâu dài *.orig
, chuyển đoạn bị từ chối sang *.rej
và tiếp tục thử áp dụng các phân đoạn vá. Ý tưởng là bạn có thể mở *.rej
tệp và hoàn tất quy trình vá thủ công bằng cách sao chép các bit và các mảnh sang tệp đã vá. Các *.orig
tập tin cũng có thể hữu ích khi quá trình vá vô tình xác tàu một cái gì đó, và bạn cần phải tham khảo các phiên bản gốc để sửa chữa nó.
Tôi không phải lúc nào cũng sửa một bản vá xấu với văn bản từ *.rej
và *.orig
tệp, nhưng thật tuyệt khi có chúng trong trường hợp tôi cần chúng.
Khi tôi đã sửa một bản vá lỗi, tôi chạy đoạn script sau ở gốc dự án để nhanh chóng dọn dẹp mọi thứ:
#!/bin/bash
find . '(' \
-name \*-baseline -o \
-name \*-merge -o \
-name \*-original -o \
-name \*.orig -o \
-name \*.rej \
')' -delete
Tôi gọi nó cleanup-after-bad-patch
bởi vì tên dài bảo đảm một phần chống lại việc này vô tình, vì nó có thể loại bỏ các tệp bạn vẫn cần. Thành thật mà nói, tôi thường chạy nó bằng cách gõ clean
TabEnter, đủ để tìm tập lệnh này trong các PATH
máy phát triển của tôi.
Các mẫu bổ sung mà nó kiểm tra là cho đầu ra các tệp theo hệ thống kiểm soát phiên bản của tôi khi nó gặp vấn đề tương tự trong một hoạt động hợp nhất. Bạn có thể muốn điều chỉnh nó cho các công cụ VCS / SCM của bạn .
Để nói bản vá không tạo bản sao lưu, chỉ cần bỏ qua -b
và bất kỳ --backup-...
tùy chọn.
Để hướng dẫn nó không tạo .rej
tập tin thêm -r -
tùy chọn vào lệnh.
GNU patch 2.6
mac có lẽ hãy thử-r /dev/null
Các --no-backup-if-mismatch
tùy chọn sẽ tránh được những ".orig" tập tin.
Bạn cũng có thể muốn thử --merge
tùy chọn tạo ra xung đột trong tệp.
Trong mọi trường hợp, bạn nên có một số cách để nhanh chóng trở lại trạng thái tốt nếu việc hợp nhất trở nên quá tải.
Tôi bị mắc kẹt với bản vá v2.5.4, nơi -r -
khiến nó tạo ra các tệp từ chối có tên -
.
Tôi thấy rằng --reject-file=
giá trị trống khiến bản vá không thành công với mã thoát 2
NẾU nó cố gắng ghi tệp từ chối. Nếu không có từ chối, nó hoạt động như mong đợi. Mặc dù không phải là một giải pháp hoàn chỉnh cho phiên bản cũ hơn của bản vá, trong một số trường hợp, điều này có thể được chấp nhận hoặc mong muốn.
Cách tốt nhất tôi có thể nghĩ ra (phải thừa nhận một cách để quét bụi bẩn dưới tấm thảm) là sử dụng -r <tmpfile>
, tức là:
# patch -r /tmp/deleteme.rej -i patchfile filetobepatched
kể từ phiên bản 2.5.8, -r -
thực sự tạo -
tập tin.
vá -p1 -B / dev / null -r - <file.patch
-B
cờ không gửi *.orig
đầu ra tới /dev/null
, như nó xuất hiện từ lệnh của bạn. Nó chỉ xảy ra rằng người dùng bình thường không thể ghi vào các tập tin được gọi là những thứ như /dev/nullfoo.cpp
. Nếu bạn làm điều này với quyền root, bạn sẽ nhận được rác trong /dev
cây của mình . Thứ hai, -r -
không ngăn chặn các *.rej
tập tin. Nó chỉ xuất hiện để làm điều đó bởi vì lỗi do -B
cờ không có thật ngăn nó hiển thị cho bạn những gì nó thực sự sẽ làm mà không có -B
, đó là tạo một tệp được gọi -
trong thư mục hiện tại.
man patch
: "-r Đặt từ chối vào tệp từ chối thay vì tệp .rej mặc định. Khi từ chối là -, hãy loại bỏ từ chối."