Chạy bản vá vá mà không tạo các tệp * .orig và * .rej


20

Có thể nói patchkhông tạo .orig.rejtập tin? Tôi thấy vô cùng khó chịu khi bản vá tạo ra những thứ này.

Câu trả lời:


14

Nếu bạn không đưa ra bất kỳ tùy chọn nào patchkhá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 *.rejvà tiếp tục thử áp dụng các phân đoạn vá. Ý tưởng là bạn có thể mở *.rejtệ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 *.origtậ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*.origtệ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-patchbở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õ cleanTabEnter, đủ để tìm tập lệnh này trong các PATHmá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 .


7

Để nói bản vá không tạo bản sao lưu, chỉ cần bỏ qua -bvà bất kỳ --backup-...tùy chọn.

Để hướng dẫn nó không tạo .rejtập tin thêm -r -tùy chọn vào lệnh.


4
Điều này không phù hợp với tôi - nó chỉ đặt các từ chối trong một tệp có tên "-", đây là một tên tệp rất khó chịu. Tôi đang sử dụng phiên bản 2.5.8 trên máy Mac.
rjmunro

làm việc ok trên GNU patch 2.6mac có lẽ hãy thử-r /dev/null
Stuart Cardall

3

Các --no-backup-if-mismatchtùy chọn sẽ tránh được những ".orig" tập tin.

Bạn cũng có thể muốn thử --mergetù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.


1

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.


0

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.


-3

vá -p1 -B / dev / null -r - <file.patch


-1: Đây là lời khuyên rất tồi. Đầu tiên, -Bcờ 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 /devcây của mình . Thứ hai, -r -không ngăn chặn các *.rejtập tin. Nó chỉ xuất hiện để làm điều đó bởi vì lỗi do -Bcờ 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.
Warren Young

1
@WarrenYoung theo 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."
Limbo Peng
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.