Ketika menambal apa perbedaan antara argumen -p0 dan -p1?

19

Apa perbedaan antara patch -p0dan patch -p1?

Apakah ada perbedaan sama sekali?

chrisjlee
sumber

Jawaban:

23

Cara paling umum untuk membuat tambalan adalah dengan menjalankan diffperintah atau diffperintah bawaan seperti kontrol versi . Terkadang, Anda hanya membandingkan dua file, dan Anda menjalankan diffseperti ini:

diff -u version_by_alice.txt version_by_bob.txt >alice_to_bob.patch

Kemudian Anda mendapatkan tambalan yang berisi perubahan untuk satu file dan tidak mengandung nama file sama sekali. Ketika Anda menerapkan tambalan itu, Anda perlu menentukan file mana yang ingin Anda terapkan untuk:

patch <alice_to_bob.patch version2_by_alice.txt

Seringkali, Anda membandingkan dua versi dari proyek multi-file yang terkandung dalam direktori. Doa khas diffpenampilan seperti ini:

diff -ru old_version new_version >some.patch

Kemudian tambalan berisi nama file, diberikan dalam baris header seperti diff -ru old_version/dir/file new_version/dir/file. Anda perlu memberitahu patchuntuk menghapus awalan ( old_versionatau new_version) dari nama file. Itu -p1artinya: menghapus satu tingkat direktori.

Terkadang, baris header di tambalan berisi nama file secara langsung tanpa lead-up. Ini biasa terjadi pada sistem kontrol versi; misalnya cvs diffmenghasilkan garis tajuk yang terlihat seperti diff -r1.42 foo. Maka tidak ada awalan untuk dihapus, jadi Anda harus menentukan -p0.

Dalam kasus khusus ketika tidak ada subdirektori di pohon yang Anda bandingkan, tidak ada -popsi yang diperlukan: patchakan membuang semua bagian direktori dari nama file. Tetapi sebagian besar waktu, Anda perlu salah satu -p0atau -p1, tergantung pada bagaimana patch diproduksi.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Ini telah membingungkan saya begitu lama. Mengapa perilaku tidak ada subdirektori berbeda dari -p0? Saya selalu berasumsi bahwa -p0 adalah default, jadi saya selalu memiliki masalah jika seharusnya p0
Brydon Gibson
@BrydonGibson Saya menduga bahwa awalnya idenya adalah bahwa penulis tambalan dapat dengan acuh menulis diff old/foo new/foo >my.patchatau diff ../old/foo foo >my.patchatau diff foo.old foo >my.patchdan pengguna dapat menerapkannya patch <my.patchtanpa harus peduli bagaimana tambalan diproduksi, dan kemudian -pditambahkan sebagai kenyamanan. Tetapi saya tidak benar-benar tahu, patchini adalah utilitas lama dan pada saat saya mulai menggunakannya -p0atau -p1sudah merupakan cara yang paling umum untuk menggunakannya.
Gilles 'SANGAT berhenti menjadi jahat'
16

Dari pria itu:

-pnum atau --strip=num Strip awalan terkecil yang mengandung garis miring num terkemuka dari setiap nama file yang ditemukan dalam file patch. Urutan satu atau lebih garis miring yang berdekatan dihitung sebagai garis miring tunggal. Ini mengontrol bagaimana nama file yang ditemukan dalam file tambalan diperlakukan, jika Anda menyimpan file Anda di direktori yang berbeda dari orang yang mengirim tambalan. Misalnya, seandainya nama file dalam file tambalan adalah:

 /u/howard/src/blurfl/blurfl.c

Pengaturan -p0memberi seluruh nama file tidak dimodifikasi , -p1memberi

 u/howard/src/blurfl/blurfl.c

tanpa garis miring , -p4berikan

 blurfl/blurfl.c
Stéphane Gimenez
sumber
4

Perbedaannya adalah bahwa angka setelah -pakan menentukan jumlah komponen jalur yang akan dihapus.

Katakanlah kita memiliki jalan /Barack/Obama. Menjalankan tambalan di atasnya dengan -p0argumen akan memperlakukan path seperti :

/Barack/Obama

Tapi kita bisa memotong jalan sambil menambal:

-p1akan menghapus root slash (perhatikan bahwa itu hanya akan menjadi Barack sekarang, tanpa slash tersisa untuk itu):

Barack/Obama

-p2 akan menghapus Barack (dan tebasan kanan yang berdekatan):

 Obama

Untuk memperluas "mengapa" patchperilaku ini , baca utas ini .

JohnDoea
sumber