分支
- Tier: Free, Premium, Ultimate
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
Fork 是另一个 Git 仓库的个人副本,放置在您选择的命名空间中。 您的副本包含上游仓库的内容,包括所有分支、标签和 CI/CD 作业配置。 您可以从您的 fork 创建合并请求,以定位到上游仓库。 单个提交也可以从您的 fork cherry-picked 到上游仓库。
如果您对原始仓库有写入权限,则不需要 fork。 相反,使用分支来管理工作。 如果您想要贡献的仓库没有写入权限,请 fork 它。 在您的 fork 中进行更改,然后通过合并请求提交到上游仓库。
要创建 confidential merge request, 请使用公共仓库的个人 fork。
如果上游项目被归档,fork 关系将自动移除。 由于 fork 关系中断而关闭的合并请求不会重新打开, 即使 fork 关系后来被恢复。
有关更多信息,请参阅 Archive a project。
创建 fork
要在 GitLab 中 fork 现有项目:
- 在项目主页的右上角,选择 Fork ( )。
- 可选。编辑 Project name。
- 对于 Project URL,选择您的 fork 应该所属的 namespace。
- 添加一个 Project slug。此值将成为您 fork URL 的一部分。 它在命名空间中必须是唯一的。
- 可选。添加一个 Project description。
- 选择一个 Branches to include 选项:
- All branches (默认)。
- Only the default branch。使用
--single-branch和--no-tagsGit options。
- 为您的 fork 选择 Visibility level。有关 可见性级别的更多信息,请阅读 Project and group visibility。
- 选择 Fork project。
GitLab 会创建您的 fork,将您重定向到新 fork 的页面,并在 audit log 中记录 fork 的创建。
如果您打算频繁向上游贡献更改,请考虑为您的 fork 设置一个 default target。
更新您的 fork
Fork 可能会与其上游仓库不同步,需要更新:
- Ahead:您的 fork 包含上游仓库中不存在的新提交。 要同步您的 fork,请创建合并请求以将您的更改推送到上游仓库。
- Behind:上游仓库包含您的 fork 中不存在的新提交。 要同步您的 fork,请将新提交拉取到您的 fork 中。
- Ahead and behind:上游仓库和您的 fork 都包含彼此中不存在的新提交。 要完全同步您的 fork,请创建合并请求以推送您的更改,并将上游仓库的新更改拉取到您的 fork 中。
要将您的 fork 与其上游仓库同步,请从 GitLab UI 或命令行更新它。 GitLab Premium 和 Ultimate 版本还可以通过 将 fork 配置为上游仓库的拉取镜像 来自动更新。
从 UI 更新
先决条件:
- 您必须从上游仓库的 unprotected branch 创建您的 fork。
要从 GitLab UI 更新您的 fork:
-
在左侧边栏,选择 Search or go to。
-
选择 View all my projects。
-
选择您要更新的 fork。
-
在分支名称的下拉列表下方,找到 Forked from ( ) 信息框,以确定您的 fork 是领先、落后还是两者兼有。在此示例中, fork 落后于上游仓库:
-
如果您的 fork 领先 于上游仓库,请选择 Create merge request 以提议将您的 fork 的更改添加到上游仓库。
-
如果您的 fork 落后 于上游仓库,请选择 Update fork 以从上游仓库拉取更改。
-
如果您的 fork 领先和落后 于上游仓库,只有在 GitLab 检测到没有合并冲突时才能从 UI 更新:
- 如果您的 fork 不包含合并冲突,您可以选择 Create merge request 以提议将您的更改推送到上游仓库,Update fork 以将更改拉取到您的 fork,或两者都选。您 fork 中的更改类型 决定了哪些操作是合适的。
- 如果您的 fork 包含合并冲突,GitLab 会显示一个逐步指南,指导您从命令行更新您的 fork。
从命令行更新
您也可以选择从命令行更新您的 fork。
先决条件:
- 您必须在本地机器上 下载并安装 Git 客户端。
- 您必须 创建一个 fork 来更新您想要更新的仓库。
要从命令行更新您的 fork,请按照 使用 Git 更新 fork 中的说明操作。
使用仓库镜像
- Tier: Premium, Ultimate
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
如果满足以下所有条件,可以将 fork 配置为上游的镜像:
- 您的订阅是 GitLab Premium 或 GitLab Ultimate。
- 您在分支中创建所有更改(不是
main)。 - 您不处理 confidential issues 的合并请求,
这需要对
main进行更改。
Repository mirroring 保持您的 fork 与原始仓库同步。
此方法每小时更新您的 fork 一次,无需手动 git pull。
有关说明,请阅读 Configure pull mirroring。
使用镜像时,在批准合并请求之前,系统会要求您同步。您应该自动化它。
将更改合并回上游
当您准备将代码发送回上游仓库时,请按照 When you work in a fork 中的描述创建新的合并请求。 成功合并后,您的更改将被添加到您正在合并到的仓库和分支中。
取消链接 fork
移除 fork 关系会将您的 fork 与其上游仓库取消链接。 您的 fork 然后成为一个独立的仓库。
先决条件:
- 您必须是项目所有者才能取消链接 fork。
如果您移除 fork 关系,您无法向源发送新的合并请求。 任何从 fork 到源的开放合并请求也将被关闭。 如果任何人 fork 了您的仓库,他们的 fork 也会失去关系。 要恢复 fork 关系,使用 API。
要移除 fork 关系:
- 在左侧边栏,选择 Search or go to 并找到您的项目。
- 选择 Settings > General。
- 展开 Advanced。
- 在 Remove fork relationship 部分,选择 Remove fork relationship。
- 确认,输入项目路径并选择 Confirm。
GitLab 在 audit log 中记录取消链接操作。 当您取消链接使用 hashed storage pool 与另一个仓库共享对象的 fork 时:
- 所有对象都会从池复制到您的 fork 中。
- 复制过程完成后,不会再有来自存储池的更新传播到您的 fork。
检查 fork 的存储使用情况
您的 fork 使用去重策略 来减少其所需的存储空间。您的 fork 可以访问连接到源仓库的对象池。
有关更多信息并检查存储使用情况,请参阅 View project fork storage usage。
相关主题
- GitLab 社区论坛:Refreshing a fork
- Prevent project forking outside group
- Understand how Git LFS works with forks
故障排除
错误:An error occurred while forking the project. Please try again
此错误可能是由于 fork 项目和新命名空间之间的实例 runner 设置不匹配造成的。 有关更多信息,请参阅 Runner 文档中的 Forks。
移除 fork 关系失败
如果通过 UI 或 API 移除 fork 不起作用,您可以尝试在 Rails console session 中 移除 fork 关系:
p = Project.find_by_full_path('<project_path>')
u = User.find_by_username('<username>')
Projects::UnlinkForkService.new(p, u).execute