patchchange file using diff output |
Command |
patch
[-bceflNnRsv]
[-B prefix]
[-D symbol]
[-d dir]
[-F n]
[-i patchfile]
[-o outfile]
[-p n]
[-r rejectfile]
[file]
patch reads a patchfile which contains output from
diff describing changes from an old
text file to a new text file. patch then applies those
changes to another text file. Typically, you use patch
if you are keeping parallel versions of a file. When you make changes to one
file, you can use patch to incorporate those changes into
other versions of the file.
If you do not specify either the -b or -B
options, patch tries to change the original file
directly. If you do not specify -c, -e,
or -n, patch looks at the format of the
diff output and tries to determine
which type of output the patchfile contains.
If you do not specify a file to be patched and the patchfile is not in
context format, patch prompts you for the name of the file
you want to patch.
If the patchfile is in context format, patch tries to
determine the file name on its own. The first two lines of a context
patchfile give the names of the old and new files that
diff compared. If only one of the
files exists, patch patches that file. if neither exists or
both do, patch checks for a line starting with the string
Index: and if one exists, obtains the name of the file to patch
from the contents of that line. Once patch has determined
the file to patch, it checks for an SCCS subdirectory in the current directory
and if one exists, it attempts to obtain an editable version of that file by
performing the SCCS command get -e.
If patch cannot determine the file to patch, it prompts you
for the name of the file to use.
With a context format patchfile, patch can recognize
when line numbers given in the patchfile do not match line numbers in the
file being patched. Thus it can patch a file with line counts that do not match
the old file that was used by diff.
To do this, it takes these steps:
patch starts with the
line number found in the patchfile, plus or minus any adjustment that
must be made for the previous section.patch scans forward and backward for a
line that does match. If it finds a matching line, patch
makes the appropriate changes. patch also remembers the
adjustment it had to make to find the matching line, and uses this
adjustment in the next section to be changed.patch cannot find a line matching the one in the
patchfile, it tries to find the line using the lines given as context.
It ignores the first and last lines of the context and searches again. If it
finds a match this time, it makes the change and remembers the adjustment.patch searches one more time, ignoring the first two and
last two lines of the context. If it finds a match, it makes the changes and
remembers the adjustment.patch still cannot find a match, it writes the
unmatching portion to the reject file. It then tries to process the
next section of changes. Thus the reject file contains the sections that
patch is not able to change. Line numbers on sections in
the reject file may be different than those in the patchfile, since
patch adjusts them using the adjustment that
patch calculated for preceding sections.patch tries the same process if the
patchfile is in normal rather than context format. Because the
patchfile does not contain the context information,
patch has less to work with and probably creates more
rejects. patch always writes the rejectfile in
context format, regardless of the format of the patchfile.
By default, the rejectfile has the same name as the original file,
plus the suffix .rej. You can use -r to specify
a different rejectfile on the command line. If the rejectfile
already exists, patch overwrites it.
If you do not specify -R, patch starts
out with the assumption that the patchfile could be normal or reversed.
Therefore if the first change is rejected, patch tries the
reverse change to see if that one works. If the reverse change is also rejected,
patch continues on with other changes in the file, trying
both forward and reverses changes until one of them works. If the one that works
is a forward change, patch only attempts forward changes for
the rest of the file. If the one that works is a reverse change,
patch issues a message to this effect and asks if it should
treat all changes as reverse ones.
The patchfile can contain output from several
diff comparisons.
patch treats each collection of changes as a separate
patchfile, and with each, patch may prompt you for
the name of the file to be patched.
-B prefixsaves a copy of the original file in a back-up file. The back-up
file name is the name of the original file preceded by the string
prefix. If there is already a file with this name,
patch overwrites it. When applying more than one patch
to the same file, patch only copies the original for
the first patch. When you also specify -o
outfile, patch does not create
prefixfile, but if outfile already exists, it creates
prefixoutfile.
-bsaves a copy of the original file in a back-up file. The back-up
file name is the name of the original file plus the suffix
.orig. If there is already a file with this name,
patch overwrites it. When applying more than one patch
to the same file, patch only creates
file.orig for the first patch. When you also specify
-o outfile, patch does not
create file.orig, but if outfile already exists,
it creates outfile.orig.
-cinterprets the patchfile as a context diff file (the
output of diff when
-c or -C is specified). You cannot
use this option with -e or -n.
-D symbolmarks changes with the C preprocessor construct
#ifdef symbol
...
#endif
When you compile the resulting (patched) file, you get the original file if symbol is not defined, and the changed file if symbol is defined.
-d dirchanges the current directory to dir before processing the patch.
-einterprets the patchfile as an
ed script (the output of
diff when -e
is specified). You cannot use this option with -c or
-n.
-F nspecifies the number of lines of a context diff to ignore when searching for a place to install a patch.
-fforces processing without requesting additional information from the user.
-i patchfilereads information from patchfile. If you do not specify
patchfile, patch reads the information from the
standard input.
-lmatches any sequences of blanks in the patchfile to any sequence
of blanks in the input file. In other words,
patch considers two lines equivalent if the only
difference between them is their spacing.
-Nignores any patches which have already been applied. By default,
patch rejects already-applied patches.
-ninterprets the patchfile as normal
diff output. You cannot use
this option with -c or -e.
-o outfilewrites patched output to outfile instead of the original file.
When you specify more than one patch to a single file,
patch applies the patches to intermediate versions of
the file created by previous patches, resulting in multiple, concatenated
versions of the file being written to outfile.
-p ndeletes n components from the beginning of all path names in the
patchfile. If a path name is an absolute path name (that is, starts
with a slash), patch treats the leading slash as the
first component of the path, and patch
-p 1 deletes the leading slash. Specifying
-p 0 tells patch to use the full
path names given in the patchfile. If you do not specify this
option, patch only uses the base name (the final path
name component).
-Rreverses the sense of the patch script. In other words,
patch behaves as if the patch script shows the changes
that make the new version into the old version. You cannot use
-R if the patchfile is in
ed script format.
With -R, patch attempts to reverse
each change recorded in the script before applying the change.
patch saves rejected differences in reversed format
(which means that you can check the rejections to see if
patch made the reversals correctly).
-r rejectfilerecords rejects in the file rejectfile instead of the default
rejectfile name. By default, the rejectfile has the same
name as the original file, plus the suffix .rej.
-stells patch to remain silent until an error occurs.
Normally, patch writes information on the results of
the patching process to standard error (stderr).
-vdisplays the version number of patch, then
exits.
patch may return the following status values:
0Successful completion.
1There were one or more rejects.
>1An error occurred.
-B, -F, -f,
-s and -v options are not part of
the POSIX standard.
patch was written by Larry Wall.