Gogs迁移到Gitea不完全指南
大家如果有用过Gogs就会发现它已经很久没有啥版本更新了,相比较而言,Gitea的更新频率相对较高一些,社区文档也更完善。但有一点比较头疼的是老旧仓库迁移一是比较琐碎;二则commit activities 等等都消失了,今天就给大家分享一个野路子, 基本思路如下:
- 从gogs 导出数据并解压、提取导出数据中的
repositories.zip - 上传
repositories.zip文件到Gitea容器并解压 - 通过
Gitea的管理页面识别并重新关联仓库
本文以两者环境均为docker容器为例,主要涉及容器版本:
- gogs/gogs:latest
- version: 0.14.0+
- sha256: b9b164e0dc299185af6079adde3eed693da55b920887aee92eda19d36030d416
- docker.gitea.com/gitea:1.25.1
- version: 1.25.1
- sha256: dbb4b148024bc4462c39332acbdeace8f12cee5646a4e46db75c1d16aa4eaf4b
Gogs数据导出
进入gogs容器后,默认情况下数据文件在 /data目录下,实际的文件结构如下
plaintext
data
├── git
│ └── gogs-repositories
│ ├── gogs
│ │ ├── download.git
│ │ ├── electron-vite-vue.git
│ │ ├── gogs.git
│ └── nobody
├── gogs
│ ├── conf
│ │ └── app.ini
│ ├── custom
│ │ └── conf
│ │ └── app.ini
│ ├── data
│ │ ├── avatars
│ │ │ └── 3
│ │ └── sessions
│ └── log
│ ├── gogs.log
│ ├── gorm.log
│ ├── hooks
│ │ ├── post-receive.log
│ │ ├── pre-receive.log
│ │ ├── update.log
│ │ └── xorm.log
│ └── xorm.log
└── ssh
├── ssh_host_dsa_key
├── ssh_host_dsa_key.pub
├── ssh_host_ecdsa_key
├── ssh_host_ecdsa_key.pub
├── ssh_host_ed25519_key
├── ssh_host_ed25519_key.pub
├── ssh_host_rsa_key
└── ssh_host_rsa_key.pub
43 directories, 18 files
通过 gogs的 backup 命令进行备份的话默认目录结构如下:
plaintext
gogs-backup
├── custom
│ ├── conf
│ │ └── app.ini
│ ├── custom
│ │ └── conf
│ │ └── app.ini
│ └── log
│ ├── gogs.log
│ ├── gogs.log.2022-11-06
│ ├── gorm.log
│ ├── gorm.log.2022-11-06
│ ├── hooks
│ │ ├── post-receive.log
│ │ ├── pre-receive.log
│ │ ├── update.log
│ │ └── xorm.log
│ ├── xorm.log
│ ├── xorm.log.2022-11-06
├── data
│ └── avatars
│ └── 3
├── db
│ ├── TeamRepo.json
│ ├── TeamUser.json
├── metadata.ini
└── repositories.zip
10 directories, 49 files
如果指定了 command options ,则会删减部分内容,大致如下:
- exclude-mirror-repos 不备份外部仓库
- exclude-repos 完全不备份 仓库
- database-only 只备份db数据
shell
mkdir -p /backup/file
su git
cd /backup
c94803f5f8bf:/backup$ /app/gogs/gogs backup -v --tempdir ./tmp --target ./file
# exclude-mirror-repos
# c94803f5f8bf:/backup$ /app/gogs/gogs backup -v --tempdir ./tmp --target ./file --exclude-mirror-repos
导出文件的命名格式为: gogs-backup-20251111070003.zip ,我们解压文件后可以看到两种备份方式的主要区别是有无ssh密钥配置,建议备份数据后通过此方式再次进行备份,避免数据丢失
shell
cd /backup/file
tar -cf tar_data_20251111.tar /data
完成备份之后退出容器,并通过 docker cp 复制文件到宿主机即可
Gitea数据导入
创建容器后首次进入页面需要配置Gitea,注册Gitea账号时建议使用gogs的管理员账号,导入数据后可任意添加
通过docker cp 复制gogs-backup-20251111070003.zip 文件中的 repositories.zip 登录gitea容器并切换到/app/gitea 或者 /tmp目录下
- 解压缩
repositories.zip文件unzip repositories.zip
- 修改文件权限
chown -R git:git gogs-repositories
- 挪动文件到
/data/git/repositories目录- 一定要确认目录下是否为空,避免覆盖数据
通过Gitea管理页面添加仓库
-
通过ip或者配置的域名登录管理员账号,按图示进入gitea 仓库管理面板-未收录仓库

-
搜索指定账号(即为
repositories.zip下的一级文件夹名称),逐个添加仓库
-
随意进入其中一个仓库验证

-
随意下载仓库验证
