Cara Menerapkan Patch ke Fail (dan Membuat Patch) di Linux

patchPerintah Linux membolehkan anda memindahkan perubahan dari satu set fail ke set fail yang lain dengan cepat dan selamat. Ketahui cara menggunakan patchkaedah mudah.

Perintah patch dan diff

Bayangkan anda mempunyai fail teks di komputer anda. Anda menerima versi fail teks yang diubah suai dari orang lain. Bagaimana anda dengan cepat memindahkan semua perubahan dari fail yang diubah suai ke fail asal anda? Di situlah patchdan diffmula bermain. patchdan diffterdapat di Linux dan sistem operasi Unix-Like yang lain, seperti macOS.

The diffarahan mengkaji dua versi fail yang berbeza dan menyenaraikan perbezaan antara mereka. Perbezaannya dapat disimpan dalam fail yang disebut patch file.

The  patch arahan boleh membaca fail patch dan menggunakan kandungan sebagai satu set arahan. Dengan mengikuti arahan tersebut, perubahan dalam fail yang diubah akan ditiru dalam fail asal.

Sekarang bayangkan proses itu berlaku ke seluruh direktori fail teks. Semua dalam satu perjalanan. Itulah kehebatan patch.

Kadang kala anda tidak akan menghantar fail yang diubah suai. Semua yang anda hantar adalah fail tampalan. Mengapa menghantar puluhan fail apabila anda dapat menghantar satu fail, atau menghantar satu fail untuk muat turun dengan mudah?

Apa yang anda lakukan dengan fail tampalan untuk benar-benar menambal fail anda? Selain hampir menjadi bahasa lidah, itu juga merupakan soalan yang baik. Kami akan membimbing anda dalam artikel ini.

The patcharahan adalah yang paling sering digunakan oleh orang yang bekerja dengan fail kod sumber perisian, tetapi ia bekerja sama dengan baik dengan mana-mana set fail teks apa jua tujuan, kod sumber atau tidak mereka.

BERKAITAN: Cara Membandingkan Dua Fail Teks di Terminal Linux

Senario Contoh Kami

Dalam senario ini, kita berada di direktori yang disebut kerja yang mengandungi dua direktori lain. Yang satu dipanggil bekerja, dan yang lain disebut yang terbaru . Direktori berfungsi menyimpan sekumpulan fail kod sumber. Direktori terbaru menyimpan versi terbaru dari fail kod sumber tersebut, beberapa di antaranya telah diubah suai.

Untuk selamat, direktori berfungsi adalah salinan versi fail teks semasa. Bukan satu-satunya salinannya.

Mencari Perbezaan Antara Dua Versi Fail

The diffarahan mendapati perbezaan antara dua fail. Tindakan lalai adalah menyenaraikan garis yang diubah dalam tetingkap terminal.

Satu fail dipanggil slang.c. Kami akan membandingkan versi dalam direktori yang berfungsi dengan yang ada di direktori terbaru.

Pilihan -u (bersatu) memberitahu diffuntuk menyenaraikan juga beberapa baris teks yang tidak diubah dari sebelum dan selepas setiap bahagian yang diubah. Garis-garis ini dipanggil garis konteks. Mereka membantu  patch perintah mencari tepat di mana perubahan mesti dibuat dalam fail asal.

Kami memberikan nama fail sehingga difftahu fail mana yang hendak dibandingkan. Fail asal disenaraikan terlebih dahulu, kemudian fail yang diubah suai. Ini adalah arahan yang kami keluarkan untuk diff:

diff -u working / slang.c terkini / slang.c

diffmenghasilkan senarai output yang menunjukkan perbezaan antara fail. Sekiranya failnya sama, tidak akan ada output yang disenaraikan sama sekali. Melihat jenis output dari ini diffmengesahkan bahawa terdapat perbezaan antara kedua versi fail dan fail asal perlu ditambal.

Membuat Patch FIle

Untuk menangkap perbezaan dalam fail tampalan, gunakan perintah berikut. Ini adalah perintah yang sama seperti di atas, dengan output dari diffdialihkan ke fail yang disebut slang.patch.

diff -u working / slang.c terkini / slang.c> slang.patch

Nama fail tampalan sewenang-wenangnya. Anda boleh menyebutnya apa sahaja yang anda suka. Memberi pelanjutan ".patch" adalah idea yang baik; bagaimanapun, kerana ia menjelaskan jenis fail apa itu.

Untuk membuat  patchtindakan pada fail tampalan dan mengubah fail yang berfungsi / slang.c, gunakan perintah berikut. Pilihan -u(bersatu) memberitahu patch bahawa fail tampalan mengandungi garis konteks bersatu. Dengan kata lain, kami menggunakan pilihan -u dengan perbezaan, jadi kami menggunakan -upilihan dengan patch.

patch -u working.slang.c -i slang.patch

Sekiranya semuanya berjalan lancar, ada satu baris output yang memberitahu anda patchsedang menambal fail.

Membuat Sandaran dari Asli

Kami dapat mengarahkan patchuntuk membuat salinan sandaran fail yang ditambal sebelum diubah dengan menggunakan pilihan  -b(sandaran). Pilihan -i(input) memberitahu patch nama fail patch yang akan digunakan:

 patch -u -b working.slang.c -i slang.patch 

Fail ditambal seperti sebelumnya, tanpa ada perbezaan dalam output. Walau bagaimanapun, jika anda melihat folder yang berfungsi, anda akan melihat fail yang disebut slang.c.orig telah dibuat. Cap tarikh dan waktu fail menunjukkan bahawa slang.c.orig adalah fail asal dan slang.c adalah fail baru yang dibuat oleh patch.

Menggunakan diff Dengan Direktori

Kita dapat menggunakan diffuntuk membuat fail tambalan yang berisi semua perbezaan antara fail dalam dua direktori. Kita kemudian dapat menggunakan fail tambalan tersebut patchuntuk menerapkan perbezaan tersebut pada file dalam folder kerja dengan satu perintah.

Pilihan yang akan kita gunakan diffadalah pilihan -u(konteks terpadu) yang telah kita gunakan sebelumnya, pilihan -r(rekursif) untuk diffmelihat sub-direktori dan pilihan -N(fail baru).

The -Npilihan memberitahu diff bagaimana untuk mengendalikan fail dalam direktori terkini yang bukan dalam direktori kerja. Ia memaksa diffuntuk meletakkan arahan dalam fail tambalan sehingga patch membuat fail yang ada di direktori terbaru tetapi hilang dari direktori yang berfungsi.

Anda boleh mengumpulkan pilihan sehingga mereka menggunakan tanda hubung tunggal ( -).

Perhatikan bahawa kami hanya memberikan nama direktori, kami tidak meminta diffuntuk melihat fail tertentu:

diff -ruN berfungsi / terkini /> slang.patch

Mengintip Di Dalam Fail Patch

Mari kita lihat fail patch dengan cepat. Kami akan menggunakan lessuntuk melihat kandungannya.

Bahagian atas fail menunjukkan perbezaan antara dua versi slang.c.

Menggulir lebih jauh ke bawah melalui fail tambalan, kami melihatnya kemudian menerangkan perubahan dalam fail lain yang disebut structs.h. Ini mengesahkan bahawa fail tampalan pasti mengandungi perbezaan antara pelbagai versi pelbagai fail.

Lihat sebelum anda melompat

Menampal koleksi fail yang besar mungkin sedikit mengganggu, jadi kita akan menggunakan --dry-run pilihan untuk memeriksa semuanya baik-baik saja sebelum kita mengambil risiko dan berkomitmen untuk membuat perubahan.

The --dry-runpilihan memberitahu patchmelakukan segala-galanya selain sebenarnya mengubah suai fail. patchakan melakukan semua pemeriksaan pra-penerbangan pada fail dan jika menghadapi masalah, ia akan melaporkannya. Walau apa pun, tidak ada fail yang diubah.

Sekiranya tidak ada masalah yang dilaporkan, kami dapat mengulangi perintah tanpa --dry-runpilihan dan menambal fail kami dengan yakin.

Pilihan -d(direktori) memberitahu patchdirektori mana yang harus diusahakan.

Perhatikan bahawa kami tidak menggunakan pilihan -i(input) untuk mengetahui patchfail tambalan yang berisi petunjuk dari diff. Sebaliknya, kita mengalihkan fail patch ke dalam patchdengan <.

patch --dry-run -ruN -d berfungsi <slang.patch

Dari keseluruhan direktori, diffterdapat dua fail yang akan ditambal. Arahan mengenai pengubahsuaian untuk kedua file tersebut telah diperiksa patch , dan tidak ada masalah yang dilaporkan.

Pemeriksaan sebelum penerbangan adalah OK; kami bersedia untuk berlepas.

Menampal Direktori

Untuk benar-benar menerapkan tambalan ke fail kami menggunakan perintah sebelumnya tanpa --dry-runpilihan.

patch -ruN -d berfungsi <slang.patch

Kali ini setiap baris output tidak dimulai dengan "memeriksa", setiap baris dimulai dengan "menambal".

Dan tidak ada masalah yang dilaporkan. Kami dapat menyusun kod sumber kami, dan kami akan menggunakan perisian versi terbaru.

Selesaikan Perbezaan Anda

Ini adalah cara paling mudah dan selamat untuk digunakan patch. Salin fail sasaran anda ke folder dan tempel folder itu. Salin kembali apabila anda gembira bahawa proses penambalan selesai tanpa ralat.