Cara Menerapkan Patch ke Fail (dan Membuat Patch) di Linux
patch
Perintah Linux membolehkan anda memindahkan perubahan dari satu set fail ke set fail yang lain dengan cepat dan selamat. Ketahui cara menggunakan patch
kaedah 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 patch
dan diff
mula bermain. patch
dan diff
terdapat di Linux dan sistem operasi Unix-Like yang lain, seperti macOS.
The diff
arahan 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 patch
arahan 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 diff
arahan 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 diff
untuk 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 diff
tahu 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
diff
menghasilkan senarai output yang menunjukkan perbezaan antara fail. Sekiranya failnya sama, tidak akan ada output yang disenaraikan sama sekali. Melihat jenis output dari ini diff
mengesahkan 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 diff
dialihkan 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 patch
tindakan 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 -u
pilihan dengan patch
.
patch -u working.slang.c -i slang.patch
Sekiranya semuanya berjalan lancar, ada satu baris output yang memberitahu anda patch
sedang menambal fail.
Membuat Sandaran dari Asli
Kami dapat mengarahkan patch
untuk 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 diff
untuk membuat fail tambalan yang berisi semua perbezaan antara fail dalam dua direktori. Kita kemudian dapat menggunakan fail tambalan tersebut patch
untuk menerapkan perbezaan tersebut pada file dalam folder kerja dengan satu perintah.
Pilihan yang akan kita gunakan diff
adalah pilihan -u
(konteks terpadu) yang telah kita gunakan sebelumnya, pilihan -r
(rekursif) untuk diff
melihat sub-direktori dan pilihan -N
(fail baru).
The -N
pilihan memberitahu diff
bagaimana untuk mengendalikan fail dalam direktori terkini yang bukan dalam direktori kerja. Ia memaksa diff
untuk 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 diff
untuk melihat fail tertentu:
diff -ruN berfungsi / terkini /> slang.patch
Mengintip Di Dalam Fail Patch
Mari kita lihat fail patch dengan cepat. Kami akan menggunakan less
untuk 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-run
pilihan memberitahu patch
melakukan segala-galanya selain sebenarnya mengubah suai fail. patch
akan 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-run
pilihan dan menambal fail kami dengan yakin.
Pilihan -d
(direktori) memberitahu patch
direktori mana yang harus diusahakan.
Perhatikan bahawa kami tidak menggunakan pilihan -i
(input) untuk mengetahui patch
fail tambalan yang berisi petunjuk dari diff
. Sebaliknya, kita mengalihkan fail patch ke dalam patch
dengan <
.
patch --dry-run -ruN -d berfungsi <slang.patch
Dari keseluruhan direktori, diff
terdapat 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-run
pilihan.
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.