从 Wikidot 导入
pwikit 可从 wikitCLI 制作的备份导入 Wikidot 站点。导入会将该站点的页面及其历史记录、评分、标签、附件和论坛写入您在 pwikit 中创建的站点,并一并建立参与过该站点的 Wikidot 账号。原成员随后可以认领自己的账号,保留其编写的全部内容。
导入的内容
| 内容 | 导入范围 |
|---|---|
| 页面 | 名称、标题、锁定状态、创建时间、最后编辑时间,以及创建该页面的账号 |
| 历史记录 | 每个版本的版本号、作者、时间和编辑说明,以及备份中保存了源代码的版本的页面源代码 |
| 评分 | 备份中有记录的账号投出的全部投票,包括 赞成/反对 与 星级 两种评分系统 |
| 标签 | 见标签 |
| 父页面 | 各页面的父页面,前提是父页面也在备份中 |
| 附件 | 文件本身,以及文件名、类型、大小、上传者和上传时间 |
| 账号 | 备份中列出的全部 Wikidot 账号,以待认领账号的形式导入 |
| 论坛 | 论坛分类;论坛主题的标题、描述、作者、置顶与锁定状态;帖子及其回复关系和每一次编辑;各页面的讨论 |
导入完成后,即可通过搜索找到导入的页面。
不导入的内容
- 站点设置,例如标题、主页、语言和时区,以及主题、身份组、权限和页面分类设置。请在管理后台中进行设置。
- 每次投票的时间。
- 备份中未保存源代码的版本(例如重命名和标签变更)的页面源代码。这些版本会出现在历史记录中,但没有源代码。
- 论坛帖子的原始维基语法。备份以 HTML 形式保存帖子,导入时会将其转换回维基语法,因此格式可能与原先输入的内容不同。
- 页面之间的链接关系。反向链接与
[[module WantedPages]]只列出导入后在 pwikit 中保存过的页面所包含的链接。 - 备份中没有记录的账号投出的投票。此类账号编写的版本、上传的附件和发表的帖子会保留,但不显示作者。
备份文件
请先解压备份。 pwikit import 读取的是目录,而不是压缩文件。wikitCLI 的备份是每个站点一个目录,另加一个存放账号信息的 _users 目录;把两者放置到同一个备份读取目录中即可。
含有 meta/site.json 的目录即为站点目录。 以下两种放法都可以使用:
单个站点。 直接指定站点目录,目录名即该站点的标识名。
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 指定要导入的站点。
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。放在其他目录时,指定该目录即可。
操作顺序
- 安装 pwikit。见部署。
- 使用
pwikit createsite创建站点。此时不要写入初始页面。 - 使用
pwikit backup create创建备份,以便在对导入结果不满意时撤销。见运维。 - 使用
pwikit import导入 Wikidot 备份。 - 使用
pwikit admin create创建首位管理员,并指定您自己的 Wikidot 用户名。您导入的账号将成为管理员账号。见首位管理员。 - 完成导入后的检查,再开放注册。
注意 请在任何人以 Wikidot 站点中的名称创建账号之前完成导入,首位管理员也不例外。导入前创建的账号不会与同名的 Wikidot 账号关联。导入会另外建立一个待认领账号,该成员的页面、版本、投票和帖子均归属于该账号。如需补救,请使用
pwikit user merge -from wd:<名字> -into <名字>将两个账号合并为一个,见命令行。
如果已经使用 pwikit seed 写入了初始页面,导入会保留这些页面,并跳过备份中同名的页面,例如 nav:side 和 nav:top。
执行导入
./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/ 中唯一的站点导入实例中唯一的站点:
./pwikit importarchive/ 中有多个站点时,选择其中一个:
./pwikit import -from my-wiki导入到包含多个站点的实例中的某个站点:
./pwikit import -site wiki只导入页面与历史记录:
./pwikit import -no-votes -no-files导入存放在其他位置的备份:
./pwikit import /srv/wikidot-backup导入过程中会输出进度,结束时输出汇总,其中 N accounts 为建立的账号数:
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-<编号> 形式的旧链接仍然有效。某个编号已被本实例中的其他内容占用时,改用新编号,并在导入结束时逐条列出:
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,即可按备份补齐:
./pwikit import -from <slug> -site <slug> -user-backfill- 页面版本、页面作者、附件、论坛主题、帖子与帖子版本中为空的作者,按备份补上;备份中有、站点中没有的评分会被加上。
- 已有的作者与评分不会被更改,因此可以重复执行。
- 论坛帖子按所在主题、先后顺序与发帖时间逐条对应,对应不上的帖子会被跳过。
- 管理员重置或删除过的评分也会被重新加上。只想补作者时,同时指定
-no-votes。
命令最后输出补上的数量,例如 filled in 2053 revision authors, 751 page authors, 682 ratings, ...。
增量更新
拿到同一站点更新的备份后,可以指定 -update 把站点中已有的内容更新到备份的状态:
./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 用户名。链接只能使用一次,有效期为三天。见新建账号与邀请。
首位管理员
导入完成后,通过命令行认领您自己的账号:
./pwikit admin create -name "Kakushi CTB"pwikit 会以不回显的方式要求输入密码,设置该密码,并授予该账号在实例所有站点上的全部权限:
Password:
took over kakushi-ctb (#12), imported as "kakushi-ctb"用法与注意事项见命令行。
导入后的检查
- 将导入结束时的汇总与 Wikidot 站点对照,确认页面、附件和论坛主题的数量,并留意是否报告了缺失的附件。
- 设置主页。新站点默认打开
main页面,而 Wikidot 站点通常以start为主页。在管理后台站点设置中将主页名称设为 Wikidot 站点所用的页面,该页面记录在备份meta/site.json的home_page中。 - 抽查若干页面的历史记录、评分、附件与标签,以及管理后台的用户与论坛版块。如需补充备份中没有的初始页面,执行
./pwikit seed,该命令只写入尚不存在的页面。
