G'day,
我已经得到了一个要添加到Apache2.2.14的补丁,而一个统一的diff根本没有对该文件进行补丁。我正在使用GNU补丁2.5.4。
我不得不忽略空白,因为原来的补丁做得不好,也就是说,许多差异似乎是针对tab->空间转换。这些类型的差异甚至不太有用,因为补丁文件已经在交付链的某个位置进行了修改,例如svn存储库、Jira系统、web界面等,因此所有选项卡都已转换为空间!
/usr/bin/gpatch --verbose --ignore-whitespace -p1 -d . \
<mod_cache.diff
输出为:
...
Hmm... The next patch looks like a unified diff to me...
The text leading up to this was:
|Index: httpd/modules/cache/mod_cache.h
|===================================================================
|
|+++ httpd/modules/cache/mod_cache.h
Patching file modules/cache/mod_cache.h using Plan A...
Hunk #1 succeeded at 24.
Hunk #2 succeeded at 86.
Hunk #3 succeeded at 138.
Hunk #4 succeeded at 163.
Hunk #5 succeeded at 184.
Hunk #6 succeeded at 217.
Hunk #7 succeeded at 271.
Hunk #8 succeeded at 380.
...
Hunk
线
...
Index: httpd/modules/cache/mod_cache.h
===================================================================
--- httpd/modules/cache/mod_cache.h
+++ httpd/modules/cache/mod_cache.h
@@ -86,9 +86,13 @@
#define DEFAULT_CACHE_MAXEXPIRE MSEC_ONE_DAY
#define DEFAULT_CACHE_EXPIRE MSEC_ONE_HR
#define DEFAULT_CACHE_LMFACTOR (0.1)
+#define DEFAULT_CACHE_MAXAGE 5
+#define DEFAULT_CACHE_LOCKPATH "/mod_cache-lock"
+#define CACHE_LOCKNAME_KEY "mod_cache-lockname"
+#define CACHE_LOCKFILE_KEY "mod_cache-lockfile"
-
#if !defined(WIN32)
#define CACHE_DECLARE(type) type
...
以及消息来源的相关部分,
(假定)加上一些上下文,是:
...
#define MSEC_ONE_DAY ((apr_time_t)(86400*APR_USEC_PER_SEC))
#define MSEC_ONE_HR ((apr_time_t)(3600*APR_USEC_PER_SEC))
#define MSEC_ONE_MIN ((apr_time_t)(60*APR_USEC_PER_SEC))
#define MSEC_ONE_SEC ((apr_time_t)(APR_USEC_PER_SEC))
#define DEFAULT_CACHE_MAXEXPIRE MSEC_ONE_DAY
#define DEFAULT_CACHE_EXPIRE MSEC_ONE_HR
#define DEFAULT_CACHE_LMFACTOR (0.1)
#if !defined(WIN32)
#define CACHE_DECLARE(type) type
#define CACHE_DECLARE_NONSTD(type) type
#define CACHE_DECLARE_DATA
#elif defined(CACHE_DECLARE_STATIC)
...
所有其他补丁似乎都已成功应用或被忽略。
你知道为什么这个特殊的差别不起作用吗?
编辑:
按照下面Adam的建议将补丁模糊因子降低到零后,补丁成功运行。
多亏了亚当·古德,如果我能再给你一次投票,我会的!这是我的建议
relevant paragraph for fuzz
如果您感兴趣,请参阅GNU diffutils手册。
编辑2:
顺便说一句,在那一段的底部有一个高度相关的警告:
补丁通常会产生正确的结果,即使它必须进行许多猜测。但是,只有将修补程序应用于生成修补程序的文件的精确副本时,才能保证结果。