☰
GitHub仓库迁移Gitea全指南:从原理到实践
2026/10/27 4:55:27 网站建设 项目流程

1. 为什么需要将GitHub本地仓库迁移到Gitea?

作为开发者,我们经常遇到需要将代码库从一个平台迁移到另一个平台的情况。最近我就遇到了一个实际需求:把原本托管在GitHub上的项目迁移到自建的Gitea服务器。这种迁移可能有多种原因:

  • 访问速度问题:GitHub在国内的访问速度时快时慢,特别是大文件操作时经常出现连接超时。而自建Gitea服务器通常部署在内网或国内云服务器上,速度明显提升。

  • 私有化需求:GitHub的私有仓库虽然免费了,但企业级功能仍需付费。Gitea作为开源方案,可以完全自主掌控。

  • 合规要求:某些行业或企业对代码托管有特殊合规要求,需要将代码保留在特定网络环境中。

  • 成本考虑:GitHub的企业版价格不菲,而Gitea可以零成本自建。

提示:迁移前请确认原仓库的许可协议是否允许迁移,特别是fork的仓库需要注意版权问题。

2. 迁移前的准备工作

2.1 环境检查与工具准备

在开始迁移前,我们需要确保本地环境已经就绪:

  1. Git客户端:这是最基本的工具。检查是否安装:

    git --version

    如果没有安装,可以参考官方文档安装适合你系统的版本。

  2. SSH密钥配置:Gitea和GitHub一样支持SSH协议。确保你的SSH密钥已经生成并添加到Gitea账户:

    cat ~/.ssh/id_rsa.pub

    如果没有密钥,可以通过以下命令生成:

    ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  3. Gitea账户准备:

    • 确保你已经在目标Gitea实例上创建了账户
    • 有权限创建新仓库
    • 知道Gitea服务器的地址(如https://gitea.example.com)

2.2 本地仓库状态检查

在迁移前,我们需要确认本地仓库的状态:

  1. 进入你的本地仓库目录:

    cd /path/to/your/local/repo
  2. 检查当前远程仓库配置:

    git remote -v

    这会显示类似如下的信息:

    origin git@github.com:username/repo.git (fetch) origin git@github.com:username/repo.git (push)
  3. 确保本地仓库是最新的:

    git fetch --all git pull --all
  4. 检查分支情况:

    git branch -a

3. 在Gitea上创建新仓库

现在我们需要在目标Gitea实例上创建一个空仓库来接收我们的代码:

  1. 登录你的Gitea账户
  2. 点击右上角的"+"按钮,选择"新建仓库"
  3. 填写仓库信息:
    • 仓库名称:建议与GitHub上的名称保持一致
    • 可见性:根据需求选择公开或私有
    • 其他选项保持默认即可
  4. 点击"创建仓库"按钮

注意:不要勾选"使用README初始化仓库"、"添加.gitignore"或"添加许可证"选项,因为我们是要迁移已有仓库。

创建完成后,Gitea会显示仓库的地址信息,通常有两种协议可选:

  • HTTPS:如https://gitea.example.com/username/repo.git
  • SSH:如git@gitea.example.com:username/repo.git

建议使用SSH协议,这样不需要每次操作都输入密码。

4. 迁移仓库的核心步骤

4.1 添加新的远程仓库地址

现在我们要把Gitea仓库添加为本地仓库的一个新远程:

  1. 在本地仓库目录下执行:

    git remote add gitea git@gitea.example.com:username/repo.git

    这里的"gitea"是远程仓库的别名,你可以自定义,但不要使用"origin"以免与原有的GitHub远程冲突。

  2. 验证是否添加成功:

    git remote -v

    应该能看到类似输出:

    gitea git@gitea.example.com:username/repo.git (fetch) gitea git@gitea.example.com:username/repo.git (push) origin git@github.com:username/repo.git (fetch) origin git@github.com:username/repo.git (push)

4.2 推送代码到Gitea

现在我们可以将本地仓库的所有内容推送到Gitea:

  1. 推送所有分支:

    git push --all gitea
  2. 推送所有标签:

    git push --tags gitea
  3. 如果你有LFS文件,还需要推送LFS对象:

    git lfs push --all gitea

4.3 验证迁移结果

推送完成后,刷新Gitea的仓库页面,你应该能看到所有代码、分支和标签都已经成功迁移。可以:

  1. 检查文件列表是否完整
  2. 查看提交历史是否保留
  3. 验证各个分支是否存在
  4. 检查标签是否正确显示

5. 迁移后的配置调整

5.1 更新本地仓库的默认远程

如果你打算完全切换到Gitea,不再使用GitHub仓库,可以修改本地仓库的默认远程:

  1. 首先删除原有的origin远程:

    git remote remove origin
  2. 将gitea远程重命名为origin:

    git remote rename gitea origin
  3. 验证修改:

    git remote -v

    现在应该只看到origin指向Gitea仓库。

5.2 处理子模块和依赖

如果你的项目包含子模块,还需要额外处理:

  1. 初始化并更新子模块:

    git submodule update --init --recursive
  2. 检查子模块的远程地址是否需要更新:

    git submodule foreach git remote -v
  3. 如果需要,可以批量更新子模块的远程地址。

5.3 CI/CD配置更新

如果你的项目使用了CI/CD流水线,需要更新相关配置:

  1. 更新.gitlab-ci.yml、.travis.yml或GitHub Actions配置文件中的仓库地址
  2. 检查部署脚本中的仓库引用
  3. 更新任何硬编码的GitHub特定URL

6. 常见问题与解决方案

6.1 认证失败问题

在推送时可能会遇到认证问题,特别是使用HTTPS协议时:

症状:

remote: HTTP Basic: Access denied fatal: Authentication failed for 'https://gitea.example.com/username/repo.git/'

解决方案:

  1. 确保你的Gitea账户密码正确
  2. 或者改用SSH协议
  3. 如果你使用了两步验证,可能需要生成并使用访问令牌

6.2 大文件推送失败

如果仓库包含大文件,可能会遇到推送失败:

症状:

error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 fatal: the remote end hung up unexpectedly

解决方案:

  1. 检查是否启用了Git LFS:
    git lfs install
  2. 确保大文件已正确track:
    git lfs track "*.psd"
  3. 单独推送LFS对象:
    git lfs push --all gitea

6.3 分支冲突问题

如果Gitea上已经存在同名分支:

症状:

! [rejected] main -> main (non-fast-forward) error: failed to push some refs to 'gitea.example.com:username/repo.git'

解决方案:

  1. 强制推送(慎用,会覆盖远程分支):
    git push -f gitea main
  2. 或者在Gitea上删除冲突分支后再推送
  3. 或者使用不同的分支名

7. 迁移后的维护策略

7.1 双平台同步方案

如果你需要在一段时间内保持GitHub和Gitea两个仓库同步:

  1. 设置推送时同时推送到两个远程:

    git remote set-url --add --push origin git@github.com:username/repo.git git remote set-url --add --push origin git@gitea.example.com:username/repo.git
  2. 之后简单的git push就会同时推送到两个仓库

  3. 定期检查两边是否同步:

    git fetch github git fetch gitea git log --graph --oneline --all --decorate

7.2 完全迁移后的清理工作

当你确定不再需要GitHub仓库时:

  1. 在GitHub仓库设置中将其归档
  2. 更新项目文档中的所有GitHub链接
  3. 通知协作者仓库已迁移
  4. 考虑在GitHub仓库描述中添加迁移说明

7.3 备份策略

虽然Gitea是自建的,但仍需考虑备份:

  1. 定期导出仓库:
    git bundle create repo.bundle --all
  2. 设置Gitea的定期备份
  3. 考虑设置异地备份

8. 高级技巧与注意事项

8.1 保留所有Git属性

为了确保迁移不丢失任何信息,可以使用以下命令打包整个仓库:

git clone --mirror git@github.com:username/repo.git cd repo.git git push --mirror git@gitea.example.com:username/repo.git

这种方法会保留所有引用、标签、分支和配置。

8.2 处理大仓库的迁移

对于特别大的仓库:

  1. 使用浅克隆减少初始下载量:
    git clone --depth 1 git@github.com:username/repo.git
  2. 逐步获取历史:
    git fetch --unshallow
  3. 分批次推送:
    git push gitea main git push gitea branch1 git push gitea branch2

8.3 迁移后的性能优化

Gitea提供了多种优化选项:

  1. 启用仓库的自动GC:
    git config --global gc.auto 1
  2. 定期在服务器端执行仓库优化:
    gitea manager repo gc
  3. 对于活跃仓库,可以启用自动更新钩子

8.4 权限与协作管理

迁移后需要重新设置:

  1. 团队成员的访问权限
  2. 保护分支规则
  3. 合并请求设置
  4. Web钩子配置

9. 迁移后的验证清单

为确保迁移完全成功,请检查以下项目:

  1. 代码完整性:

    • 所有文件都存在且内容正确
    • 没有文件损坏或丢失
  2. 版本历史:

    • 所有提交都保留
    • 提交作者信息正确
    • 时间戳准确
  3. 分支与标签:

    • 所有分支都存在
    • 所有标签都存在且指向正确的提交
  4. 特殊文件:

    • .gitignore 文件存在
    • README 文件显示正常
    • 许可证文件保留
  5. 功能验证:

    • 代码可以正常编译/运行
    • CI/CD流水线正常工作
    • 文档链接正确
  6. 协作功能:

    • 问题(Issues)已迁移(如果需要)
    • Wiki内容已迁移(如果需要)
    • 合并请求(Pull Requests)状态已更新

10. 从GitHub到Gitea的完整迁移脚本

对于需要频繁迁移或多个仓库迁移的情况,可以创建一个自动化脚本:

#!/bin/bash # 配置变量 GITHUB_REPO="git@github.com:username/repo.git" GITEA_REPO="git@gitea.example.com:username/repo.git" TEMP_DIR="/tmp/repo_migration" # 创建临时目录 mkdir -p $TEMP_DIR cd $TEMP_DIR # 克隆GitHub仓库(镜像方式) echo "正在克隆GitHub仓库..." git clone --mirror $GITHUB_REPO cd repo.git # 添加Gitea远程 echo "添加Gitea远程仓库..." git remote add gitea $GITEA_REPO # 推送到Gitea echo "正在推送所有内容到Gitea..." git push --mirror gitea # 清理 echo "清理临时文件..." cd .. rm -rf repo.git echo "迁移完成!"

这个脚本可以保存为migrate_to_gitea.sh,然后通过chmod +x migrate_to_gitea.sh赋予执行权限后运行。

11. 其他迁移场景处理

11.1 迁移非GitHub仓库到Gitea

如果你要迁移的本地仓库不是来自GitHub,而是其他Git服务或本地创建的仓库,过程类似:

  1. 确保仓库已经初始化:

    git init git add . git commit -m "Initial commit"
  2. 然后按照前面的步骤添加Gitea远程并推送

11.2 迁移部分历史记录

有时你可能只想迁移部分提交历史:

  1. 使用git log找到你想开始迁移的提交点
  2. 创建一个新分支从该点开始:
    git checkout -b new_start <commit-hash>
  3. 然后只推送这个新分支到Gitea

11.3 合并多个仓库

如果你想将多个GitHub仓库合并到一个Gitea仓库:

  1. 创建一个新的Gitea仓库
  2. 添加各个仓库为远程:
    git remote add repo1 git@github.com:username/repo1.git git remote add repo2 git@github.com:username/repo2.git
  3. 获取所有内容:
    git fetch --all
  4. 使用子树合并或子模块方式整合

12. Gitea特有功能利用

迁移到Gitea后,你可以利用一些特有功能:

  1. 仓库镜像:设置Gitea自动从GitHub同步更新
  2. 工单模板:创建更结构化的Issue模板
  3. 内部仓库:介于公开和私有之间的可见性级别
  4. 仓库转移:轻松在用户和组织间转移仓库所有权
  5. Web钩子:丰富的集成选项

例如,设置仓库镜像:

  1. 进入仓库设置
  2. 选择"镜像设置"
  3. 添加GitHub仓库URL
  4. 设置同步间隔时间
  5. 保存设置

13. 迁移后的协作流程调整

团队协作时需要注意:

  1. 通知所有团队成员新的仓库位置
  2. 更新所有开发环境中的远程配置
  3. 修改CI/CD系统中的仓库引用
  4. 更新文档中的贡献指南
  5. 重新设置代码审查流程

对于团队成员,他们需要:

  1. 克隆新的Gitea仓库:
    git clone git@gitea.example.com:username/repo.git
  2. 或者更新现有本地仓库的远程:
    git remote set-url origin git@gitea.example.com:username/repo.git

14. 性能对比与优化建议

GitHub和Gitea在性能表现上有所不同:

  1. 克隆速度:Gitea通常更快,特别是对于国内用户
  2. 大文件处理:两者都支持LFS,但Gitea可以自建LFS服务器
  3. 界面响应:Gitea通常更轻量级,响应更快
  4. API速率限制:Gitea可以自定义API调用限制

优化建议:

  1. 对于大型团队,考虑增加Gitea服务器的资源
  2. 定期执行仓库维护:
    git gc --aggressive
  3. 考虑使用SSD存储提高IO性能
  4. 对于分布式团队,可以在不同地区部署多个Gitea实例并设置镜像

15. 安全注意事项

迁移过程中需要注意的安全问题:

  1. 敏感信息检查:

    • 确保没有提交过密码、API密钥等敏感信息
    • 可以使用工具扫描历史提交:
      git secrets --scan-history
  2. 权限管理:

    • 仔细设置Gitea仓库的访问权限
    • 使用团队功能管理协作
    • 定期审查访问权限
  3. 审计日志:

    • 启用Gitea的操作日志
    • 定期检查异常活动
  4. 备份加密:

    • 对备份文件进行加密
    • 使用安全的传输协议

16. 总结与个人经验分享

经过多次仓库迁移,我总结出以下几点经验:

  1. 测试迁移:对于重要仓库,先在测试环境进行迁移验证
  2. 分阶段迁移:大型项目可以分模块或分批次迁移
  3. 文档更新:及时更新所有相关文档中的链接和说明
  4. 监控设置:迁移后设置监控确保一切正常运行
  5. 回滚计划:准备好在出现问题时回滚的方案

一个特别有用的技巧是使用git bundle创建完整的仓库备份:

git bundle create repo_backup.bundle --all

这样你就有了一份完整的、可以轻松传输的仓库副本,在任何地方都可以通过以下命令恢复:

git clone repo_backup.bundle new_repo

最后,记住迁移不仅仅是技术操作,还涉及团队协作流程的调整。确保所有相关人员都了解变更,并提供必要的培训和支持。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询