Bagaimana saya bisa menerapkan patch -p0 dari direktori yang berfungsi?

26

Saya memiliki tambalan dengan jalur absolut yang ingin saya gunakan. yaitu beberapa baris pertama adalah sebagai berikut.

--- /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

Namun, gagal kecuali saya ada di direktori root.

~$ 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

Apakah ada cara untuk patchmenggunakan jalur absolut dengan direktori yang berfungsi?

Sparhawk
sumber
Saya akan mengedit tambalan itu sendiri.
Braiam
@Braiam Suntingan khusus apa yang akan saya buat pada tambalan? Saya pada dasarnya bertanya-tanya apakah saya bisa menghindari harus menentukan jalur target dalam patchperintah.
Sparhawk
Tolong, beberapa konteks. Apakah Anda mencoba menerapkan tambalan ini ke sistem yang sedang berjalan? Jika demikian, mengapa? Apa distribusi / OS Anda? Apa yang dilakukan tambalan ini? Itu terlihat seperti tambalan untuk hal KDE. Komponen apa? Saya umum, jika distribusi Anda tidak menerapkan tambalan untuk Anda, Anda harus membangun kembali paket yang relevan dari sumber dengan tambalan diterapkan. Dan Anda dapat memotong bagian utama jalan. Itu seharusnya tidak menjadi masalah. Seberapa banyak Anda memangkas tergantung pada seperti apa sumbernya.
Faheem Mitha
1
@FaheemMitha Ya, sedang berjalan, dengan Arch / KDE. Ini untuk memperbaiki bug ini . Perbaikan berfungsi jika saya menerapkan perubahan secara manual. Namun, saya tidak berpikir bahwa konteks sangat penting dalam kasus ini, karena saya dapat mereplikasi masalah ini dengan file tes di /tmp/foo. Saya lebih tertarik pada jawaban umum yang berlaku untuk patch.
Sparhawk

Jawaban:

35

Melihat kode sumber tambalan GNU, perilaku ini sudah ada sejak versi 2.7. Pada GNU patch 2.7.1, hanya jalur relatif yang tidak mengandung ..yang diterima, kecuali direktori saat ini adalah direktori root.

Untuk menerapkan tambalan yang berisi jalur absolut, Anda dapat menggunakan

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

Di versi terbaru dari patch GNU, Anda dapat dengan mudah

sudo patch -d/ -p0 <foo.patch
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Oke, memang apa adanya. Namun, jika Anda memeriksa perintah saya, cd /usrjuga gagal, meskipun file target berada di bawah direktori ini.
Sparhawk
@Sparhawk Maaf, uraian saya sebagian salah. Pengujiannya adalah: jika direktori saat ini tidak /, maka tolak semua jalur absolut atau jalur yang mengandung ..komponen.
Gilles 'SO- stop being evil'
7
Atau lebih sederhana,sudo patch -d/ -p0 <foo.patch
Qian
@TheoYou saya melewatkan komentar itu pada saat itu. Anda harus menuliskannya sebagai jawaban.
Sparhawk