How to make and apply SVN patch?

LinuxDiffPatch

Linux Problem Overview


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?

Linux Solutions


Solution 1 - Linux

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 2 - Linux

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 3 - Linux

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSandra SchlichtingView Question on Stackoverflow
Solution 1 - LinuxFoxView Answer on Stackoverflow
Solution 2 - LinuxMark ReedView Answer on Stackoverflow
Solution 3 - LinuxJames WierzbaView Answer on Stackoverflow