用patch升级Dokuwiki

修改了dokuwiki的一些系统配置文件,比如interwiki.conf里面,把英文维基百科改为了中文维基百科,增加互动百科等等。直接覆盖升级之后在去找当时的改动肯定比较麻烦,于是差异安装方式派上了用场。(PS:修改过的文件会patch失败,需要手动更改,上面的interwiki.conf就patch失败了)

一、升级步骤如下

来自dokuwiki官方wiki

1. 下载当前使用版本和新版本并解压

$> wget http://www.splitbrain.org/_media/projects/dokuwiki/dokuwiki-2005-07-01.tgz
$> wget http://www.splitbrain.org/_media/projects/dokuwiki/dokuwiki-2005-07-13.tgz
$> tar -xzf dokuwiki-2005-07-01.tgz
$> tar -xzf dokuwiki-2005-07-13.tgz

2. 产生diff列表

$> diff -Naur dokuwiki-2005-07-01 dokuwiki-2005-07-13 > doku.diff

3. 切换到wiki目录测试升级

$> cd wiki
$> patch -p1 <../doku.diff --dry-run
patching file VERSION
patching file conf/wordblock.conf
patching file inc/actions.php
patching file inc/io.php
patching file inc/lang/cs/admin.txt
patching file inc/lang/cs/admin_acl.txt
patching file inc/lang/cs/lang.php
patching file inc/lang/en/lang.php
patching file inc/lang/no/lang.php
patching file inc/parser/handler.php
patching file inc/parser/xhtml.php
patching file inc/template.php
patching file lib/exe/spellcheck.php
patching file lib/scripts/spellcheck.js

完整的安装包中包含install.php,而我们的wiki可能已经把它删除了,这是测试升级过程会中断,所以把完整安装包中的install.php文件删除在产生diff列表比较好。

4. 测试无误后正式升级

$> patch -p1 <../doku.diff
patching file VERSION
patching file conf/wordblock.conf
patching file inc/actions.php
patching file inc/io.php
patching file inc/lang/cs/admin.txt
patching file inc/lang/cs/admin_acl.txt
patching file inc/lang/cs/lang.php
patching file inc/lang/en/lang.php
patching file inc/lang/no/lang.php
patching file inc/parser/handler.php
patching file inc/parser/xhtml.php
patching file inc/template.php
patching file lib/exe/spellcheck.php
patching file lib/scripts/spellcheck.js

就这么愉快的升级完成了~

二、关于diff命令

diff是Unix系统的一个很重要的工具程序。它用来比较两个文本文件的差异,是代码版本管理的基石之一。

功能说明:比较文件的差异。
语  法:diff [-abBcdefHilnNpPqrstTuvwy][-][-C ][-D ][-I ][-S ][-W ][-x ][-X ][--help][--left-column][--suppress-common-line][文件或目录1][文件或目录2]
补充说明:diff以逐行的方式,比较文本文件的异同处。所是指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录。
参  数:
 - 指定要显示多少行的文本。此参数必须与-c或-u参数一并使用。
 -a或--text  diff预设只会逐行比较文本文件。
 -b或--ignore-space-change  不检查空格字符的不同。
 -B或--ignore-blank-lines  不检查空白行。
 -c  显示全部内文,并标出不同之处。
 -C或--context  与执行"-c-"指令相同。
 -d或--minimal  使用不同的演算法,以较小的单位来做比较。
 -D或ifdef  此参数的输出格式可用于前置处理器巨集。
 -e或--ed  此参数的输出格式可用于ed的script文件。
 -f或-forward-ed  输出的格式类似ed的script文件,但按照原来文件的顺序来显示不同处。
 -H或--speed-large-files  比较大文件时,可加快速度。
 -l或--ignore-matching-lines  若两个文件在某几行有所不同,而这几行同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异。
 -i或--ignore-case  不检查大小写的不同。
 -l或--paginate  将结果交由pr程序来分页。
 -n或--rcs  将比较结果以RCS的格式来显示。
 -N或--new-file  在比较目录时,若文件A仅出现在某个目录中,预设会显示:
Only in目录:文件A若使用-N参数,则diff会将文件A与一个空白的文件比较。
 -p  若比较的文件为C语言的程序码文件时,显示差异所在的函数名称。
 -P或--unidirectional-new-file  与-N类似,但只有当第二个目录包含了一个第一个目录所没有的文件时,才会将这个文件与空白的文件做比较。
 -q或--brief  仅显示有无差异,不显示详细的信息。
 -r或--recursive  比较子目录中的文件。
 -s或--report-identical-files  若没有发现任何差异,仍然显示信息。
 -S或--starting-file  在比较目录时,从指定的文件开始比较。
 -t或--expand-tabs  在输出时,将tab字符展开。
 -T或--initial-tab  在每行前面加上tab字符以便对齐。
 -u,-U或--unified=  以合并的方式来显示文件内容的不同。
 -v或--version  显示版本信息。
 -w或--ignore-all-space  忽略全部的空格字符。
 -W或--width  在使用-y参数时,指定栏宽。
 -x或--exclude  不比较选项中所指定的文件或目录。
 -X或--exclude-from  您可以将文件或目录类型存成文本文件,然后在=中指定此文本文件。
 -y或--side-by-side  以并列的方式显示文件的异同之处。
 --help  显示帮助。
 --left-column  在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容。
 --suppress-common-lines  在使用-y参数时,仅显示不同之处。

 扩展阅读

Linux diff详解

三、关于patch命令

基本语法

patch
此命令用于为特定软件包打补丁,他使用diff命令对源文件进行操作。
基本命令语法:
patch [-R] {-p(n)} [--dry-run] < patch_file_name
p:为path的缩写。
n:指将patch文件中的path第n条’/’及其左边部分取消。
-R:卸载patch包。
--dry-run:尝试patch软件,并不真正修改软件。

选项p的意义

参数-p来指定从第几层开始比较。比如有一个patch文件的补丁头是这样的:

代码:
--- old/modules/pcitableMon Sep 27 11:03:56 1999
+++ new/modules/pcitableTue Dec 19 20:05:41 2000

如果使用参数-p0,就表示从当前目录,找一个叫作new的目录,在它下面找一个叫modules的目录,再在它下面找一个叫pcitableMon的目录。
如果使用参数-p1,就表示忽略第一层,从当前目录找一个叫modules的目录,在它下面找一个叫modules的目录。这样会忽略掉补丁头提到的new目录。
依此类推。

选项N的意义

再次打补丁时会提示:

Reversed (or previously applied) patch detected! Assume -R?[n]

如果输入y,则还原。接下来询问是否应用补丁:

Apply anyway? [n]

输入y应用补丁。

如果不想看到这些提示可以加选项N:

如果你想严格指定是应用补丁可以使用下面命令(就是增加N参数):

# patch -Np0 < foo.patch

如果你想严格指定是还原补丁可以使用下面命令(就是增加R参数):

# patch -Rp0 < foo.patch

2 thoughts on “用patch升级Dokuwiki

  1. 自己的 interwiki的内容可以写到 interwiki.local.conf,这样覆盖升级就不会丢失了。conf/下很多文件都可以这样做:https://www.dokuwiki.org/config

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注