53

我想制作一个 SVN 类型的补丁文件,httpd.conf以便我可以轻松地将其应用于其他主机。

如果我做

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

我得到:

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: 

问题

我究竟做错了什么?

4

3 回答 3

78

使用svn patch.

案例1:使用/usr/bin/patch

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

如果没有通过svn add或添加/删除文件,则可以很好地应用您的更改svn delete

案例2:使用svn patch

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

也跟踪添加和删除的文件。

请注意,轨道svn moves 和renames

于 2013-07-16T14:11:53.067 回答
52

默认情况下,patch忽略目标文件名的目录部分;它只是在您当前的工作目录中寻找“httpd.conf”。如果您希望它使用完整路径,则必须使用以下选项明确要求它这样做-p

patch -p 0 < httpd.patch

后面的数字-p是要从文件名路径中删除的级别;-p N 去掉包括斜线号 N 在内的所有内容。第一个斜线是数字 1,所以-p 0意思是“不要去掉任何东西”。

不过,一般来说,最好不要依赖补丁文件中的完整路径;如果它甚至适用于不同目录布局中的文件,则该补丁将更普遍有用。在运行补丁之前,您始终可以 cd 进入包含该文件的目录(如果需要,可以使用完整路径来查找补丁文件本身)。

于 2012-04-26T12:53:50.203 回答
7

如果你使用 TortoiseSVN,有一个易于使用的界面来创建和应用补丁。

创造:

右键单击文件夹 -> TortoiseSVN -> 创建补丁

系统将提示您选择输出文件

申请:

右键单击文件夹 -> TortoiseSVN -> 应用补丁

系统将提示您选择要应用补丁的文件并在必要时合并的界面。

于 2016-06-21T18:29:29.977 回答