Menjalankan "patch" tanpa menghasilkan file * .orig dan * .rej


20

Apakah mungkin untuk mengatakan patchuntuk tidak membuat .origdan .rejfile? Saya merasa sangat menjengkelkan bahwa tambalan membuat ini.

Jawaban:


14

Jika Anda tidak memberikan opsi apa pun patchselain -pN, itu hanya membuat file-file itu ketika tambalan gagal diterapkan dengan bersih.

Jadi, satu opsi adalah berhenti membuat (atau menerima) tambalan buruk. :)

Kembali ke dunia nyata, ini adalah fitur. Ketika patch(1)gagal menerapkan segmen tambalan ke file asli, itu menyimpan file asli sementara menyalin keluar sebagai *.orig, dump segmen ditolak *.rej, dan terus mencoba menerapkan segmen tambalan. Idenya adalah bahwa Anda dapat membuka *.rejfile dan menyelesaikan proses patch secara manual dengan menyalin bit dan potongan ke file yang ditambal. The *.origFile juga dapat berguna ketika proses patch yang sengaja bangkai kapal sesuatu, dan Anda perlu untuk merujuk ke versi asli untuk memperbaikinya.

Saya tidak selalu memperbaiki tambalan yang buruk dengan teks dari file *.rejdan *.orig, tapi itu bagus untuk memilikinya jika saya membutuhkannya.

Setelah saya memperbaiki tambalan yang buruk, saya menjalankan skrip berikut di root proyek untuk dengan cepat membersihkan:

#!/bin/bash
find . '(' \
    -name \*-baseline -o \
    -name \*-merge -o \
    -name \*-original -o \
    -name \*.orig -o \
    -name \*.rej \
')' -delete

Saya menyebutnya cleanup-after-bad-patchkarena nama panjang memastikan tidak menjalankan ini secara tidak sengaja, karena itu bisa menghapus file yang masih Anda butuhkan. Sejujurnya, saya biasanya menjalankannya dengan mengetik cleanTabEnter, itu sudah cukup untuk menemukan skrip ini di PATHmesin pengembangan saya.

Pola tambahan yang diperiksa adalah untuk output file oleh sistem kontrol versi pilihan saya ketika menemui masalah yang sama selama operasi penggabungan. Anda mungkin ingin menyesuaikannya untuk alat VCS / SCM Anda .


7

Untuk memberi tahu tambalan untuk tidak menghasilkan cadangan cukup abaikan -bdan --backup-...opsi apa pun .

Untuk menginstruksikannya untuk tidak membuat .rejfile, tambahkan -r -opsi ke perintah.


4
Ini tidak berfungsi untuk saya - hanya menempatkan penolakan dalam file bernama "-", yang merupakan nama file yang sangat menjengkelkan. Saya menggunakan versi 2.5.8 di Mac.
rjmunro

bekerja dengan baik di GNU patch 2.6mac mungkin mencoba-r /dev/null
Stuart Cardall

3

The --no-backup-if-mismatchpilihan akan menghindari ".orig" file.

Anda mungkin juga ingin mencoba --mergeopsi tersebut, yang menciptakan konflik dalam file.

Dalam semua kasus, Anda harus memiliki beberapa cara untuk kembali ke keadaan baik dengan cepat jika penggabungan menjadi luar biasa.


1

Saya terjebak dengan patch v2.5.4 di mana -r -menyebabkannya membuat file tolak bernama -.

Saya menemukan bahwa --reject-file=nilai kosong menyebabkan patch gagal dengan kode keluar 2 JIKA mencoba menulis file tolak. Jika tidak ada penolakan, itu berfungsi seperti yang diharapkan. Meskipun bukan solusi lengkap untuk versi tambalan yang lebih lama, dalam kondisi tertentu ini mungkin dapat diterima atau diinginkan.


0

Yang terbaik yang bisa saya dapatkan (diakui cara untuk menyapu kotoran di bawah permadani) adalah menggunakan -r <tmpfile>, yaitu:

# patch -r /tmp/deleteme.rej -i patchfile filetobepatched

sejak di v2.5.8, -r -sebenarnya membuat -file.


-3

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


-1: Ini saran yang sangat buruk. Pertama, -Bflag tidak mengirimkan *.origoutput /dev/null, seperti yang terlihat dari perintah Anda. Kebetulan pengguna normal tidak dapat menulis ke file yang disebut hal-hal seperti /dev/nullfoo.cpp. Jika Anda melakukan ini sebagai root, Anda akan mendapatkan sampah di /devpohon Anda . Kedua, -r -tidak menekan *.rejfile. Tampaknya hanya melakukan itu karena kesalahan karena -Bbendera palsu menghentikannya menunjukkan kepada Anda apa yang sebenarnya akan dilakukan tanpa -B, yang membuat file yang disebut -di direktori saat ini.
Warren Young

1
@ WarrenYoung sesuai dengan man patch: "-r Masukan tolak ke dalam file tolak sebagai pengganti .rej file default. Ketika tolak ke file adalah -, buang tolak."
Limbo Peng
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.