查看: 566|回复: 1

DiscuzX MitFrame 分支更新教程:代码同步、站点备份与回退

[复制链接]

39

主题

61

回帖

1105

积分

包子铺掌柜

原创
0
贡献
500
分享
1
积分
1105

特殊贡献荣誉管理

发表于 2025-7-22 22:19:28 |日本| 显示全部楼层 |阅读模式
DiscuzX MitFrame 分支更新教程:代码同步、站点备份与回退

本文记录 cdbao.org 从 Gitee 同步 DiscuzX MitFrame 分支,并更新到现有站点的操作流程,方便后续维护时查阅。

整个流程分为两部分:先更新本地 Git 仓库,再将仓库中的 upload 目录同步到网站目录。更新仓库不会自动更新网站,也不会自动完成数据库升级。

一、环境与目录说明

本文使用以下路径:
  • 本地代码仓库:/root/workspace/DiscuzX/
  • 待部署程序:/root/workspace/DiscuzX/upload/
  • 网站目录:/home/wwwroot/cdbao.org/
  • 备份根目录:/root/workspace/backup/cdbao.org/
  • 跟踪分支:MitFrame


以下命令按 Bash 环境编写。路径、数据库名称及运行用户需要根据自己的环境调整。涉及变量的步骤请在同一个终端会话中依次执行;命令报错时先处理错误,不要直接继续下一步。

二、获取并更新 MitFrame 分支

1. 首次克隆仓库

只有尚未下载仓库时才需要执行:
  1. mkdir -p /root/workspace
  2. cd /root/workspace
  3. git clone --branch MitFrame https://gitee.com/Discuz/DiscuzX.git
  4. cd DiscuzX
复制代码


2. 检查已有仓库

后续更新时直接进入仓库,确认工作区、分支和远程地址:
  1. cd /root/workspace/DiscuzX
  2. git status
  3. git branch -v
  4. git remote -v
复制代码


远程仓库应指向 https://gitee.com/Discuz/DiscuzX.git。若存在未提交修改,先检查并提交或妥善保存,再切换分支、拉取更新。

3. 同步上游代码

如果本地仓库主要用于部署,没有独立开发的提交,可以使用仅允许快进的方式更新:
  1. git switch MitFrame
  2. git pull --ff-only origin MitFrame
复制代码


也可以拆成两步,先获取远程信息,再合并:
  1. git fetch origin
  2. git merge --ff-only origin/MitFrame
复制代码


两种方式任选其一。如果提示不能快进,说明本地与远程历史已经分叉,需要检查本地提交后再决定如何整合。

4. 有本地提交时的处理方式

需要保留本地提交时,可根据仓库的协作方式选择 merge 或 rebase,不要将两套冲突处理命令混用。

使用 merge:
  1. git fetch origin
  2. git merge origin/MitFrame

  3. # 如发生冲突:手动修改冲突文件后,逐个暂存已解决的文件
  4. git add path/to/resolved-file
  5. git merge --continue

  6. # 若决定取消本次合并
  7. # git merge --abort
复制代码


使用 rebase:
  1. git pull --rebase origin MitFrame

  2. # 如发生冲突:手动修改冲突文件后,逐个暂存已解决的文件
  3. git add path/to/resolved-file
  4. git rebase --continue

  5. # 若决定取消本次变基
  6. # git rebase --abort
复制代码


其中 path/to/resolved-file 是占位路径,需要替换为实际文件。没有冲突时,无须执行冲突处理命令。rebase 会改写本地提交历史,已共享的提交应按团队约定处理。

5. 验证仓库状态
  1. git log --oneline -10
  2. git status
复制代码


确认当前处于 MitFrame 分支,工作区没有未处理的修改。原文中的 ae3036db 和 20250701 是当时的提交记录,不代表当前最新版本;每次更新以实际拉取结果为准。

三、更新前备份

正式更新前,先查看目标版本的升级说明,确认是否涉及数据库、运行环境或模板兼容性变化。生产站点建议进入维护状态,并暂停计划任务等写入操作,让文件备份与数据库备份尽量对应同一时点。

1. 创建本次备份目录

时间戳只生成一次,后续文件备份和数据库备份使用同一个目录:
  1. BACKUP_TIME=$(date +%Y%m%d_%H%M%S)
  2. BACKUP_DIR="/root/workspace/backup/cdbao.org/$BACKUP_TIME"
  3. mkdir -p "$BACKUP_DIR/site"
  4. chmod 700 "$BACKUP_DIR"
  5. printf '本次备份目录:%s\n' "$BACKUP_DIR"
复制代码


记下输出的路径,回退时需要使用。

2. 备份站点文件
  1. rsync -av \
  2.     --exclude='/data/attachment/' \
  3.     /home/wwwroot/cdbao.org/ \
  4.     "$BACKUP_DIR/site/"
复制代码


这份备份包含站点程序、配置以及附件以外的 data 内容,但不包含 data/attachment 附件目录。附件需要有独立备份;如果希望本次也备份附件,删除该排除参数,并确认剩余空间足够。

3. 备份数据库

将 DB_USER 和 DB_NAME 替换为实际数据库用户名和库名,执行后按提示输入密码:
  1. mysqldump -u DB_USER -p DB_NAME > "$BACKUP_DIR/database.sql"
复制代码


确认命令成功结束并检查备份文件。文件备份不能替代数据库备份;具体导出参数应根据数据库版本、表引擎及权限设置调整。

四、整理同步排除规则

网站中有配置文件、运行数据和自行修改的模板,不能直接全部覆盖。将排除规则单独保存,试运行和正式同步共用同一份文件,避免两份命令内容不一致。

以下清单以本站原有规则为基础,并补充了 robots.txt、常见站点配置文件和 install 目录。它不是所有 Discuz 站点通用的完整清单;自定义插件、模板及其他改动仍需按实际情况补充。

  1. EXCLUDE_FILE='/root/workspace/cdbao-rsync-excludes.txt'

  2. cat > "$EXCLUDE_FILE" <<'EOF'
  3. /config/config_global.php
  4. /config/config_ucenter.php
  5. /data/
  6. /sitemaps/
  7. /sitemap.xml
  8. /source/child/cron/cron_sitemaps.php
  9. /source/child/cron/cron_sitemaps_split.php
  10. /template/default/common/common.css
  11. /template/default/common/module.css
  12. /template/default/common/header_common.php
  13. /template/default/touch/common/header.php
  14. /template/default/common/editor.css
  15. /template/default/common/iconfont.eot
  16. /template/default/home/space_notice.php
  17. /template/default/touch/home/space_notice.php
  18. /static/image/common/
  19. /static/image/feed/
  20. /static/image/smiley/nachoneko/
  21. /favicon.ico
  22. /favicon.ico.bak
  23. /robots.txt
  24. /.htaccess
  25. /.user.ini
  26. /install/
  27. /test.php
  28. *.log
  29. *.bak
  30. EOF
复制代码


这里以 / 开头的路径,相对于同步源 upload/ 的根目录,例如 /data/ 对应 upload/data/。

注意:排除文件可以保留本地修改,同时也会跳过上游对这些文件的更新。尤其是模板、样式和静态资源,需要在每次升级时单独比较差异,把必要的修复合并到自定义版本中。若升级说明要求使用 install 中的升级工具,应按官方流程单独处理。

五、试运行并同步站点文件

1. 先预览变更
  1. rsync -av --itemize-changes --dry-run \
  2.     --exclude-from="$EXCLUDE_FILE" \
  3.     /root/workspace/DiscuzX/upload/ \
  4.     /home/wwwroot/cdbao.org/
复制代码


--dry-run 只预览,不实际写入。检查输出,确认待覆盖的文件中没有遗漏的自定义内容。源路径末尾的 / 表示同步 upload 目录内的内容。

2. 确认后正式同步
  1. rsync -av --itemize-changes \
  2.     --exclude-from="$EXCLUDE_FILE" \
  3.     /root/workspace/DiscuzX/upload/ \
  4.     /home/wwwroot/cdbao.org/
复制代码


本例默认不加 --delete,因此目标站点独有的文件会保留,但同名且未排除的文件仍可能被覆盖。上游已删除的旧程序文件也会留下,应结合版本差异和升级说明清理。

如果确实需要让程序文件与上游保持镜像,可以在试运行和正式同步中同时加入 --delete。此时目标目录中源目录没有、且未受排除规则保护的文件会被删除,包括遗漏的自定义插件或站点文件。先逐项检查试运行输出中的删除记录,再执行正式同步;不要随意加入 --delete-excluded。

六、检查属主与更新结果

1. 检查文件属主

rsync -a 会尝试保留源文件的属主和属组;以 root 执行时,可能将仓库中的 root 属主带到站点目录。先检查实际结果:
  1. ls -ld /home/wwwroot/cdbao.org/
  2. ls -l /home/wwwroot/cdbao.org/
复制代码


如果你的部署约定是整站归 www:www 所有,可执行:
  1. chown -R www:www /home/wwwroot/cdbao.org/
复制代码


www:www 是本站原文使用的用户和组,并非所有服务器都相同。如果程序文件由部署用户持有、仅运行数据目录允许 Web 用户写入,应按原有权限方案恢复,不必整站修改属主。chown 修改属主和属组,不会自动修复读写权限。

2. 检查站点功能
  • 若版本升级需要数据库变更,按该版本的升级说明完成相应步骤。
  • 在后台执行更新缓存,并检查首页、帖子页及管理后台。
  • 验证登录、发帖、附件上传、手机模板和主要插件。
  • 检查 PHP、Web 服务及论坛错误日志。
  • 检查站点地图任务、自定义模板和静态资源是否正常。


确认更新完成后,再解除维护状态并恢复计划任务。

七、异常时回退

1. 明确恢复范围

下面的操作用于恢复备份中的程序和配置文件,保留当前 data 目录,不恢复数据库。若升级已经改变数据库结构,仅恢复旧代码可能无法正常运行,需要按照版本情况制定数据库恢复方案。

先让站点进入维护状态并暂停写入。将下面的时间戳替换为第三节记录的实际备份时间;不要直接使用示例值:
  1. RESTORE_DIR='/root/workspace/backup/cdbao.org/20250722_221928'

  2. # 确认选择的备份存在且包含站点程序
  3. ls -ld "$RESTORE_DIR/site"
  4. ls -l "$RESTORE_DIR/site/forum.php"
复制代码


2. 预览恢复操作
  1. rsync -av --itemize-changes --dry-run \
  2.     --exclude='/data/' \
  3.     "$RESTORE_DIR/site/" \
  4.     /home/wwwroot/cdbao.org/
复制代码


3. 确认后恢复文件
  1. rsync -av --itemize-changes \
  2.     --exclude='/data/' \
  3.     "$RESTORE_DIR/site/" \
  4.     /home/wwwroot/cdbao.org/
复制代码


这会覆盖备份中存在的程序和配置文件,但不会删除更新时新增的文件,因此不是目录的完全还原。新增文件应根据本次更新记录单独核对;如需要使用 --delete 完整还原文件目录,必须重新检查删除清单,并明确哪些更新后的文件需要保留。

数据库恢复会覆盖备份时点之后的数据,不能当作普通代码回退直接执行。附件恢复也需要使用独立的附件备份。回退完成后,重新检查属主、更新缓存并验证站点功能。

参考资料

Git 官方文档:git pull
Git 官方文档:git rebase
rsync 官方手册
IoT 24/7 @Debcharon

39

主题

61

回帖

1105

积分

包子铺掌柜

原创
0
贡献
500
分享
1
积分
1105

特殊贡献荣誉管理

 楼主| 发表于 2026-10-3 21:59:21 |新加坡| 显示全部楼层

IoT 24/7 @Debcharon
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系方式

相关侵权、举报、投诉及建议等,请发 E-mail:admin@cdbao.org

Powered by Discuz! X5.0 Licensed © 2001-2026 Discuz! Team.

在本版发帖
联系方式
返回顶部