修改了dokuwiki的一些系统配置文件,比如interwiki.conf里面,把英文维基百科改为了中文维基百科,增加互动百科等等。直接覆盖升级之后在去找当时的改动肯定比较麻烦,于是差异安装方式派上了用场。(PS:修改过的文件会patch失败,需要手动更改,上面的interwiki.conf就patch失败了)
一、升级步骤如下
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参数时,仅显示不同之处。
扩展阅读
三、关于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
自己的 interwiki的内容可以写到 interwiki.local.conf,这样覆盖升级就不会丢失了。conf/下很多文件都可以这样做:https://www.dokuwiki.org/config
多谢指教。 一眼就认出你头像了,搭dokuwiki的时候经常到你博客