2024-04-19
patch
The patch
command reads a set of instructions from a patch file (typically with a .patch
extension) and applies those instructions to one or more target files. These instructions detail additions, deletions, and modifications to the original file’s content. Patch files are often generated using tools like diff
, which compares two versions of a file and produces a patch representing the differences.
patch
Command OptionsBefore diving into examples, let’s familiarize ourselves with some frequently used patch
options:
-p<number>
: This option strips leading directory components from filenames within the patch file. For instance, -p1
removes the first directory level. This is extremely useful when dealing with patches generated from source code trees.
-i <patchfile>
: Specifies the patch file to apply. This is often the most important option.
-b
: Creates backup copies of the original files before applying the patch. Highly recommended to avoid data loss.
-f
: Forces the application of the patch even if there are warnings or potential conflicts. Use with caution!
--dry-run
or -n
: Performs a dry run, showing what changes would be made without actually modifying the files. This is for previewing the impact of a patch.
Let’s illustrate patch
’s functionality with some concrete examples. Assume we have a file named original.txt
with the following content:
This is the original line 1.
This is the original line 2.
This is the original line 3.
Example 1: Applying a Simple Patch
First, let’s create a patch file named mypatch.patch
using the diff
command:
diff -u original.txt original_modified.txt > mypatch.patch
Assuming original_modified.txt
contains:
This is the original line 1.
This is a modified line 2.
This is the original line 3.
This is a new line 4.
Now, apply the patch:
patch -i mypatch.patch original.txt
This will modify original.txt
to reflect the changes in mypatch.patch
.
Example 2: Using -p
to Strip Paths
Suppose your patch file contains paths relative to a source code directory. Let’s say mypatch.patch
looks like this:
--- a/src/myprogram.c 2023-10-27 10:30:00.000000000 +0200
+++ b/src/myprogram.c 2023-10-27 10:31:00.000000000 +0200
@@ -10,7 +10,7 @@
int main() {
printf("Hello, ");
printf("world!\n");- printf("This is the old line.\n");
+ printf("This is the new line.\n");
return 0; }
To apply this patch to myprogram.c
located in the current directory, we’d use:
patch -p1 -i mypatch.patch myprogram.c
The -p1
removes the leading src/
from the filename within the patch, allowing for correct application.
Example 3: Utilizing -b
and --dry-run
To apply the patch safely and preview changes, use:
patch -b -n -i mypatch.patch original.txt
This will create a backup (e.g., original.txt.orig
) and show the changes without modifying the original file. Remove the -n
flag to actually apply the patch after reviewing the dry run output.
Example 4: Handling Conflicts
If patch
encounters conflicting changes between the patch and the target file, it will usually halt and indicate the conflict. You’ll need to manually resolve these conflicts by editing the affected file before running patch
again. This is often a more involved process, requiring careful consideration of the conflicting changes. Careful review and understanding of your changes is essential before proceeding.