仓库镜像
仓库镜像允许将仓库镜像到外部资源或从外部资源镜像到仓库。您可以使用它在仓库之间镜像分支、标签和提交。
用例
以下是仓库镜像的一些可能的用例。
- 您已迁移到 Gitea,但仍然需要在另一个资源中保留您的项目。在这种情况下,您可以简单地将其设置为镜像到 Gitea(拉取),并且所有重要的提交、标签和分支历史记录都可以在您的 Gitea 实例中获得。
- 您在另一个资源中有一些不再积极使用的旧项目,但出于存档目的不想删除它们。在这种情况下,您可以创建一个推送镜像,以便您的活动 Gitea 仓库可以将其更改推送到旧位置。
从远程仓库拉取
对于现有远程仓库,您可以按照以下步骤设置拉取镜像。
- 在右上角的“创建...”菜单中选择“新建迁移”。
- 选择远程仓库服务。
- 输入仓库 URL。
- 如果仓库需要身份验证,请填写您的身份验证信息。
- 勾选“此仓库将成为镜像”复选框。
- 选择“迁移仓库”以保存配置。
仓库现在将定期从远程仓库镜像。您可以在仓库设置中选择“立即同步”以强制同步。
警告
❗❗您只能为您的实例中尚不存在的仓库设置拉取镜像。创建仓库后,您将无法再将其转换为拉取镜像。❗❗
推送到远程仓库
对于现有仓库,您可以按照以下步骤设置推送镜像。
- 在您的仓库中,转到“设置” > “仓库”,然后是“镜像设置”部分。
- 输入仓库 URL。
- 如果仓库需要身份验证,请展开“授权”部分并填写您的身份验证信息。请注意,请求的“密码”也可以是您的访问令牌。
- 选择“添加推送镜像”以保存配置。
仓库现在将定期镜像到远程仓库。您可以选择“立即同步”以强制同步。如果出现错误,将显示一条消息以帮助您解决它。
警告
❗❗这将强制推送到远程仓库。这将覆盖远程仓库中的任何更改!❗❗
从 Gitea 设置到 GitHub 的推送镜像
要从 Gitea 设置到 GitHub 的镜像,您需要按照以下步骤操作。
- 创建一个 GitHub 个人访问令牌,选中“public_repo”复选框。如果您在仓库中使用 GitHub Actions 进行持续集成,请还选中“workflow”复选框。
- 在 GitHub 上创建具有该名称的仓库。与 Gitea 不同,GitHub 不支持通过推送到远程来创建仓库。如果您现有的远程仓库与您的 Gitea 仓库具有相同的提交历史记录,也可以使用它。
- 在您的 Gitea 仓库的设置中,填写“Git 远程仓库 URL”:
https://github.com/<your_github_group>/<your_github_project>.git
。 - 在“授权”字段中填写您的 GitHub 用户名和个人访问令牌作为“密码”。
- (可选,Gitea 1.18+ 可用) 选择“新提交被推送时同步”,这样镜像将在有更改时立即更新。如果您愿意,也可以禁用定期同步。
- 选择“添加推送镜像”以保存配置。
仓库将在之后不久推送。要强制推送,请选择“立即同步”按钮。
从 Gitea 设置到 GitLab 的推送镜像
要从 Gitea 设置到 GitLab 的镜像,您需要按照以下步骤操作。
- 创建一个具有“write_repository”范围的 GitLab 个人访问令牌。
- 填写“Git 远程仓库 URL”:
https://<destination host>/<your_gitlab_group_or_name>/<your_gitlab_project>.git
。 - 在“授权”字段中填写“oauth2”作为“用户名”和您的 GitLab 个人访问令牌作为“密码”。
- 选择“添加推送镜像”以保存配置。
仓库将在之后不久推送。要强制推送,请选择“立即同步”按钮。
从 Gitea 设置到 Bitbucket 的推送镜像
要从 Gitea 设置到 Bitbucket 的镜像,您需要按照以下步骤操作。
- 创建一个具有“Repository Write”复选框的 Bitbucket 应用程序密码。
- 填写“Git 远程仓库 URL”:
https://bitbucket.org/<your_bitbucket_group_or_name>/<your_bitbucket_project>.git
。 - 在“授权”字段中填写您的 Bitbucket 用户名和应用程序密码作为“密码”。
- 选择“添加推送镜像”以保存配置。
仓库将在之后不久推送。要强制推送,请选择“立即同步”按钮。
镜像现有 SSH 仓库
目前 Gitea 不支持 SSH 推送镜像。您可以通过向您的 Gitea 仓库添加 post-receive
钩子来手动推送,从而解决此问题。
- 确保运行 Gitea 的用户有权从 shell 访问您要镜像到的 git 仓库。
- 在 Web 界面上,在仓库设置 > git 钩子中添加一个用于镜像的 post-receive 钩子。例如:
#!/usr/bin/env bash
git push --mirror --quiet [email protected]:username/repository.git &>/dev/null &
echo "GitHub mirror initiated .."