跳至主要内容

Git clone 命令:从基础用法到高级技巧

掌握 git clone 命令的全面指南——涵盖协议、选项、工作流以及跨平台的真实用法。
· 15分钟 阅读

使用 AI 探索

Git 是一款功能强大的分布式版本控制系统,用于跟踪文件的变更历史,让开发者能够高效地跨团队协作。

作为与代码和脚本打交道的人,您在 Git 中最先遇到的命令之一就是 git clone。该命令可在本地创建同事维护的代码仓库副本,为您参与共享项目或离线管理代码库打下基础。

Illustration of Git workflow from https://www.git-tower.com/learn/git/ebook/en/command-line/remote-repositories/introductiongit clone 命令的工作原理。来源:Git-Tower

如果您想进一步学习 Git,我推荐这门 Introduction to Git 课程。

在 Git 的分布式架构下,每位开发者都拥有仓库的完整副本,包括其提交历史和分支。这一切通过 git clone 命令实现。该命令确保您获取的不仅是项目的当前状态,还包括其完整的版本历史,对于理解代码库如何发展到当前状态至关重要。

在本教程中,我将讲解 git clone 的作用、在不同场景下的用法,以及执行该命令时幕后发生的事情。无论您是刚开始接触 Git 的新手,还是希望加深对仓库管理理解的开发者,本指南都将为您提供实用知识,并让您有信心高效使用 git clone。

什么是 git clone?

git clone 命令会将一个仓库克隆或复制到您本机上的新目录中。尽管它既可克隆本地仓库也可克隆远程仓库,但最常见的用法是克隆远程仓库。git clone 会从来源(如 GitHub、GitLab 或 Bitbucket)复制所有文件、分支、提交历史和配置到目标的新目录中,目标可以是您的本机或 CI/CD 流水线。

从本质上说,git clone 是一个为现有项目搭建完整工作环境的快捷方式。例如,要将 GitHub 上的 “aws-cli” 仓库(远程仓库)复制到本地,您可以运行如下图所示的 git clone 命令:

# Initializes a new Git repository in the “aws-cli” folder on your local
# The version of Git used throughout this tutorial is 2.39.5
git clone https://github.com/aws/aws-cli.git

Output of the basic usage of git clone

git clone 基本用法的输出

与其他 Git 命令相比,git clone 具有独特性,因为它通常是您与远程仓库的首次接触,并且一般只需执行一次。例如:

  • git init 会在本地从零创建一个全新的 Git 仓库,这同样是一次性操作。
  • git fetch、git pull 和 git push 则是在仓库已经就绪后使用的。

相比之下,git clone 只需一步就能为现有项目引导起整个 Git 环境——无需额外设置。如果您加入某个项目或为开源项目做贡献,git clone 就是您的起点。

仓库克隆的基本机制

克隆 Git 仓库远不止下载项目文件。本节将深入介绍克隆过程中发生的事情,以及 Git 的分布式模型如何通过点对点的方式实现无缝协作,与传统的集中式系统截然不同。

理解克隆过程

让我们来了解执行 git clone 时幕后发生了什么。

  1. Git 会下载仓库内容,包括文件、分支、标签和提交历史。
  2. 初始化本地 .git 目录。该目录存储用于跟踪和管理变更所需的所有元数据、配置和版本历史。

.git directory.git 目录

  1. 设置远程 origin。Git 会自动为我们克隆的远程仓库指定名称 origin,方便获取和推送变更。

View the remote repository查看远程仓库

View configuration variables

查看配置变量

  1. 检出默认分支。通常是 main 或 master 分支,克隆完成后您将从该分支开始工作。不过,对于 “aws-cli” 仓库,默认分支是 develop。

"develop" is the default branch for the "aws-cli" GitHub repository.在 GitHub 上查看默认分支

基于 Git 的设计与功能,一旦克隆完成,您的本地仓库就是一个完全独立的副本,具备与远程相同的能力。它可以提交、创建分支,甚至可以作为他人的远程仓库。

这种模型与集中式版本控制系统(CVCS)如 Subversion(SVN)有显著差异,后者的服务器是唯一的“真相来源”。在 Git 中,每个克隆都是对等体,而不仅是客户端。所有仓库在功能上是平等的,变更可以双向共享。

Illustration of SVN as opposed to Git. https://www.atlassian.com/git/tutorials/setting-up-a-repository/git-clone

SVN 仓库 vs Git 仓库。来源:Atlassian

仓库到仓库的协作模型

每次我们克隆一个 Git 仓库,不只是制作一份拷贝;我们创建的是一个新的、自给自足的 Git 仓库。我们的克隆包含原仓库的完整提交历史和结构。

View the entire commit history from the cloned repository

查看克隆仓库的完整提交历史

这使我们可以离线工作、独立提交并创建分支。本地仓库也可以作为新功能或实验的基础。

Add a commit to the cloned repository

向克隆的仓库添加一次提交

Create a local branch in the cloned repository在克隆仓库中创建本地分支

克隆过程会建立跟踪关系,最明显的是与标记为 origin 的远程仓库。该连接支持以下操作:

  • 获取新变更:git fetch origin
  • 拉取并集成更新:git pull
  • 推送您的贡献:git push origin <branch>

尽管每个人都有自己的仓库副本,Git 仍通过共享远程和清晰的分支对应关系来确保协作有序。这也是各类组织使用 Git 管理其代码库的原因。

本质上,克隆是进入 Git 分布式协作模型的入口,每位贡献者都是开发生命周期中的平等参与者。

Git URL 与协议

如上面克隆 “aws-cli” 仓库的示例所示,使用 git clone 克隆仓库时,我们需要提供远程仓库的位置,即通过 Git URL 指定。

Git 支持多种访问远程仓库的协议,每种协议都有其结构、安全模型和最佳适用场景。了解不同类型的 Git URL 以及各自的使用时机,有助于您在团队协作或自动化部署时更安全高效地工作。

Git URL 的类型

克隆仓库时,您提供的 URL 告诉 Git 如何连接到远程服务器。最常见的 Git URL 类型包括:

HTTPS

超文本传输安全协议(HTTPS)。最常用于通过浏览器访问网页。此类 URL 使用简单,克隆公共仓库时无需任何配置。示例如下:

git clone https://github.com/<username>/<repo>.git
git clone https://github.com/aws/aws-cli.git
git clone https://gitlab.com/gitlab-org/gitlab.git

结构拆解:

  • https:// —— 用于通信的协议(安全且对防火墙友好)。
  • github.com —— Git 托管服务的域名。
  • username/repo.git —— 仓库路径:
    • username 为所有者(用户或组织)
    • repo.git 为 Git 仓库名

SSH

安全外壳协议(SSH)。一种需要在连接前与托管服务器建立凭据的认证网络协议。需要生成一对 SSH 密钥,并将公钥添加到您的 Git 提供商(例如 GitHub、GitLab)。

git clone [email protected]:<username>/<repo>.git
git clone [email protected]:aws/aws-cli.git
git clone [email protected]:gitlab-org/gitlab.git

结构拆解:

  • git@ —— 指定 SSH 用户账户(通常是 git)。
  • github.com: —— Git 服务器域名,后接冒号 :(不是斜杠)。
  • username/repo.git —— 服务器上的仓库路径。

由于我尚未在我的 GitHub 账户上配置 SSH 密钥,当我尝试复制 SSH URL 时会显示以下提示。

GitHub message that the public SSH key has not been configured in my account

未设置 SSH 密钥

我将在下一节介绍 SSH 密钥的设置。

GIT

一种轻量、无认证的只读协议。它是 Git 独有的协议。由于安全性问题以及 GitHub、GitLab 等主要提供商的废弃,如今很少使用。在 GitHub 或 GitLab 上甚至找不到通过 git 协议克隆的选项。

# Not recommended
git clone git://github.com/<username>/<repo>.git

结构拆解:

  • git// —— Git 协议(只读、无认证)。
  • github.com: —— Git 服务器域名。
  • username/repo.git —— 服务器上的仓库路径。

无论使用哪种克隆协议,您都可以通过运行以下命令检查所用的 URL 与协议:

git remote -v
git remote show origin

选择合适的 URL 协议

每种协议都有取舍。参考下表,我们比较为您的用例选择合适协议的优缺点。

协议

使用场景

优点

缺点

HTTPS

适合初学者和 CI 工具

易用、对防火墙友好

需要输入凭据或设置个人访问令牌(PAT)。可通过凭据助手缓解。

SSH

最佳用于频繁贡献者

安全、无需反复登录

需要密钥设置与管理

Git

归档或公共只读克隆

快速、轻量

不安全、基本已被弃用

特定协议的克隆流程

一旦选择了 Git URL 协议,实际的克隆流程与认证方式会有所不同。尽管两种方式最终目的相同(将远程仓库克隆到本地),但它们在安全偏好、用户需求和设置复杂度方面各有侧重。

本节我将介绍使用 HTTPS 和 SSH 克隆仓库的方法,以及最佳实践、设置步骤与排障建议,以确保安全顺畅的克隆过程。

HTTPS 克隆工作流

通过 HTTPS 克隆 Git 仓库是最直接的方法,非常适合初学者以及受限环境(如公司防火墙或受限网络)。

要克隆仓库,进入该仓库并复制 HTTPS URL。下图来自 GitHub,您所用的 Git 提供商界面会类似。

Obtain the HTTPS URL of a repository on GitHub

在 GitHub 上获取仓库的 HTTPS URL

随后,在您希望克隆到的目标(例如您的笔记本电脑或 CI/CD 流水线)上运行 git clone 命令。

git clone https://github.com/aws/aws-cli.git

Basic git clone command

基本的 git clone 命令

对于克隆公共仓库,如我们对 “aws-cli” 仓库所做的那样,不需要认证,因为仓库是公开的。只要您的系统已安装 git,就可以立即克隆公共仓库,无需任何配置。

但若要克隆私有仓库,则需要认证。您可以通过以下方式认证:

  • 个人访问令牌(PAT)
  • 通行密钥(Passkeys)

为演示使用个人访问令牌认证,我在 AWS EC2 上启动了一台服务器并安装了 Git。在对私有仓库执行 git clone 命令时,会提示输入用户名和密码。将您的 GitHub 用户名作为用户名输入,并将个人访问令牌作为密码输入。

HTTPS authentication via username/password

通过用户名/密码进行 HTTPS 认证

由于安全策略提升,GitHub 等提供商现已要求使用个人访问令牌而非密码。

 GitHub documentation on HTTPS URL
https://docs.github.com/en/get-started/git-basics/about-remote-repositories#cloning-with-https-urls

使用 HTTPS URL 克隆的访问令牌说明。来源:GitHub

如果未输入个人访问令牌,您会遇到以下错误:

Support for password authentication was removed

已移除对密码认证的支持。

要创建个人访问令牌,请前往 Create a GitHub Token 并按指引操作:

Create a personal access token on GitHub

在 GitHub 上创建个人访问令牌

为避免每次通过 HTTPS 认证时都输入个人访问令牌,您可以使用凭据助手安全地缓存凭据。常见选项包括 Git Credential Manager。

在 macOS 上,Git 可与 macOS 钥匙串无缝集成,这也是我个人用来存储凭据的方式。我的情况是使用存储在钥匙串中的通行密钥进行认证,既安全又顺畅。

View git configuration for credential.helper

查看凭据助手

Passkeys on MacOS

macOS 上的通行密钥

要设置通行密钥,请前往 GitHub 的 密码与认证设置 并按提示完成操作。

Create a passkey on GitHub

在 GitHub 上创建通行密钥

尽管 GitHub 允许您创建不过期的个人访问令牌,但大多数组织会实施安全策略,要求令牌设置到期日期。这意味着如果在自动化环境(如 CI/CD 流水线)中使用的令牌过期,流水线会因认证错误而失败。必须在令牌到期前主动重新生成并相应更新其使用位置。

如果缺乏合适的管控,开发者可能会无意间创建并使用多个个人访问令牌,而没有清晰的文档或追踪。这会迅速导致混乱,不清楚哪个令牌被用于何处,增加维护与审计难度。为保持良好规范,建议尽量精简令牌使用、做好记录,并与具体用例绑定。

SSH 克隆方法

SSH 提供一种安全且持久的认证方式,尤其适合常规贡献者与高级用户。配置完成后,您可以在无需反复输入凭据的情况下,与仓库无缝交互。

要设置 SSH 认证,我们首先需要生成一对 SSH 密钥,包括公钥和私钥。

# ed25519 specifies the key type
ssh-keygen -t ed25519 -C "[email protected]"

Create an SSH key pair

创建 SSH 密钥对

由于我在 ~/.ssh/id_ed25519 中已有现有 SSH 密钥,因此我覆盖了密钥的默认存放目录。但如果您是在设备上首次创建 SSH 密钥,请接受默认目录。

前往 GitHub 的 SSH 和 GPC 密钥页面 设置您的 SSH 密钥。

Set-up SSH key on GitHub

在 GitHub 上设置 SSH 密钥

将公钥内容粘贴到 “Key” 一栏。就我而言,即 id_ed25519.pub 文件的内容。

Paste in the contents of id_ed25519.pub

粘贴 id_ed25519.pub 的内容

SSH 使用公钥/私钥加密。请妥善保管您机器上的私钥。完成后,您即可通过 SSH 克隆公共或私有仓库。

成功设置 SSH 后,选择 SSH URL 将不再显示警告提示,如“Git URL 类型”一节所示。

Obtain the SSH URL of a repository on GitHub

在 GitHub 上获取仓库的 SSH URL

由于 SSH 私钥存放在我的本地设备上,我将在本地而非 EC2 服务器上演示使用 SSH 进行 git clone。

git clone [email protected]:aws/aws-cli.git

Clone public and private repositories using SSH

使用 SSH 克隆公共与私有仓库

我们已成功通过 SSH 完成了 git clone 操作!

SSH 的优势在于其安全性以及在组织内的广泛使用,它支持免密认证,非常适合频繁交互。SSH 连接也更能抵御网络中断,且长距离情况下通常比 HTTPS 更快。

不过,开发者在设置 SSH 密钥时常会遇到问题,比如将错误的公钥复制到 Git 提供商。如果您为不同用途准备了多把私钥,需要在 ~/.ssh/config 文件中针对每个主机指定使用哪把密钥。否则在认证 GitHub 时,可能会错误地使用原本用于 Bitbucket 的私钥,导致认证失败。

Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519

测试连通性并验证所用密钥:

Verify SSH connectivity

验证 SSH 连通性

git clone 用法示例

目前为止的 git clone 示例涵盖了该命令提供的基础功能。

本节我将带您了解该命令的多种选项,帮助您按需定制仓库的克隆过程到您的本地。无论是处理特定分支还是优化速度,理解这些变体都能帮助您更高效地使用 git clone。

基础仓库克隆

正如我们所见,git clone 最直接的用法就是将远程仓库克隆到本地。

# HTTPS protocol
git clone https://github.com/aws/aws-cli.git

# SSH protocol
git clone [email protected]:aws/aws-cli.git

这些命令会创建名为 “aws-cli” 的文件夹,并在其中初始化仓库的本地副本,包含版本历史与远程跟踪设置。

克隆到特定文件夹

默认情况下,git clone 会创建一个以仓库名命名的目录。要指定不同的目标目录名,只需将其作为第二个参数提供。

以下命令将 aws-cli.git 的内容克隆到名为 my-project-folder 的本地文件夹中:

git clone https://github.com/aws/aws-cli.git my-project-folder

Cloning into a specific folder

克隆到特定文件夹

克隆特定分支或标签

使用 --branch(或 -b)标志,在克隆远程的所有分支后检出到指定分支。指定分支将成为已检出的 “HEAD”,其他分支可在本地切换使用。

以上述 “aws-cli” 仓库为例,其默认分支为 develop. 下面我们尝试克隆并检出到 master 分支。

# Clone a branch
git clone --branch master https://github.com/aws/aws-cli.git

Cloning a specific branch

克隆特定分支

我们也可以克隆特定标签:

# Clone a tag (read-only snapshot)
git clone --branch 2.27.43 https://github.com/aws/aws-cli.git

Cloning a specific tag

克隆特定标签

当需要处理特定版本或与环境相关的分支(如 staging、hotfix 或 release)时,该标志非常有用。

浅克隆(限定深度)

如果您只需要项目的最新版本而不需要完整提交历史,可使用 --depth 标志执行浅克隆。--depth 指定要克隆的提交数量。

# Download only the latest commit history
git clone --depth 1 https://github.com/aws/aws-cli.git

Only one commit history present from shallow clone浅克隆

这可以加快克隆过程并减少磁盘占用,非常适合 CI/CD 流水线或当您不关心提交历史时。对于我们一直在克隆的 “aws-cli” 仓库尤其有效。由于其提交历史悠久,加入 --depth 标志后用时差异巨大。

Time difference with and without shallow clone启用与未启用浅克隆的耗时差异

省略除最新外的提交历史减少了需下载的信息量,从而缩短了所需时间。

高级克隆配置

虽然 git clone 命令最常以基础形式使用,但 Git 还提供了多项高级选项,让您在克隆过程中拥有更高的控制力、效率和定制化。

这些功能在处理大型仓库、管理基础设施级仓库或优化特定开发工作流时尤为有用。

本节将探讨分支相关操作、浅克隆与部分克隆、仓库特化,以及更细粒度的克隆配置,赋能开发者与 DevOps 工程师。

面向分支的克隆操作

默认情况下,git clone 会获取所有分支并检出默认分支。但在处理大型仓库或针对特定功能开发时,仅克隆某个分支往往更高效。可通过 --single-branch 标志实现。

git clone --branch <branch-name> --single-branch <repo-url>
git clone --branch feature/cliq --single-branch https://github.com/aws/aws-cli.git

Clone a specific branch克隆特定分支

其优势包括减少下载大小与时间、加快针对功能的环境搭建、避免不必要的分支历史。

这种方式非常适合在发布分支上工作,或在活跃的 CI/CD 仓库中避免下载所有分支。如果命令中未指定分支名,Git 将只克隆默认分支。

如需进一步了解克隆特定分支,请参阅 Git Clone Branch 教程。

专用仓库类型

当我们克隆一个仓库时,会克隆两个部分:仓库(.git 文件夹)与工作目录。工作目录也常被称为工作副本、工作树或工作空间。

Difference between working directory and repository

工作目录与仓库的区别

.git 文件夹的内容如下:

Contents of .git folder

.git 文件夹内容

这将引出裸仓库的主题。

裸仓库(bare)

裸仓库仅包含 .git 文件夹,不包含工作目录。

git clone --bare <repo-url>
git clone --bare https://github.com/aws/aws-cli.git

Clone a bare repository

克隆裸仓库

从上图可见,使用 --bare 标志克隆得到的内容,本质上就是非裸仓库中 .git 文件夹的内容。由于是裸仓库,没有工作目录,因此无法运行某些 git 命令,如下图所示:

Operation must be run in a work tree必须在工作树中运行该操作

裸仓库通常用作共享环境中的中心仓库,用于协作或镜像,而非用于主动开发。为演示从裸仓库克隆,我将使用本地的 “aws-cli” 裸仓库。

Clone from my local bare repository

从我的本地裸仓库进行克隆

我们可以看到,这个 “aws-cli-non-bare” 仓库包含工作目录。运行 git remote -v 可看到它引用了裸仓库。

镜像仓库

git clone --mirror 会建立源仓库的镜像。--mirror 隐含 --bare,即镜像仓库同样不包含工作目录。

git clone --mirror <repo-url>
git clone --mirror https://github.com/aws/aws-cli.git

Clone a (central) repository to make a mirror repository

克隆(中心)仓库以创建镜像仓库

不过,相较于 --bare,--mirror 不仅会将源仓库的本地分支映射到目标仓库的本地分支,还会映射所有引用(包括远程跟踪分支、notes 等),并设置 refspec 配置,使得在目标仓库执行 git remote update 时可以覆盖所有这些引用。这样能得到更全面的副本,包括全部引用(分支、标签等)。

您可以参阅 GitHub 文档,了解镜像仓库的完整步骤。

GitHub documentation on mirroring a repository

在另一位置镜像仓库。来源:GitHub

部分克隆过滤与缩小克隆体积

部分克隆允许通过 --filter 标志仅获取仓库对象的子集,特别适合只需代码库一部分、或带宽/磁盘受限的开发者。--filter 的常见用法包括:

  • --filter=blob:none:跳过文件内容(blob)
  • --filter=blob:limit=<size>:排除大于等于指定大小的文件
  • --filter=tree:<depth>:省略所有深度达到或超过设定值的 blob 和 tree 对象

blob:none

--filter=blob:none 用于通过避免立即下载文件内容(blob)来优化克隆操作。

# Binary Large Objects (BLOB)
git clone --filter=blob:none <repo-url>
git clone --filter=blob:none https://github.com/aws/aws-cli.git

Clone with filter=blob:none

使用 filter=blob:none 的克隆

这在大型仓库或仅需项目子集时尤其有用。例如,在单体仓库(monorepo)中,并非所有团队或开发者都需要整个代码库。

只在 frontend/ 目录工作的前端工程师不需要后端服务或共享库。使用 --filter 标志可通过延迟下载 blob(例如在打开文件时)来加速克隆并减少存储。下图展示了当我打开文件时,Git 在后台按需下载文件 blob 的过程。

Git downloading the file blob on-demand

Git 按需下载文件 blob

另一个例子是 CI/CD 流水线。流水线往往不需要完整的仓库历史或每一个文件。结合稀疏检出(sparse-checkout),--filter=blob:none 可让流水线仅克隆相关目录(如部署脚本)。

blob:limit=<size>

--filter=blob:limit=<size> 适用于希望在克隆时避免下载大文件(blob),但仍需立即获取较小文件的开发者。这是 Git 部分克隆功能的一部分,尤其在包含不同大小内容的仓库中十分有用。

例如,在一些项目中,尤其使用 Git LFS 或提交了媒体资源(如视频、大型数据集、游戏素材),开发者可能希望跳过大文件,从而加快初次克隆,并将大型文件的下载延后到确有需要时。

# Binary Large Objects (BLOB)
git clone --filter=blob:limit=<size> <repo-url>
#  The suffixes k, m, and g can be used to name units in KiB, MiB, or GiB
git clone --filter=blob:limit=<n>[kmg] <repo-url>
git clone --filter=blob:limit=1m https://github.com/aws/aws-cli.git

Clone with filter=blob:limit

使用 filter=blob:limit 的克隆

tree:<depth>

--filter=tree:<depth> 用于限制 Git 在克隆时获取树对象的目录深度,从而减少数据传输量,尤其在处理目录层级很深的项目(如单体仓库)时很有帮助。例如,若您只是想快速查看大型单体仓库的结构用于审计、入职或评审,下载过深的树结构就显得浪费。

git clone --filter=tree:<depth> <repo-url>
git clone --filter=tree:0 https://github.com/aws/aws-cli.git

Clone with filter=tree

使用 filter=tree 的克隆

请注意,您所克隆的 Git 服务器(本例为 GitHub)可能只支持树过滤深度的某些取值。

Tree filter allows max depth 0

树过滤允许的最大深度为 0

克隆相关配置

Git 提供多种选项以自定义克隆时的行为:

  • --origin <name>:将远程名称设置为自定义值,替代 origin
  • --template <dir>:使用模板目录中的文件初始化 .git 设置
  • --single-branch:避免获取其他分支
  • --recurse-submodules:自动初始化并克隆子模块

这些选项适用于搭建标准化环境、处理模块化仓库或集成部署工具。

origin

--origin <name> 标志让开发者在克隆时自定义远程名称。默认情况下 Git 将远程命名为 origin,但通过该标志可以在克隆时更改为其他名称。

git clone --origin <remote name> <repo-url>
# Name the remote as “upstream”
git clone --origin upstream https://github.com/aws/aws-cli.git

Rename the remote from origin to upstream

将远程名称从 origin 重命名为 upstream

出于清晰性考虑,开发者可能需要更改远程名称,因为之后可能需要添加另一个远程(例如 upstream vs. fork 的 origin)。更改第一个远程的名称有助于避免混淆与冲突。

template

--template 标志允许开发者指定自定义模板目录,Git 会在新克隆的仓库中创建 .git 目录时使用该目录中的内容。模板目录可预定义钩子、配置文件或目录结构,并在初始化时自动应用到仓库。

# Specify the directory from which templates will be used
git clone --template=<template-directory> <repo>
git clone --template=./git-template https://github.com/aws/aws-cli.git

Usage of the --template flag

--template 标志的用法

关于 template 标志,我会在“模板目录应用”一节进一步介绍。

single-branch

--single-branch 用于仅克隆指定分支的历史,而非远程仓库的全部分支。在存在众多长期分支或提交历史庞大的仓库中,这能显著减少克隆数据量。

当您需要在特定功能或发布分支上工作(如 feature/login-ui, release/v2.0)时,无需克隆其他无关分支的历史。

git clone --branch feature/login-ui --single-branch <repo-url>

# If you do not specify a branch, Git will clone only the remote's default branch, usually main or master
git clone --single-branch <repo-url>
git clone --single-branch https://github.com/aws/aws-cli.git

典型的 git clone 会跟踪所有远程分支,如下方 git branch -r 的输出所示。

All remote branches are tracked

将跟踪所有远程分支

而添加 --single-branch 后,仅克隆指定分支的历史。

Only the default branch is tracked

仅跟踪默认分支

recurse-submodules

Git 子模块是对另一个仓库的引用,固定在特定提交上。它允许您将其他 Git 仓库作为自己仓库的子目录,常用于引入第三方代码、共享库或厂商组件。

我创建了一个 公共 GitHub 仓库 来演示该概念。

GitHub repo for demonstrating submodules.

子模块演示

当我们克隆一个包含子模块的项目时,默认只会得到包含子模块的目录,而不会得到其中的文件。

Empty submodule folder

子模块文件夹为空

与其运行 git submodule init 初始化本地配置文件,并运行 git submodule update 获取该项目的全部数据,我们可以在 git clone 命令中使用 --recurse-submodules 标志,自动初始化并克隆仓库的 .gitmodules 文件中定义的所有子模块。

git clone --recurse-submodules <repo-url>

Clone files within the submodule directory

克隆子模块目录中的文件

模板目录应用

Git 允许使用模板目录在克隆或初始化仓库时定义默认的钩子、配置与其他文件:

模板目录的结构可类似如下,其中 hooks/pre-commit 包含一个 shell 脚本钩子,用于阻止没有 JIRA ID 的提交,而 hooks/commit-msg 则包含提交消息的模板。

/home/devops/git-template/
├── config
├── description
├── hooks/
│   ├── pre-commit
│   └── commit-msg
├── info/
│   └── exclude

在模板目录中定义好必要文件后,您即可在 git clone 操作中使用它。

git clone --template=</path/to/template> <repo-url>
git clone --template=/home/devops/git-template https://github.com/aws/aws-cli.git

这非常适合:

  • 通过钩子(如 pre-commit)强制执行仓库策略
  • 为 CI/CD 或工具预设配置文件
  • 用通用结构快速启动项目

模板目录可简化团队工作流,并确保各个克隆仓库的一致性。

在不同操作系统上克隆

尽管 git clone 在各平台的核心工作方式一致,但根据操作系统不同,使用体验会略有差异。

特定环境因素(如终端工具、文件路径格式、权限处理)会影响开发者与 Git 的交互方式。本节将分别介绍在 Windows、Linux/Ubuntu 与 macOS 上的克隆流程,帮助您应对这些差异。

Windows

在 Windows 上,开发者通常使用 Git Bash、PowerShell 或命令提示符执行 Git 命令。我们可以从 下载页面 安装 Git,安装包包含 Git Bash,这是一个为 Windows 上的 Git 使用而定制的类 Unix shell。

git clone in Git Bash

在 Git Bash 中执行 git clone

git clone in PowerShell

在 PowerShell 中执行 git clone

需要注意的事项:

  • Git Bash 使用类 Unix 路径(/c/Users/username/),而 PowerShell 和命令提示符使用 Windows 路径(C:\Users\username\)。
  • 使用 PowerShell 时,请确保已将 Git 添加到系统 PATH。

Linux/Ubuntu

Ubuntu 等 Linux 发行版可通过原生终端无缝使用 Git。以下示例中,我在 AWS 上启动了一台 Ubuntu EC2 实例,并通过 SSH 连接。

SSH into the Ubuntu EC2 instance

通过 SSH 连接到 Ubuntu EC2 实例

Git 默认已安装。若您的系统未安装,只需执行 sudo apt install git。

Install git on Ubuntu

在 Ubuntu 上安装 git

进入目标目录并运行 git clone 命令。

git clone in Ubuntu

在 Ubuntu 中执行 git clone

需要注意的事项:

  • 确保为私有仓库正确配置 SSH 密钥(~/.ssh/id_rsa)。
  • 文件权限与目录所有权会影响仓库操作,尤其是在克隆到系统级路径时。

Mac

macOS 提供与 Linux 十分相近的类 Unix 环境,使用 Git 十分直观。Git 通常已预装;若未安装,安装 Xcode 命令行工具(xcode-select --install)也会一并安装 Git。

打开终端并运行 git clone 命令。

git clone on Mac在 Mac 上执行 git clone

需要注意的事项:

  • 与 Linux 一样,私有仓库的 SSH 密钥管理很重要。
  • macOS 用户常用 GitHub Desktop 或 Sourcetree 等图形客户端;请确保底层 Git 设置正确配置。

实践落地场景

尽管 git clone 常被用于获取仓库副本,在真实的工程工作流中,它的用途远不止于此。

本节我将探讨如何在实践中应用不同的克隆策略,每种场景都需要量身定制的方式以最大化效率与一致性。

企业级开发工作流

在大型组织中,高效的仓库克隆对于加速新人成长与项目标准化搭建至关重要。可采用以下策略:

  • 其一,浅克隆(--depth=1)。常用于为不需要完整提交历史的新开发者缩短搭建时间。
  • 其二,模板仓库(不要与模板目录混淆)。模板仓库包含预定义的文件夹结构、钩子与子模块,可用于快速启动项目。在 GitHub 中,您可以在设置中启用仓库为模板仓库。

Template repository setting

模板仓库设置

启用后,您会在仓库主页看到 “Use this template” 按钮。

Use the repository as a template

将该仓库用作模板

  • 其三,在内网中镜像外部仓库可降低对公共网络的依赖,并在安全环境中加速克隆。

仓库迁移流程

组织可能会在不同平台间迁移仓库(如 GitHub 到 GitLab),原因可能涉及安全、合规或成本等。迁移需要使用镜像克隆,以确保获得完整拷贝,包括所有分支、标签和提交历史。

典型流程如下:

# --mirror flag clones all refs and configuration.
git clone --mirror https://source-url.com/your-repo.git
cd your-repo.git
git push --mirror https://target-url.com/your-new-repo.git

此方法较“标准克隆后再推送”更能保留 Git 元数据。迁移完成后,请更新远程 URL 并验证访问权限。

CI/CD 流水线优化

在自动化环境中,优化克隆操作能节省时间与资源,尤其在高频部署时。我们可以遵循以下最佳实践以提升流水线效率:

  • 其一,使用浅克隆(--depth=1)加快任务启动。
git clone --depth 1 <repository-url>
  • 其二,仅克隆所需分支,避免不必要的引用。
git clone --branch <branch-name> --single-branch <repo-url>
  • 其三,若 CI/CD 流水线的多个阶段需要访问相同的仓库内容,可考虑实现缓存机制,避免重复执行 git clone。与其在每个阶段克隆仓库,不如在初次检出后缓存工作目录,并作为制品或共享卷传递给后续阶段。

这种做法能显著减少冗余操作、加速流水线执行,并节省计算与网络资源。

故障排查与诊断

尽管 git clone 是广泛使用且直观的命令,但在克隆过程中开发者仍可能遇到问题,尤其是在采用严格认证控制、自定义仓库配置或网络受限的环境中。

本节将介绍常见克隆问题及其高效解决方法。

认证失败的解决

认证失败通常发生在访问私有仓库或使用过期凭据时。根据所用协议(HTTPS 或 SSH)不同,错误信息与修复方法也不同。在启用 MFA 的环境中,优先使用 SSH 或基于 PAT 的 HTTPS。

对于 HTTPS,常见错误为认证失败。这可能是由于个人访问令牌过期所致。如果启用了 MFA,另一种可能是未使用个人访问令牌作为密码。

HTTPS authentication failureHTTPS 认证失败

对于 SSH,常见错误为 “Permission denied (publickey)”。这可能是因为未将公钥添加到 Git 提供商账户,或本地设备上的私钥未存放在正确目录。

SSH authentication failureSSH 认证失败

您可以使用以下命令验证连通性:

ssh -T [email protected]

部分克隆对象的获取

在少数情况下,使用部分克隆(--filter 或 --depth 标志)时,若 Git 访问未最初获取的仓库部分,可能会遇到缺失对象(例如 “error: object <sha> is missing”)。

我个人未曾遇到过这种情况。但您可能会在访问历史提交、分支或标签时出错;在流水线中,构建工具或脚本也可能失败。您可以通过以下方式显式获取缺失数据:

# Have Git refetch all objects from the remote, even if it thinks it already has them.
# For dealing with a broken or corrupted partial clone
git fetch --filter=blob:none --refetch

# Convert a shallow clone into a full clone. Retrieves the rest of the commit history that was omitted during the shallow clone.
git fetch --unshallow

# Obtain a deeper history of the branch
git fetch origin <branch> --depth=50

# Fetches 30 more commits from the current branch’s history. Repeat as needed.
git fetch --deepen=30

Have Git refetch all objects from the remote

让 Git 重新从远程获取所有对象

常见 git clone 错误与修复

除了上述在 git clone 过程中可能遇到的问题,下表还涵盖了其他常见错误。

错误信息

原因

修复

Repository not found.

URL 错误或无访问权限

检查仓库 URL,并确保您拥有读取权限。

fatal: unable to access '...': SSL certificate problem

证书信任问题

使用有效 CA,或禁用 SSL 校验(不推荐):git config --global http.sslVerify false

RPC failed; curl 56

网络不稳定或仓库过大

增大缓冲区:git config --global http.postBuffer 524288000

结语

git clone 命令看似简单,对许多人而言基本用法已足够。然而正如本文所示,它是一个影响深远的基础工具。

我们介绍了 git clone 的工作机制,探讨了 URL 类型与协议,讲解了高级配置与不同操作系统上的差异,并分析了 CI/CD、企业工作流以及常见故障排查等真实场景。

针对您的环境调整 git clone ——无论是流水线的浅克隆、仓库迁移,还是大规模协作——都能显著提升性能与团队效率。随着现代开发环境日益复杂与分布式化,掌握这些配置能确保您不仅会用 Git,而且用得高效。

展望未来,Git 的克隆机制仍有提升空间,例如更智能的部分克隆、更好地支持大型单体仓库,以及更直观地处理子模块与过滤器。随着 Git 的演进,保持对这些改进的关注,将助力开发者在任意系统与规模下更快更高效地工作。

如需进一步学习 Git,我推荐参加 Introduction to Git 课程。若您希望更上一层楼,Advanced Git 课程非常适合您!

Kenny Ang

作者

Kenny Ang

Kenny 是一名经验丰富的云基础设施与 DevOps 工程师,精通 Terraform、GitLab CI/CD 流水线以及多种 AWS 服务,擅长设计可扩展、安全且具成本优化的云解决方案。他在构建可复用的基础设施、使用 Python 和 Bash 实现工作流自动化,以及将安全最佳实践融入 CI/CD 流水线方面表现出色。凭借在 Kubernetes 和多种可观测性工具上的丰富实战经验,Kenny 能够高效管理并编排微服务,同时确保稳健的可观测性与性能监控。Kenny 因其领导力、指导能力和对创新的投入而备受认可,持续为现代云原生应用交付可靠且可扩展的解决方案。他始终致力于走在行业趋势与新兴技术的前沿,不断拓展并深化自己的技能。

主题