Skip to content

Multi Platform Push

zhangxh edited this page Aug 16, 2026 · 1 revision

多平台同步推送

同步推送的目标是把当前本地分支的已提交历史发送到多个已连接实例。它不是完整镜像工具。

开始前检查

  • 当前必须是有至少一个提交的本地分支;
  • 至少有一个已验证托管平台连接;
  • Token 对目标仓库有写权限,并有权限创建缺失仓库;
  • 确认工作区里未提交内容不会被 Push;
  • 项目使用 LFS、子模块或 pre-push 检查时,先按受信流程处理。

完整交互流程

1. 未提交更改提示

如果工作区不干净,可选择:

  • “先提交再推送”;
  • “仅推送已有提交”;
  • 取消。

选择“仅推送已有提交”不会上传当前文件变动,因为 Git Push 只处理提交对象。

2. 选择目标连接

所有连接默认勾选。可以取消 GitHub、GitLab、Gitea 中任意一个实例或账号。至少保留一个目标。

3. 输入仓库名称

默认值优先级:

  1. 当前 upstream 对应 remote 的仓库名;
  2. 已有 remote 中可解析的仓库名;
  3. 当前本地文件夹名。

同一个名称会用于全部已勾选连接。

4. 选择可见性

  • 私有:仅账号与获授权成员可见;
  • 公开:任何人可见。

它只影响本次新建的缺失仓库,不会修改已存在仓库的可见性。默认选项来自 triforge.defaultVisibility,默认 private

5. 选择主要 upstream

若当前分支没有 upstream,TriForge 会让你选一个连接作为日后普通 Pull 的默认来源,也可选择暂不设置。

一个本地分支只能有一个 upstream,但这不会减少同步 Push 目标。

6. 安全确认

TriForge 明确提示:认证 Push 不运行 pre-push hook、不递归推送子模块。确认前完成项目要求的测试、Lint、LFS 上传或签名流程。

每个目标发生什么

TriForge 按连接逐个执行:

  1. 重新确认活动仓库、当前分支和 HEAD 未变化;
  2. 从 SecretStorage 取得与连接元数据一致的 Token;
  3. 在当前认证用户的个人命名空间精确查找同名仓库;
  4. 若缺失,创建一个空仓库,使用步骤 4 的可见性;
  5. 验证 API 返回的 owner、名称和 clone URL;
  6. 复用指向同一安全 URL 的 Git remote,或生成不冲突的 remote 名称;
  7. 再次检查 remote 在等待期间没有被删除或改址;
  8. 推送 HEAD 到远端同名分支;
  9. 如果这是用户选中的主要连接且尚无 upstream,则设置 upstream。

一个连接失败会记入结果并继续下一个;取消会停止尚未处理的目标,已经成功的远程不会自动回滚。

“只要有一个缺失就创建”的准确含义

每个勾选连接都独立检查:

GitHub GitLab Gitea 结果
已存在 已存在 缺失 只在 Gitea 创建,然后三处都 Push
缺失 缺失 已存在 在 GitHub、GitLab 创建,然后三处都 Push
已存在但无权写 缺失 已存在 GitLab 可创建;GitHub 失败;Gitea 继续 Push

不会因为一个平台已有仓库,就假设其他平台也有。

Remote 名称

TriForge 不强制三个 remote 都叫 origin。可能得到:

github
gitlab-git
gitea

若名称已占用,会生成不冲突的变体。remote 是当前仓库本地配置,和连接显示名称不同。

失败与部分成功

同步推送不是跨三个服务的原子事务。可能出现:

  • GitHub 成功;
  • GitLab 创建成功但 Push 失败;
  • Gitea 尚未开始时用户取消。

最终摘要会给出成功、失败、未完成和新建数量。点击“查看日志”获取逐连接详情。重试前先在平台网页和 git remote -v 中确认现状,避免把“仓库已创建、分支未推送”误判为完全失败。

常见拒绝

Non-fast-forward

目标远端已有本地没有的提交。TriForge 不会自动强推。先 Fetch,查看 Graph,决定合并、保留哪一侧或使用其他分支。

Protected branch

服务端禁止直接 Push 到 main。改推功能分支并在平台创建 Pull/Merge Request,或让管理员调整权限。

403/404

通常是 Token scope、组织策略、namespace、仓库可见性或隐藏资源权限问题。参见 Token 权限

不会同步的内容

0.5.0 不自动同步:

  • 其他本地分支;
  • Tag;
  • Git LFS 对象;
  • 子模块仓库;
  • Issue、Pull/Merge Request、Wiki;
  • Release、Webhook、Secrets、Actions/CI 配置;
  • 分支保护、成员权限和仓库设置。

如果需要完整镜像,应使用受审计的 Git 镜像/迁移工具和各平台导出功能,而不是把“当前分支同步推送”当成备份。

为什么禁用 pre-push Hook

Git 会把 GIT_CONFIG_* 环境变量传给子进程。认证 Header 也通过这些临时变量提供。恶意或被篡改的仓库 Hook 理论上可能读取父进程环境,因此 TriForge 在带 Token 网络阶段使用一次性空 Hook 目录。

代价是项目依赖的 pre-push 检查不会自动运行。安全与自动化之间,0.5.0 选择不把平台 Token 暴露给仓库代码;用户应在不含 Token 的受信任流程中先运行检查。

完整说明见 安全设计

Clone this wiki locally