派生
尽可能在一个公共的 Git 仓库中工作,并使用分支策略来管理你的工作。然而,如果你没有对你想要贡献的仓库的写入权限,你可以创建一个派生。
派生是一个个人副本,包括仓库及其所有分支,你可以在你选择的命名空间中创建。你可以在自己的派生中进行更改,并通过合并请求将它们提交到你没有访问权限的仓库。
派生项目使用重复数据删除策略,以便可能比源项目占用更小的存储空间。派生项目可以访问连接到源项目的对象池。
创建派生
- 在 GitLab 16.6 中引入。
要在极狐GitLab 中派生现有项目:
- 在项目主页的右上角,选择 Fork ().
- 可选。编辑 项目名称。
- 对于 项目 URL,选择你的派生应属于的命名空间。
- 添加 项目 slug。此值将成为派生 URL 的一部分。它在命名空间中必须是唯一的。
- 可选。添加 项目描述。
- 选择一个 包含的分支 选项:
- 所有分支(默认)。
-
仅默认分支。使用
--single-branch
和--no-tags
Git 选项。
- 选择你的派生的 可见性级别。有关可见性级别的更多信息,请阅读项目和组可见性。
- 选择 派生项目。
极狐GitLab 创建你的派生,并将你重定向到新的派生页面。
更新你的派生
派生可能会与其上游仓库不同步,需要更新:
- 领先:你的派生包含上游仓库中不存在的新提交。要同步你的派生,请创建合并请求以将你的更改推送到上游仓库。
- 落后:上游仓库包含你的派生中不存在的新提交。要同步你的派生,请将新提交拉取到你的派生中。
- 领先和落后:上游仓库和你的派生都包含对方中不存在的新提交。要完全同步你的派生,请创建合并请求以推送你的更改,并将上游仓库的新更改拉取到你的派生中。
要使用极狐GitLab UI 或命令行将你的派生与其上游仓库同步。极狐GitLab 专业版和旗舰版级别还可以通过配置派生为上游仓库的拉取镜像来自动更新。
从 UI
先决条件:
- 派生必须从上游仓库中的未受保护分支创建。
要从极狐GitLab UI 更新你的派生:
- 在左侧边栏,选择 搜索或转到。
- 选择 查看我所有的项目。
- 选择你要更新的派生。
-
在分支名称的下拉列表下,找到 派生自 () 信息框,以确定你的派生是领先、落后还是两者兼有。在此示例中,派生落后于上游仓库:
- 如果你的派生领先于上游仓库,选择 创建合并请求 以提议将你的派生更改添加到上游仓库。
- 如果你的派生落后于上游仓库,选择 更新派生 以从上游仓库拉取更改。
- 如果你的派生领先和落后于上游仓库,你可以从 UI 更新,仅当未检测到合并冲突时可用:
- 如果你的派生不包含合并冲突,你可以选择 创建合并请求 以提议将你的更改推送到上游仓库,更新派生 以将更改拉取到你的派生,或两者兼有。你的派生中的更改类型决定了哪些操作是适当的。
- 如果你的派生包含合并冲突,请从命令行更新你的派生。
从命令行
你也可以选择从命令行更新你的派生。
先决条件:
- 你必须在本地机器上下载并安装 Git 客户端。
- 你必须创建一个派生的仓库。
要从命令行更新你的派生,请按照使用 Git 更新派生中的说明进行操作。
使用仓库镜像
可以在满足以下所有条件时将派生配置为上游的镜像:
- 你的订阅是 专业版 或 旗舰版。
- 你在分支(而不是
main
)中创建所有更改。 - 你不处理机密议题的合并请求,这需要更改
main
。
仓库镜像使你的派生与原始仓库保持同步。此方法每小时更新一次你的派生,无需手动 git pull
。有关说明,请阅读配置拉取镜像。
警告: 使用镜像时,在批准合并请求之前,你需要同步。你应该自动化此过程。
将更改合并回上游
当你准备将代码发送回上游项目时,创建合并请求。对于 源分支,选择你派生项目的分支。对于 目标分支,选择原始项目的分支。
注意: 创建合并请求时,如果派生项目的可见性比父项目更严格(例如,派生是私有的,父项目是公开的),目标分支默认为派生项目的默认分支。这可以防止潜在地暴露派生项目的私有代码。
然后你可以添加标签、里程碑,并将合并请求分配给可以审查你更改的人。然后选择 提交合并请求 以完成此过程。当成功合并时,你的更改将添加到你正在合并的仓库和分支中。
取消派生
删除派生关系会将你的派生与其上游项目取消链接。你的派生将成为一个独立的项目。
先决条件:
- 你必须是项目所有者才能取消派生。
警告: 如果你删除派生关系,你将无法向源发送合并请求。如果有人派生了你的项目,他们的派生也会失去关系。要恢复派生关系,请使用 API。
要删除派生关系:
- 在左侧边栏,选择 搜索或转到 并找到你的项目。
- 选择 设置 > 常规。
- 展开 高级。
- 在 删除派生关系 部分,选择 删除派生关系。
- 要确认,请输入项目路径并选择 确认。
当你取消使用哈希存储池共享对象的派生时:
- 所有对象将从池中复制到你的派生中。
- 复制过程完成后,不再将存储池的更新传播到你的派生中。
相关主题
- GitLab 社区论坛:刷新派生
故障排除
错误:An error occurred while forking the project. Please try again
此错误可能是由于派生项目和新命名空间之间的实例运行器设置不匹配。有关更多信息,请参阅运行器文档中的派生。
删除派生关系失败
如果通过 UI 或 API 删除派生失败,你可以尝试在 Rails console session:
p = Project.find_by_full_path('<project_path>')
u = User.find_by_username('<username>')
Projects::UnlinkForkService.new(p, u).execute