How to make and apply SVN patch?

100,049

Solution 1

By default, patch ignores the directory portion of the target filename; it's just looking for "httpd.conf" in your current working directory. If you want it to use the full path, you have to explicitly ask it to do so with the -p option:

patch -p 0 < httpd.patch

The number after -p is how many levels to remove from the filename path; -p N strips off everything up to and including slash number N. The first slash is number 1, so -p 0 means "don't strip anything".

In general, you might be better off not relying on having the full path in the patch file, though; the patch will be more generally useful if it works even for files in a different directory layout. You can always cd into the directory containing the file before running patch (and use a full path to find the patch file itself, if needed, instead).

Solution 2

Use svn patch.

Case 1: using /usr/bin/patch:

svn diff > $TMPDIR/mypatchfile.patch
cd myOtherCheckOut
patch -p0 < $TMPDIR/mypatchfile.patch

Applies your changes well if there are no added/deleted files through svn add or svn delete

Case 2: using svn patch:

svn diff > $TMPDIR/mypatchfile.patch
cd myOtherCheckOut
svn patch $TMPDIR/mypatchfile.patch

Tracks added and deleted files too.

Note that neither tracks svn moves and renames

Solution 3

If you're using TortoiseSVN there is a easy to use interface to create and apply a patch.

To create:

Right click on folder -> TortoiseSVN -> Create patch

You will be prompted to select an output file

To apply:

Right click on folder -> TortoiseSVN -> Apply patch

You will be prompted with an interface to select the file(s) to apply the patches to, and merge if necassary.

Share:
100,049
Sandra Schlichting
Author by

Sandra Schlichting

Updated on July 09, 2022

Comments

  • Sandra Schlichting
    Sandra Schlichting almost 2 years

    I would like to make a SVN type patch file for httpd.conf so I can easily apply it to other hosts.

    If I do

    cd /root
    diff -Naur /etc/httpd/conf/httpd.conf_original /etc/httpd/conf/httpd.conf > httpd.patch
    cp /etc/httpd/conf/httpd.conf_original /etc/httpd/conf/httpd.conf
    patch < httpd.patch
    

    I get:

    can't find file to patch at input line 3
    Perhaps you should have used the -p or --strip option?
    The text leading up to this was:
    --------------------------
    |--- /etc/httpd/conf/httpd.conf_original    2012-04-26 13:36:08.331068438 +0200
    |+++ /etc/httpd/conf/httpd.conf 2012-04-26 14:27:36.857075085 +0200
    --------------------------
    File to patch: 
    

    Question

    What am I doing wrong?