manpagez: man pages & more
man patch(1)
Home | html | info | man
patch(1)                    General Commands Manual                   patch(1)


NAME

       patch - apply a diff file to an original


SYNOPSIS

       patch [options] [originalfile [patchfile]]

       but usually just

       patch -pnum <patchfile


DESCRIPTION

       patch takes a patch file patchfile containing a difference listing
       produced by the diff program and applies those differences to one or
       more original files, producing patched versions.  Normally the patched
       versions are put in place of the originals.  Backups can be made; see
       the -b or --backup option.  The names of the files to be patched are
       usually taken from the patch file, but if there's just one file to be
       patched it can be specified on the command line as originalfile.

       Upon startup, patch attempts to determine the type of the diff listing,
       unless overruled by a -c (--context), -e (--ed), -n (--normal), or -u
       (--unified) option.  Context diffs (old-style, new-style, and unified)
       and normal diffs are applied by the patch program itself, while ed
       diffs are simply fed to the ed(1) editor via a pipe.

       patch tries to skip any leading garbage, apply the diff, and then skip
       any trailing garbage.  Thus you could feed an email message containing
       a diff listing to patch, and it should work.  If the entire diff is
       indented by a consistent amount, if lines end in CRLF, or if a diff is
       encapsulated one or more times by prepending "- " to lines starting
       with "-" as specified by Internet RFC 934, this is taken into account.
       After removing indenting or encapsulation, lines beginning with # are
       ignored, as they are considered to be comments.

       With context diffs, and to a lesser extent with normal diffs, patch can
       detect when the line numbers mentioned in the patch are incorrect, and
       attempts to find the correct place to apply each hunk of the patch.  As
       a first guess, it takes the line number mentioned for the hunk, plus or
       minus any offset used in applying the previous hunk.  If that is not
       the correct place, patch scans both forwards and backwards for a set of
       lines matching the context given in the hunk.  First patch looks for a
       place where all lines of the context match.  If no such place is found,
       and it's a context diff, and the maximum fuzz factor is set to 1 or
       more, then another scan takes place ignoring the first and last line of
       context.  If that fails, and the maximum fuzz factor is set to 2 or
       more, the first two and last two lines of context are ignored, and
       another scan is made.  (The default maximum fuzz factor is 2.)

       Hunks with less prefix context than suffix context (after applying
       fuzz) must apply at the start of the file if their first line number
       is 1.  Hunks with more prefix context than suffix context (after
       applying fuzz) must apply at the end of the file.

       If patch cannot find a place to install that hunk of the patch, it puts
       the hunk out to a reject file, which normally is the name of the output
       file plus a .rej suffix, or # if .rej would generate a file name that
       is too long (if even appending the single character # makes the file
       name too long, then # replaces the file name's last character).

       The rejected hunk comes out in unified or context diff format.  If the
       input was a normal diff, many of the contexts are simply null.  The
       line numbers on the hunks in the reject file may be different than in
       the patch file: they reflect the approximate location patch thinks the
       failed hunks belong in the new file rather than the old one.

       As each hunk is completed, you are told if the hunk failed, and if so
       which line (in the new file) patch thought the hunk should go on.  If
       the hunk is installed at a different line from the line number
       specified in the diff, you are told the offset.  A single large offset
       may indicate that a hunk was installed in the wrong place.  You are
       also told if a fuzz factor was used to make the match, in which case
       you should also be slightly suspicious.  If the --verbose option is
       given, you are also told about hunks that match exactly.

       If no original file origfile is specified on the command line, patch
       tries to figure out from the leading garbage what the name of the file
       to edit is, using the following rules.

       First, patch takes an ordered list of candidate file names as follows:

         •  If the header is that of a context diff, patch takes the old and
            new file names in the header.  A name is ignored if it does not
            have enough slashes to satisfy the -pnum or --strip=num option.
            The name /dev/null is also ignored.

         •  If there is an Index: line in the leading garbage and if either
            the old and new names are both absent or if patch is conforming to
            POSIX, patch takes the name in the Index: line.

         •  For the purpose of the following rules, the candidate file names
            are considered to be in the order (old, new, index), regardless of
            the order that they appear in the header.

       Then patch selects a file name from the candidate list as follows:

         •  If some of the named files exist, patch selects the first name if
            conforming to POSIX, and the best name otherwise.

         •  If patch is not ignoring RCS, ClearCase, Perforce, and SCCS (see

GUN patch 2.8 - Generated Wed Apr 2 16:08:45 CDT 2025
© manpagez.com 2000-2025
Individual documents may contain additional copyright information.