Skip to content

从 Wikidot 导入 ​

pwikit 可从 wikitCLI 制作的备份导入 Wikidot 站点。导入会将该站点的页面及其历史记录、评分、标签、附件和论坛写入您在 pwikit 中创建的站点,并一并建立参与过该站点的 Wikidot 账号。原成员随后可以认领自己的账号,保留其编写的全部内容。

导入的内容 ​

内容导入范围
页面名称、标题、锁定状态、创建时间、最后编辑时间,以及创建该页面的账号
历史记录每个版本的版本号、作者、时间和编辑说明,以及备份中保存了源代码的版本的页面源代码
评分备份中有记录的账号投出的全部投票,包括 赞成/反对 与 星级 两种评分系统
标签见标签
父页面各页面的父页面,前提是父页面也在备份中
附件文件本身,以及文件名、类型、大小、上传者和上传时间
账号备份中列出的全部 Wikidot 账号,以待认领账号的形式导入
论坛论坛分类;论坛主题的标题、描述、作者、置顶与锁定状态;帖子及其回复关系和每一次编辑;各页面的讨论

导入完成后,即可通过搜索找到导入的页面。

不导入的内容 ​

  • 站点设置,例如标题、主页、语言和时区,以及主题、身份组、权限和页面分类设置。请在管理后台中进行设置。
  • 每次投票的时间。
  • 备份中未保存源代码的版本(例如重命名和标签变更)的页面源代码。这些版本会出现在历史记录中,但没有源代码。
  • 论坛帖子的原始维基语法。备份以 HTML 形式保存帖子,导入时会将其转换回维基语法,因此格式可能与原先输入的内容不同。
  • 页面之间的链接关系。反向链接与 [[module WantedPages]] 只列出导入后在 pwikit 中保存过的页面所包含的链接。
  • 备份中没有记录的账号投出的投票。此类账号编写的版本、上传的附件和发表的帖子会保留,但不显示作者。

备份文件 ​

请先解压备份。 pwikit import 读取的是目录,而不是压缩文件。wikitCLI 的备份是每个站点一个目录,另加一个存放账号信息的 _users 目录;把两者放置到同一个备份读取目录中即可。

含有 meta/site.json 的目录即为站点目录。 以下两种放法都可以使用:

单个站点。 直接指定站点目录,目录名即该站点的标识名。

text
xxx-wiki/              交给 pwikit import 的目录
  meta/
    site.json          站点自身的信息;该文件是站点目录的标志
    pages/*.json       每个页面一个文件:页面名、标题、父页面、标签、评分、锁定状态、版本、投票、附件
    forum/category/*.json      论坛分类
    forum/<分类>/<主题>.json     论坛主题
  pages/*.7z           页面源代码,每个页面一个压缩包,文件名与 meta/pages 中一致
  forum/<分类>/<主题>.7z       各论坛主题中的帖子
  files/<页面名>/<附件 id>      附件;页面名中的冒号写作 %3A
  _users/*.json        本备份自带的账号信息,如有

多个站点。 将各个压缩包解压到同一个目录中,并指定该目录。其中每个站点保持上述结构,通过 -from 指定要导入的站点。

text
wikidot-backup/        交给 pwikit import 的目录
  _users/*.json        账号信息,由同级的各站点共用
  xxx-wiki/            一个站点,目录名即其标识名
  xxx-wiki-cn/         另一个站点
  xxx-wiki-jp/         另一个站点

站点目录中也可能自带 _users/。两处的账号信息都会读取;同一个账号在两处都有时,取抓取时间较新的那份。

注意 账号信息通常在站点目录之外、与它同级的 _users/ 中。只指定站点目录时,也会读取与它同级的这份 _users/。站点目录被单独移到别处、旁边没有 _users/ 时,就读不到这些账号:若一个账号都读不到,导入会拒绝执行、不写入任何内容;若只读到站点目录自带的一部分,其余作者会缺失。导入结束时输出的 N accounts 即为建立的账号数,可据此确认。

最简便的做法是将 _users/ 与站点目录直接放进数据目录的 archive/,该目录由 pwikit createsite 建立,然后执行不带目录的 pwikit import。这样 archive/ 就是上面的多站点结构,只有一个站点时也不必写 -from。放在其他目录时,指定该目录即可。

操作顺序 ​

  1. 安装 pwikit。见部署。
  2. 使用 pwikit createsite 创建站点。此时不要写入初始页面。
  3. 使用 pwikit backup create 创建备份,以便在对导入结果不满意时撤销。见运维。
  4. 使用 pwikit import 导入 Wikidot 备份。
  5. 使用 pwikit admin create 创建首位管理员,并指定您自己的 Wikidot 用户名。您导入的账号将成为管理员账号。见首位管理员。
  6. 完成导入后的检查,再开放注册。

注意 请在任何人以 Wikidot 站点中的名称创建账号之前完成导入,首位管理员也不例外。导入前创建的账号不会与同名的 Wikidot 账号关联。导入会另外建立一个待认领账号,该成员的页面、版本、投票和帖子均归属于该账号。如需补救,请使用 pwikit user merge -from wd:<名字> -into <名字> 将两个账号合并为一个,见命令行。

如果已经使用 pwikit seed 写入了初始页面,导入会保留这些页面,并跳过备份中同名的页面,例如 nav:side 和 nav:top。

执行导入 ​

sh
./pwikit import [directory] [options]

在 Windows 上,请将 ./pwikit 替换为 .\pwikit.exe。

目录是解压后的 wikitCLI 备份:站点目录,或存放多个站点目录的上层目录。不指定目录时,无论在哪个目录下执行,都读取数据目录中的 archive/。参数写在目录之前或之后均可。

参数说明
-from <slug>备份中的站点。备份包含多个站点时必须指定
-site <slug>导入到的 pwikit 站点。数据库包含多个站点时必须指定。pwikit site list 可列出各站点的标识名
-no-tags不导入标签
-no-votes不导入评分
-no-files不导入附件
-no-accounts不建立任何账号,即使备份中带有账号。导入的页面、版本与帖子都没有作者,投票全部丢弃。备份中一个账号都没有时,也要用它才能导入
-own-users只从站点目录内的 _users/ 读取账号,不读取与站点目录同级的共用 _users/。共用的那份属于别的备份、不想带进无关账号时使用
-used-users只为本次导入的页面版本、评分、附件与论坛中出现过的用户建立账号。默认为读到的所有账号建立账号,包括共用 _users/ 中其他站点的用户。同时指定 -no-votes 或 -no-files 时,只出现在评分或附件中的用户不计入
-user-backfill对站点中已存在的页面,按备份补上缺失的作者与评分,见补全作者与评分。不能与 -no-accounts 同时使用
-update用更新的备份更新站点中已存在的页面,并补上缺少的评分、附件、论坛主题与帖子,见增量更新。执行前会列出计划并要求确认
-yes与 -update 一起使用时,不经确认直接执行
-data-dir <dir>数据目录。不指定目录时从其中的 archive/ 读取备份。附件会复制到其中的 files/ 目录,pwikit.toml 与内置 PostgreSQL 也从该目录查找。默认依次使用 PWIKIT_DATA_DIR 和 pwikit 所在目录
-database <url>PostgreSQL 连接字符串。默认依次使用 DATABASE_URL、pwikit.toml 中的 database 和内置 PostgreSQL

请使用与 pwikit serve 相同的数据目录和数据库,否则页面会写入另一个数据库,或者附件会存放到站点不读取的位置。pwikit serve 运行期间也可以执行导入。

将 archive/ 中唯一的站点导入实例中唯一的站点:

sh
./pwikit import

archive/ 中有多个站点时,选择其中一个:

sh
./pwikit import -from my-wiki

导入到包含多个站点的实例中的某个站点:

sh
./pwikit import -site wiki

只导入页面与历史记录:

sh
./pwikit import -no-votes -no-files

导入存放在其他位置的备份:

sh
./pwikit import /srv/wikidot-backup

导入过程中会输出进度,结束时输出汇总,其中 N accounts 为建立的账号数:

text
importing my-wiki into wiki
6210 accounts, 799 pages
200 of 799 pages
400 of 799 pages
600 of 799 pages
100 threads, 312 posts
...
799 pages, 0 already there, 7410 revisions, 108 parents, 159 files, 6210 accounts
9 forum categories, 498 threads, 1830 posts
消息原因
the backup holds 2 sites, name one with -from备份包含多个站点,但未指定 -from
the backup has no site "<slug>"-from 指定的站点不在备份中
<数据目录>/archive does not exist; ...未指定目录,而数据目录中没有 archive/。把备份放进去、指定备份所在目录,或检查 -data-dir
no site under "<path>"; ...该目录本身及其下一层都没有 meta/site.json,通常是备份放错了层级
"<path>" is a file, and pwikit reads the unpacked backup; ...指定的是压缩文件,请先解压
the backup names authors but holds no accounts, so nothing was imported. ...备份记录了作者,却没有读到任何 _users/,通常是站点目录被单独移到了别处,旁边没有 _users/。此时什么都没有写入,把 _users/ 放到站点目录旁边,或两者都放进 archive/ 后不指定目录,重新执行即可。确实只要内容、不要作者时,指定 -no-accounts
this database holds 2 sites, name one with -site实例包含多个站点,但未指定 -site
no site with slug "<slug>"-site 指定的站点不存在
this database holds no site, make one with createsite尚未创建任何站点

标签 ​

导入会创建站点尚不存在的标签与标签分类。指定 -no-tags 时,页面导入后没有标签。

导入标签时:

  • 标签名会转换为小写;
  • 写作 category:name 的标签归入标签分类 category;
  • 包含空格的标签会被跳过。

请在首次导入前做出决定。再次执行导入时,不会为站点中已存在的页面添加标签。

评分与附件 ​

指定 -no-votes 时,页面导入后没有评分。指定 -no-files 时,不复制附件。

附件会复制到数据目录的 files/media/ 中。如果备份列出的附件缺少文件,导入会输出 missing attachment <page>/<file> 并继续。

再次执行导入时,不会为站点中已存在的页面添加评分或附件。

论坛 ​

仅在站点中尚无论坛版块时导入论坛。导入会创建名为 Imported 的论坛版块,并将备份中的论坛分类放入其中。页面的讨论会关联到对应页面。若某个论坛分类中超过半数的论坛主题是页面讨论,该分类会被标记为承载文章评论。

如果站点已有论坛版块,导入会输出 the site already has a forum, leaving it alone 并跳过论坛。

论坛分类、论坛主题与帖子沿用 Wikidot 上的编号,因此 /forum/c-<编号>、/forum/t-<编号> 与 #post-<编号> 形式的旧链接仍然有效。某个编号已被本实例中的其他内容占用时,改用新编号,并在导入结束时逐条列出:

text
2 forum numbers from Wikidot were already taken here and got new ones:
  t-17071807 -> t-18334710
  post-6884529 -> post-9059395

列出的旧编号不再指向导入的内容,需要时请手动修改引用它们的链接。此后在本站新建的论坛分类、论坛主题与帖子,编号从导入的最大编号之后开始。

账号 ​

备份中列出的每个账号都会被建立,包括只出现在同一备份其他站点中的账号。显示名采用 Wikidot 上的显示名。导入的账号在被认领之前无法登录。

在页面版本、评分、附件或论坛中出现、但备份的 _users/ 中没有资料的用户,通常是已在 Wikidot 注销的用户。导入会为每个这样的用户建立一个占位账号,显示为 wd:已删除-<编号>,其页面版本、评分与帖子照常归属于它。显示名按站点语言写入。占位账号无法认领。

账号属于整个实例,而非某个站点。之后的导入若涉及实例中已有的 Wikidot 账号,会直接使用该账号且不做任何更改,无论其是否已被认领。唯一的例外是占位账号:之后的备份带有该用户的资料时,占位账号会改用其真实的用户名与显示名。

再次执行导入 ​

可以使用同一份备份再次执行导入,也可以将另一份备份导入同一站点:

  • 站点中已存在的页面会被跳过,不会从备份获得版本、评分、标签或附件;仅其父页面会按备份中的记录进行设置。
  • 已存在的账号会被沿用。
  • 站点已有论坛版块时,跳过论坛。
  • 指定 -user-backfill 时,已存在的页面会按备份补上缺失的作者与评分,见补全作者与评分。
  • 指定 -update 时,已存在的页面会按更新的备份更新,见增量更新。

因此,再次执行无法修复中途停止的导入:停止时正在写入的页面可能缺少附件,正在写入的论坛会保持不完整。导入中途停止时,请恢复导入前制作的备份,然后重新执行导入。

补全作者与评分 ​

以下情况会使已导入的页面缺少作者或评分:

  • 使用旧版本 pwikit 导入时,备份中没有资料的用户不会建立账号,其页面版本显示为"系统",其评分被丢弃。
  • 导入时 _users/ 不完整,或指定了 -no-accounts。

用同一份备份再次执行导入并指定 -user-backfill,即可按备份补齐:

sh
./pwikit import -from <slug> -site <slug> -user-backfill
  • 页面版本、页面作者、附件、论坛主题、帖子与帖子版本中为空的作者,按备份补上;备份中有、站点中没有的评分会被加上。
  • 已有的作者与评分不会被更改,因此可以重复执行。
  • 论坛帖子按所在主题、先后顺序与发帖时间逐条对应,对应不上的帖子会被跳过。
  • 管理员重置或删除过的评分也会被重新加上。只想补作者时,同时指定 -no-votes。

命令最后输出补上的数量,例如 filled in 2053 revision authors, 751 page authors, 682 ratings, ...。

增量更新 ​

拿到同一站点更新的备份后,可以指定 -update 把站点中已有的内容更新到备份的状态:

sh
./pwikit import -from <slug> -site <slug> -update
  • 页面:导入后未在本站改动过的页面,接上备份中更新的版本,并更新标题、锁定状态与标签。判断依据是站点中该页面最新的一版,其版本号与时间与备份中对应的一版一致。
  • 本站改动过的页面:包括编辑、改标题、改标签等任何产生新版本的操作。这些页面不会被更新,会在确认前与执行后列出清单,请手工处理。
  • 新页面:与普通导入相同,完整导入。
  • 评分:每个已存在的页面都补上站点中没有的评分,已有的评分保持不变。管理员重置或删除过的评分也会被重新加上;不想这样时,同时指定 -no-votes。
  • 附件:补上站点中没有的附件,按文件名判断,已有与已删除的附件都不会被再次添加。
  • 论坛:补上新的论坛分类与主题;已有主题中,补上站点中没有的帖子,按发帖时间与作者逐条对应。已有帖子不会被更改。补上的内容与首次导入一样沿用 Wikidot 编号,见论坛。论坛不是由导入建立时,跳过论坛。
  • 账号:与普通导入相同。

在 Wikidot 上删除或改名的页面不会被处理:备份中无法区分这两种情况。改名后的页面会以新名称作为新页面导入,原名称的页面保留在站点中。

执行前,命令先输出新页面、待更新页面与已是最新的页面数量,列出本站改动过的页面,然后询问 Continue? [y/N],输入 y 以外的任何内容均会取消。指定 -yes 可跳过此询问。

注意 不建议在站点已经有人使用之后再做增量更新。本站改动过的页面不会更新,只会列出来;本站重置或删除过的评分会被重新加上;本站有人回复过的论坛主题,新帖子只能按发帖时间逐条对应。站点上的活动越多,需要手工处理的地方越多。执行前请先用 pwikit backup create 备份。

认领导入的账号 ​

导入的账号保存着对应 Wikidot 用户的全部页面、版本、投票和帖子。认领会为该账号设置密码并将其转为普通账号,账号中的全部内容保持不变。

在注册页面认领 ​

成员在站点的注册页面(/-/signup)的用户名中输入自己的 Wikidot 用户名,并填写发送到其 Wikidot 账号的验证码,即可认领账号。具体步骤见功能中关于认领 Wikidot 账号的说明。

  • 验证码由外部验证服务发送,因此运行 pwikit 的服务器必须能够访问互联网上的 wikit.unitreaty.org。
  • 用户名以折叠后的形式进行比较:转换为小写,并将连续的空格与标点替换为一个连字符。Kakushi CTB 与 kakushi-ctb 指同一个账号。
  • 认领后的账号会获得站点设置中认领后的身份组所指定的身份组。

通过认领链接 ​

管理员可以为某个账号生成无需验证码的认领链接:在管理后台打开用户,选择生成认领链接,选择账号,然后将链接发送给该账号的所有者。所有者打开链接后设置密码,用户名沿用 Wikidot 用户名。链接只能使用一次,有效期为三天。见新建账号与邀请。

首位管理员 ​

导入完成后,通过命令行认领您自己的账号:

sh
./pwikit admin create -name "Kakushi CTB"

pwikit 会以不回显的方式要求输入密码,设置该密码,并授予该账号在实例所有站点上的全部权限:

text
Password:
took over kakushi-ctb (#12), imported as "kakushi-ctb"

用法与注意事项见命令行。

导入后的检查 ​

  1. 将导入结束时的汇总与 Wikidot 站点对照,确认页面、附件和论坛主题的数量,并留意是否报告了缺失的附件。
  2. 设置主页。新站点默认打开 main 页面,而 Wikidot 站点通常以 start 为主页。在管理后台站点设置中将主页名称设为 Wikidot 站点所用的页面,该页面记录在备份 meta/site.json 的 home_page 中。
  3. 抽查若干页面的历史记录、评分、附件与标签,以及管理后台的用户与论坛版块。如需补充备份中没有的初始页面,执行 ./pwikit seed,该命令只写入尚不存在的页面。