{"id":50042291,"url":"https://github.com/imlinhanchao/github-to-gitea","last_synced_at":"2026-05-21T03:37:03.973Z","repository":{"id":352324190,"uuid":"1214723562","full_name":"imlinhanchao/github-to-gitea","owner":"imlinhanchao","description":"一个用于将 GitHub 仓库同步到 Gitea 的可视化工具。","archived":false,"fork":false,"pushed_at":"2026-05-01T12:14:14.000Z","size":294,"stargazers_count":4,"open_issues_count":0,"forks_count":2,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-01T14:14:20.818Z","etag":null,"topics":["gitea","github","synchronization"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/imlinhanchao.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-19T00:45:20.000Z","updated_at":"2026-05-01T12:14:18.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/imlinhanchao/github-to-gitea","commit_stats":null,"previous_names":["imlinhanchao/github-to-gitea"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/imlinhanchao/github-to-gitea","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imlinhanchao%2Fgithub-to-gitea","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imlinhanchao%2Fgithub-to-gitea/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imlinhanchao%2Fgithub-to-gitea/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imlinhanchao%2Fgithub-to-gitea/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/imlinhanchao","download_url":"https://codeload.github.com/imlinhanchao/github-to-gitea/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imlinhanchao%2Fgithub-to-gitea/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33287580,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-21T02:57:32.698Z","status":"ssl_error","status_checked_at":"2026-05-21T02:57:31.990Z","response_time":62,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["gitea","github","synchronization"],"created_at":"2026-05-21T03:37:02.526Z","updated_at":"2026-05-21T03:37:03.953Z","avatar_url":"https://github.com/imlinhanchao.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n   \u003cimg src=\"./frontend/public/logo.svg\" alt=\"github-to-gitea logo\" width=\"88\" /\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003egithub-to-gitea\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e一个用于将 GitHub 仓库同步到 Gitea 的可视化工具。\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n   中文 | \u003ca href=\"./README.en.md\"\u003eEnglish\u003c/a\u003e\n\u003c/p\u003e\n\n基于 Vue 3 前端和 NestJS 后端构建，支持通过 Web 页面完成初始化配置、管理员登录、仓库导入、分支同步和 Webhook 回调处理。项目适合个人迁移、团队镜像、私有代码备份和自建 Gitea 场景。\n\n## 简介\n\n`github-to-gitea` 用于把 GitHub 上的仓库同步到 Gitea，并提供一个简单的管理界面来完成以下工作：\n\n- 初始化系统配置\n- 使用 Gitea 管理员账号登录访问系统\n- 按 GitHub 账号批量导入仓库\n- 按 `owner/repo` 单仓库同步\n- 配置分支同步范围\n- 为仓库自动创建或修复 GitHub Webhook\n- 定时检查仓库更新并自动触发同步\n\n后端默认监听 `3001`，页面静态资源由后端根路径直接提供，所有接口统一挂载在 `/api` 下。\n\n## 快速开始\n\n根据你的需求选择合适的部署方式：\n\n| 部署方式 | 适用场景 | 难度 | 启动速度 |\n|---------|--------|------|--------|\n| [Docker Compose](#docker-compose-一键部署推荐) | 完全自动化，一条命令启动所有服务（Gitea、MySQL、应用） | ⭐ | 极速 |\n| [Docker 单独部署](#docker-单独部署外部数据库) | 已有 Gitea 和 MySQL，仅部署应用 | ⭐⭐ | 快 |\n| [统一打包部署](#统一打包部署) | 传统部署方式，自己管理依赖和启动 | ⭐⭐⭐ | 中等 |\n| [前后端分开开发](#前后端分开开发运行) | 本地开发调试，前后端分离 | ⭐⭐ | 中等 |\n\n**推荐方案：** 如果是第一次使用，建议选择 **Docker Compose**，一条命令即可启动所有必要服务。\n\n```bash\n# 1. 准备配置文件\ncp .env.example .env\n# 2. 编辑 .env 填写 Gitea 管理员密码和数据库配置\n# 3. 启动\ndocker-compose up -d\n# 4. 按引导在 Web 界面完成应用配置\n```\n\n详细说明请参见下面的部署方式部分。\n\n## 功能要点\n\n- 支持按 GitHub 账号批量同步仓库，也支持指定单个仓库同步\n- 支持按用户名导入 GitHub Star 仓库并在 Gitea 中为同名用户自动加星\n- 支持私有仓库与公开仓库，只要 Token 具备访问权限\n- 在 Gitea 中自动创建与 GitHub 仓库 owner 同名的用户和仓库\n- 支持为每个仓库配置多个同步分支，默认使用仓库默认分支\n- 支持任务队列、失败重试、任务清理和手动立即同步\n- 支持 GitHub `push` Webhook 触发增量同步\n- 已配置后必须使用 Gitea 管理员账号登录，接口也会进行鉴权\n- 前后端可分开开发，也可以统一打包到 `dist` 目录部署\n\n## 环境准备\n\n运行前建议准备以下环境：\n\n- Node.js 20 或更高版本\n- npm 10 或更高版本\n- Git 命令行，可在服务端执行 `git`\n- MySQL 8.x 或兼容版本\n- 可正常访问的 Gitea 服务\n- 可正常访问的 GitHub API\n\n推荐提前确认以下事项：\n\n- 已在 MySQL 中创建目标数据库，例如 `github_to_gitea`\n- 已准备一个 Gitea 管理员账号\n- 目标机器能访问 GitHub、Gitea 和 MySQL\n- 如果需要公网 Webhook，已准备可被 GitHub 访问的服务地址\n\n## Token 获取方式\n\n### GitHub Token\n\n建议使用 GitHub Personal Access Token。项目当前会调用仓库读取接口和仓库 Webhook 管理接口，因此至少要保证 Token 能：\n\n- 读取目标仓库\n- 读取私有仓库（如果需要同步私有仓库）\n- 读取和创建仓库 Webhook\n\n常见获取方式：\n\n1. 登录 GitHub。\n2. 打开 `Settings`。\n3. 进入 `Developer settings`。\n4. 进入 `Personal access tokens`。\n5. 创建 Classic Token 或 Fine-grained Token。\n\n权限建议：\n\n- Classic Token：建议至少包含 `repo` 和 `admin:repo_hook`\n- Fine-grained Token：至少授予目标仓库的 Contents 读取权限，以及 Webhooks 的读写权限\n\n如果只同步公开仓库且不需要自动配置 Webhook，可以降低权限，但当前项目默认会尝试为仓库配置 Webhook，因此不建议省略 Webhook 相关权限。\n\n### Gitea Token\n\n请使用 Gitea 管理员账号创建 Access Token，因为项目会调用管理员接口创建用户和仓库。\n\n常见获取方式：\n\n1. 使用 Gitea 管理员账号登录。\n2. 打开 `Settings`。\n3. 进入 `Applications`。\n4. 在 `Access Tokens` 中创建新 Token。\n\n权限建议：\n\n- 具备管理员级 API 访问能力\n- 能创建用户\n- 能创建仓库\n- 能向目标仓库写入代码\n\n如果你的 Gitea 版本支持细粒度权限，请至少确保 Token 拥有管理员仓库管理、管理员用户管理和仓库写入能力。\n\n## 开发启动\n\n### 启动后端\n\n```bash\ncd backend\nnpm install\nnpm run dev\n```\n\n后端默认监听：`http://localhost:3001`\n\n### 启动前端\n\n```bash\ncd frontend\nnpm install\nnpm run dev\n```\n\n前端开发地址默认是：`http://localhost:5174`\n\n开发模式下，前端会把 `/api` 请求代理到 `http://localhost:3001`。\n\n## 部署方式\n\n### Docker Compose 一键部署（推荐）\n\n使用 Docker Compose 可以一次性启动 Gitea、MySQL 和 github-to-gitea 应用：\n\n#### 准备配置文件\n\n1. 复制 `.env.example` 为 `.env`：\n\n```bash\ncp .env.example .env\n```\n\n2. 编辑 `.env` 文件，填写数据库配置项：\n\n```env\n# MySQL 数据库配置\nDB_USER=gitea_user\nDB_PASSWORD=gitea_password\nDB_DATABASE=github_to_gitea\n```\n\n#### 启动服务\n\n```bash\ndocker-compose up -d\n```\n\n#### 初始化 Gitea\n\n首次启动时，访问 `http://localhost:3000` 进行 Gitea 初始化设置：\n\n1. 数据库类型选择 **MySQL**\n2. 数据库连接信息：\n   - 主机：`mysql:3306`\n   - 用户：`gitea_user`（或你在 `.env` 中设置的 `DB_USER`）\n   - 密码：`.env` 中设置的 `DB_PASSWORD`\n   - 数据库：`github_to_gitea`（或 `DB_DATABASE`）\n3. 填写**管理员账号信息**（自行设置用户名和密码，稍后在 github-to-gitea 中会用到）\n4. 完成初始化\n\n#### 配置 github-to-gitea 应用\n\nGitea 初始化完成后，访问 `http://localhost:3001`：\n\n1. 首次访问会进入**初始化配置页面**\n2. 在页面上填写以下信息：\n   - **GitHub Token** - GitHub Personal Access Token\n   - **Gitea Token** - Gitea 管理员 API Token（需要先在 Gitea 中创建）\n   - **Gitea 地址** - `http://gitea:3000`（Docker 内部网络）\n   - **Gitea 管理员用户名** - 与 Gitea 初始化时的用户名一致\n   - **Gitea 管理员密码** - 与 Gitea 初始化时的密码一致\n   - **MySQL 连接信息** - 填写与 `.env` 一致的数据库配置\n   - **GitHub Webhook 密钥** - 可选\n\n3. 配置保存后，应用会在 `config.json` 中记录所有配置\n\n#### 访问应用\n\n- 前端页面：`http://localhost:3001`\n- Gitea：`http://localhost:3000`\n- MySQL：`localhost:3306`\n\n#### 常用命令\n\n```bash\n# 查看日志\ndocker-compose logs -f\n\n# 查看特定服务日志\ndocker-compose logs -f github-to-gitea\n\n# 停止所有服务\ndocker-compose down\n\n# 停止并删除所有数据（谨慎使用）\ndocker-compose down -v\n```\n\n### Docker 单独部署（外部数据库）\n\n如果你已经有独立的 Gitea 和 MySQL 服务，可以仅使用 Docker 运行 github-to-gitea 应用。\n\n#### 运行容器\n\n根据你的数据库配置，使用环境变量启动容器：\n\n```bash\ndocker run -d \\\n  --restart unless-stopped \\\n  --name github-to-gitea \\\n  -p 3001:3001 \\\n  -e DB_HOST=your-mysql-host \\\n  -e DB_PORT=3306 \\\n  -e DB_USER=your_db_user \\\n  -e DB_PASSWORD=your_db_password \\\n  -e DB_DATABASE=github_to_gitea \\\n  -e NODE_ENV=production \\\n  ghcr.io/imlinhanchao/github-to-gitea:latest\n```\n\n**参数说明：**\n\n- `DB_HOST` - MySQL 服务器地址\n- `DB_PORT` - MySQL 端口（默认 3306）\n- `DB_USER` - MySQL 用户名\n- `DB_PASSWORD` - MySQL 密码\n- `DB_DATABASE` - 数据库名称\n\n#### 初始化应用配置\n\n1. 等待容器启动完成，访问 `http://localhost:3001`\n2. 首次访问会进入**初始化配置页面**\n3. 在页面上填写以下信息：\n   - **GitHub Token** - GitHub Personal Access Token\n   - **Gitea Token** - Gitea 管理员 API Token\n   - **Gitea 地址** - 你的 Gitea 访问地址\n   - **Gitea 管理员用户名和密码**\n   - **GitHub Webhook 密钥** - 可选\n\n4. 配置保存后，应用会在 `config.json` 中记录所有配置\n\n#### 其他常用命令\n\n```bash\n# 查看日志\ndocker logs -f github-to-gitea\n\n# 停止容器\ndocker stop github-to-gitea\n\n# 启动已停止的容器\ndocker start github-to-gitea\n\n# 删除容器\ndocker rm github-to-gitea\n```\n\n**注意：** 如需持久化配置，建议挂载配置目录：\n\n```bash\ndocker run -d \\\n  --restart unless-stopped \\\n  --name github-to-gitea \\\n  -p 3001:3001 \\\n  -v $(pwd)/config:/app/config \\\n  -e DB_HOST=your-mysql-host \\\n  -e DB_USER=your_db_user \\\n  -e DB_PASSWORD=your_db_password \\\n  -e DB_DATABASE=github_to_gitea \\\n  ghcr.io/imlinhanchao/github-to-gitea:latest\n```\n\n### 统一打包部署\n\n项目已经把前后端产物统一输出到根目录 `dist`：\n\n- 后端编译输出到 `dist`\n- 前端构建输出到 `dist/public`\n\n构建命令：\n\n```bash\nnpm run build\n```\n\n构建完成后，目录结构大致如下：\n\n```text\ndist/\n   main.js\n   app.module.js\n   modules/\n   public/\n   package.json\n   package-lock.json\n```\n\n生产运行方式：\n\n```bash\ncd dist\nnpm install --omit=dev\nnode main.js\n```\n\n部署说明：\n\n- 运行目录是 `dist`，因此配置文件会生成或读取自 `dist/config.json`\n- 页面访问路径是根路径 `/`\n- 后端接口路径是 `/api/*`\n- 如果使用反向代理，请确保 `/api` 和静态资源都转发到同一个 Node 服务\n\n### 前后端分开开发运行\n\n适合本地联调：\n\n```bash\ncd backend \u0026\u0026 npm install \u0026\u0026 npm run dev\ncd frontend \u0026\u0026 npm install \u0026\u0026 npm run dev\n```\n\n访问前端开发地址：`http://localhost:5174`\n\n## 使用说明\n\n### 1. 首次访问\n\n首次启动后，如果系统还没有配置文件，会自动进入初始化配置页面。你需要填写：\n\n- GitHub Token\n- Gitea Token\n- Gitea 地址\n- Gitea 管理员用户名\n- Gitea 管理员密码\n- MySQL 连接信息\n- 可选的 GitHub Webhook 密钥\n\n配置保存后，后端会将数据写入 `config.json`。\n\n说明：\n\n- 开发模式下，配置文件位于 `backend/config.json`\n- 统一打包部署后，配置文件位于 `dist/config.json`\n- 修改 MySQL 连接信息后，需要重启后端服务才能生效\n- 如果系统尚未配置，后端会临时使用内存 SQLite 启动，保证初始化页面可访问\n\n### 2. 登录系统\n\n配置完成后，系统会启用管理员登录保护。\n\n- 页面访问需要登录\n- `/api/*` 接口也需要鉴权\n- 登录账号和密码使用配置中的 Gitea 管理员账号和密码\n\n### 3. 添加同步源\n\n登录后可以选择两种方式导入仓库：\n\n- 输入 GitHub 用户名，批量导入该账号下可访问的仓库\n- 输入 GitHub 用户名，导入该用户的 Star 仓库并同步到 Gitea\n- 输入 `owner/repo`，只同步单个仓库\n\n### 4. 管理同步仓库\n\n仓库导入后，可以继续执行：\n\n- 修改分支列表\n- 启用或停用某个仓库同步\n- 手动立即同步\n- 配置或修复 GitHub Webhook\n\n### 5. 查看任务队列\n\n系统提供任务页用于查看：\n\n- 当前排队任务\n- 正在执行的任务\n- 同步失败任务\n- 重试失败任务\n- 清理历史任务\n\n## 配置项说明\n\n当前配置文件包含以下字段：\n\n```json\n{\n   \"githubToken\": \"\",\n   \"giteaToken\": \"\",\n   \"giteaBaseUrl\": \"http://localhost:3000\",\n   \"giteaAdminUsername\": \"gitea_admin\",\n   \"giteaAdminPassword\": \"\",\n   \"dbHost\": \"localhost\",\n   \"dbPort\": 3306,\n   \"dbUser\": \"root\",\n   \"dbPassword\": \"\",\n   \"dbDatabase\": \"github_to_gitea\",\n   \"webhookSecret\": \"\"\n}\n```\n\n说明：\n\n- `giteaBaseUrl` 填写 Gitea 站点根地址，不需要手动拼接 `/api/v1`\n- `webhookSecret` 可选，留空则不校验 GitHub Webhook 签名\n- `config.json` 包含敏感信息，请妥善保管并限制文件权限\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimlinhanchao%2Fgithub-to-gitea","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fimlinhanchao%2Fgithub-to-gitea","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimlinhanchao%2Fgithub-to-gitea/lists"}