你可以将一个 Git 仓库克隆到你的本地计算机上。此操作会创建该仓库的副本,并建立一个连接,用于同步你的计算机和极狐GitLab 服务器之间的更改。该连接要求你添加凭据。你可以选择使用 SSH 克隆使用 HTTPS 克隆。推荐使用 SSH 进行身份验证。

克隆仓库:

  • 下载项目的所有文件、历史记录和元数据到你的本地计算机。
  • 创建一个包含最新文件版本的工作目录。
  • 设置远程跟踪以同步未来的更改。
  • 提供对完整代码库的离线访问。
  • 为项目的代码贡献建立基础。

使用 SSH 克隆

当你只想进行一次身份验证时,请使用 SSH 克隆。

  1. 按照SSH 文档中的说明通过极狐GitLab 进行身份验证。
  2. 在左侧边栏中,选择 搜索或转到,并找到你想克隆的项目。
  3. 在项目的概览页面的右上角,选择 代码,然后复制 使用 SSH 克隆 的 URL。
  4. 打开终端,并进入你想克隆文件的目录。Git 会自动创建一个包含仓库名称的文件夹并下载文件。
  5. 运行以下命令:

    git clone <copied URL>
    
  6. 要查看文件,请转到新目录:

    cd <new directory>
    

使用 HTTPS 克隆

当你希望在每次执行与极狐GitLab 之间的操作时进行身份验证时,请使用 HTTPS 克隆。OAuth 凭据助手可以减少你必须手动验证的次数,使 HTTPS 成为无缝体验。

  1. 在左侧边栏中,选择 搜索或转到,并找到你想克隆的项目。
  2. 在项目的概览页面的右上角,选择 代码,然后复制 使用 HTTPS 克隆 的 URL。
  3. 打开终端,并进入你想克隆文件的目录。
  4. 运行以下命令。Git 会自动创建一个包含仓库名称的文件夹并下载文件。

    git clone <copied URL>
    
  5. 极狐GitLab 请求你的用户名和密码。

    如果你在账户上启用了双因素身份验证 (2FA),则不能使用你的账户密码。相反,你可以执行以下操作之一:

    如果你没有启用 2FA,则使用你的账户密码。

  6. 要查看文件,请转到新目录:

    cd <new directory>
    

{{< alert type=”note” >}}

在 Windows 上,如果你多次输入错误密码并出现 Access denied 消息,请将你的命名空间(用户名或群组)添加到路径中:git clone https://namespace@gitlab.com/gitlab-org/gitlab.git

{{< /alert >}}

使用令牌克隆

如果你想使用 2FA 或者希望拥有一组可撤销的凭据,范围限制为一个或多个仓库,可以使用令牌通过 HTTPS 克隆。

你可以使用以下任意令牌在通过 HTTPS 克隆时进行身份验证:

例如:

git clone https://<username>:<token>@gitlab.example.com/tanuki/awesome_project.git

在 Apple Xcode 中克隆并打开

包含 .xcodeproj.xcworkspace 目录的项目可以在 macOS 上克隆到 Xcode 中。

  1. 从极狐GitLab UI,进入项目的概览页面。
  2. 在右上角,选择 代码
  3. 选择 Xcode

项目被克隆到你的计算机上,并提示你打开 Xcode。

在 Visual Studio Code 中克隆并打开

所有项目都可以通过极狐GitLab 用户界面克隆到 Visual Studio Code 中,但你也可以安装 VS Code 的极狐GitLab 工作流扩展 从 Visual Studio Code 中克隆:

  • 从极狐GitLab 界面:
    1. 转到项目的概览页面。
    2. 在右上角,选择 代码
    3. 在你的 IDE 中打开 下,选择 Visual Studio Code (SSH)Visual Studio Code (HTTPS)
    4. 选择一个文件夹来克隆项目。

      在 Visual Studio Code 克隆你的项目后,它会打开该文件夹。

  • 从 Visual Studio Code,安装了扩展后,使用扩展的 Git: Clone 命令。

在 IntelliJ IDEA 中克隆并打开

所有项目都可以通过极狐GitLab 用户界面克隆到 IntelliJ IDEA 中。

前提条件:

  • 必须安装 JetBrains Toolbox App。

执行此操作:

  1. 转到项目的概览页面。
  2. 在右上角,选择 代码
  3. 在你的 IDE 中打开 下,选择 IntelliJ IDEA (SSH)IntelliJ IDEA (HTTPS)

减少克隆大小

随着 Git 仓库的大小增长,它们可能会因为以下原因变得难以处理:

  • 必须下载的大量历史记录。
  • 它们需要的大量磁盘空间。

部分克隆 是一种性能优化,允许 Git 在没有完整仓库副本的情况下运行。此工作的目标是允许 Git 更好地处理极大的仓库。

需要 Git 2.22.0 或更高版本。

按文件大小过滤

通常不建议在 Git 中存储大型二进制文件,因为每个添加的大文件在之后的克隆或获取更改时都会被所有人下载。这些下载速度慢且问题多,特别是在从慢速或不可靠的互联网连接进行操作时。

使用文件大小过滤的部分克隆解决了这个问题,通过从克隆和获取中排除麻烦的大文件。当 Git 遇到缺少的文件时,它会按需下载。

克隆仓库时,使用 --filter=blob:limit=<size> 参数。例如,要克隆不包含大于 1 兆字节的文件的仓库:

git clone --filter=blob:limit=1m git@gitlab.com:gitlab-com/www-gitlab-com.git

这会产生以下输出:

Cloning into 'www-gitlab-com'...
remote: Enumerating objects: 832467, done.
remote: Counting objects: 100% (832467/832467), done.
remote: Compressing objects: 100% (207226/207226), done.
remote: Total 832467 (delta 585563), reused 826624 (delta 580099), pack-reused 0
Receiving objects: 100% (832467/832467), 2.34 GiB | 5.05 MiB/s, done.
Resolving deltas: 100% (585563/585563), done.
remote: Enumerating objects: 146, done.
remote: Counting objects: 100% (146/146), done.
remote: Compressing objects: 100% (138/138), done.
remote: Total 146 (delta 8), reused 144 (delta 8), pack-reused 0
Receiving objects: 100% (146/146), 471.45 MiB | 4.60 MiB/s, done.
Resolving deltas: 100% (8/8), done.
Updating files: 100% (13008/13008), done.
Filtering content: 100% (3/3), 131.24 MiB | 4.65 MiB/s, done.

输出更长,因为 Git:

  1. 克隆仓库时排除大于 1 兆字节的文件。
  2. 下载任何需要检出默认分支的缺失大文件。

更改分支时,Git 可能会下载更多缺失的文件。

按对象类型过滤

对于拥有数百万文件和长历史记录的仓库,你可以排除所有文件并使用 git sparse-checkout 来减少工作副本的大小。

# 克隆仓库时排除所有文件
$ git clone --filter=blob:none --sparse git@gitlab.com:gitlab-com/www-gitlab-com.git
Cloning into 'www-gitlab-com'...
remote: Enumerating objects: 678296, done.
remote: Counting objects: 100% (678296/678296), done.
remote: Compressing objects: 100% (165915/165915), done.
remote: Total 678296 (delta 472342), reused 673292 (delta 467476), pack-reused 0
Receiving objects: 100% (678296/678296), 81.06 MiB | 5.74 MiB/s, done.
Resolving deltas: 100% (472342/472342), done.
remote: Enumerating objects: 28, done.
remote: Counting objects: 100% (28/28), done.
remote: Compressing objects: 100% (25/25), done.
remote: Total 28 (delta 0), reused 12 (delta 0), pack-reused 0
Receiving objects: 100% (28/28), 140.29 KiB | 341.00 KiB/s, done.
Updating files: 100% (28/28), done.

$ cd www-gitlab-com

$ git sparse-checkout set data --cone
remote: Enumerating objects: 301, done.
remote: Counting objects: 100% (301/301), done.
remote: Compressing objects: 100% (292/292), done.
remote: Total 301 (delta 16), reused 102 (delta 9), pack-reused 0
Receiving objects: 100% (301/301), 1.15 MiB | 608.00 KiB/s, done.
Resolving deltas: 100% (16/16), done.
Updating files: 100% (302/302), done.

更多细节,请参阅 Git 文档中的 sparse-checkout

按文件路径过滤

通过 --filter=sparse:oid=<blob-ish> 过滤规范,可以实现部分克隆与稀疏检出的更深集成。这种过滤模式使用类似于 .gitignore 文件的格式来指定克隆和获取时要包含的文件。

{{< alert type=”warning” >}}

使用 sparse 过滤器的部分克隆仍然是实验性的。它可能会很慢,并显著增加克隆和获取时 Gitaly 的资源利用率。过滤所有 blob 并使用稀疏检出 代替,因为 git-sparse-checkout 简化了这种部分克隆使用并克服了其限制。

{{< /alert >}}

更多细节,请参阅 Git 文档中的 rev-list-options

  1. 创建一个过滤规范。例如,考虑一个包含许多应用程序的单一代码库,每个应用程序都在根目录的不同子目录中。创建一个文件 shiny-app/.filterspec

    # 执行 `--filter=sparse:oid=shiny-app/.gitfilterspec` 部分克隆时仅下载文件中列出的路径
    
    # 明确包括配置稀疏检出所需的 filterspec
    # git config --local core.sparsecheckout true
    # git show master:snazzy-app/.gitfilterspec >> .git/info/sparse-checkout
    shiny-app/.gitfilterspec
    
    # Shiny 应用程序
    shiny-app/
    
    # 依赖项
    shimmery-app/
    shared-component-a/
    shared-component-b/
    
  2. 克隆并按路径过滤。使用克隆命令的 --filter=sparse:oid 支持尚未与稀疏检出完全集成。

    # 使用存储在服务器上的 filterspec 克隆过滤的对象集。警告:此步骤可能非常慢!
    git clone --sparse --filter=sparse:oid=master:shiny-app/.gitfilterspec <url>
    
    # 可选:观察我们尚未获取的缺失对象
    git rev-list --all --quiet --objects --missing=print | wc -l
    

    {{< alert type=”warning” >}}

    bash、Zsh 等集成的 Git 以及自动显示 Git 状态信息的编辑器通常运行 git fetch,这会获取整个仓库。可能需要禁用或重新配置这些集成。

    {{< /alert >}}

移除部分克隆过滤

具有部分克隆过滤的 Git 仓库可以移除过滤。要移除过滤:

  1. 获取过滤器排除的所有内容,以确保仓库完整。如果使用了 git sparse-checkout,请使用 git sparse-checkout disable 禁用它。有关更多信息,请参阅 disable 文档

    然后执行常规的 fetch 以确保仓库完整。要检查是否有缺失对象需要获取,然后获取它们,尤其是在不使用 git sparse-checkout 时,可以使用以下命令:

    # 显示缺失对象
    git rev-list --objects --all --missing=print | grep -e '^\?'
    
    # 显示缺失对象,不带 '?' 字符(需要 GNU grep)
    git rev-list --objects --all --missing=print | grep -oP '^\?\K\w+'
    
    # 获取缺失对象
    git fetch origin $(git rev-list --objects --all --missing=print | grep -oP '^\?\K\w+')
    
    # 显示缺失对象数量
    git rev-list --objects --all --missing=print | grep -e '^\?' | wc -l
    
  2. 重新打包所有内容。例如,可以使用 git repack -a -d 完成。这应该只会在 .git/objects/pack/ 中留下三个文件:
    • 一个 pack-<SHA1>.pack 文件。
    • 其对应的 pack-<SHA1>.idx 文件。
    • 一个 pack-<SHA1>.promisor 文件。
  3. 删除 .promisor 文件。上述步骤应该只留下一个空的 pack-<SHA1>.promisor 文件,应将其删除。

  4. 移除部分克隆配置。应从 Git 配置文件中移除与部分克隆相关的配置变量。通常只需移除以下配置:
    • remote.origin.promisor
    • remote.origin.partialclonefilter