git clone

这里我们将深入研究 git clone 命令。git clone 是一个 Git 命令行实用程序,用于定位现有存储库并创建目标存储库的克隆或副本。在本页中,我们将讨论 git clone 的扩展配置选项和常见用例。我们将在这里介绍一些要点:

  • 克隆本地或远程存储库

  • 克隆裸存储库

  • 使用浅层选项部分克隆存储库

  • Git URL 语法和支持的协议

设置存储库指南中,我们介绍了 git clone 的基本用例。本页将探讨更复杂的克隆和配置方案。

目的:代码存储库到代码存储库协作开发副本

如果已在中央存储库中设置了项目,则 git clone 命令是用户获取开发副本的最常用方式。像 git init 一样,克隆通常是一次性操作。开发人员获得工作副本后,所有版本控制操作和协作都将通过其本地存储库进行管理。

代码存储库到代码存储库协作

Git 的“工作副本”理念与通过从 SVN 存储库签出代码所获得的工作副本截然不同,了解这一点很重要。与 SVN 不同,Git 不区分工作副本和中央存储库——它们都是完整的 Git 存储库

这就使与 Git 的协作从根本上不同于 SVN。SVN 依赖于中央存储库和工作副本之间的关系,而 Git 的协作模式基于存储库与存储库之间的互动,不是将工作副本签入 SVN 的中央存储库,而是将提交从一个存储库推送拉取到另一个存储库。

Git 教程:从代码存储库到工作副本协作
Git 教程:代码存储库到代码存储库协作

当然,您可以向某些 Git 代码存储库赋予特殊意义。例如,只需将一个 Git 代码存储库指定为“中央”存储库,就可以使用 Git 来复制集中式工作流程。这通过约定而不是硬连接到 VCS 本身来实现。

用法

git clone 主要用于指向现有代码存储库,并在另一个位置的新目录中克隆或复制该代码存储库。原始存储库可以位于本地文件系统上,也可以位于远程计算机可访问的支持协议上。git clone 命令复制现有的 Git 存储库。这有点像 SVN 签出,只是“工作副本”是一个成熟的 Git 存储库——它有自己的历史记录,管理自己的文件,是一个与原始存储库完全隔离的环境。

为方便起见,克隆会自动创建一个名为 "origin" 的远程连接,该连接指向原始存储库。这使得与中央存储库交互变得非常容易。这种自动连接是通过在 refs/remotes/origin 下创建指向远程分支头的 Git 引用以及初始化 remote.origin.urlremote.origin.fetch 配置变量来建立的。

使用 git clone 的示例可以在设置存储库指南中找到。下方示例演示了如何使用 SSH 用户名 john 获取存储在 example.com 可访问服务器上的中央存储库的本地副本:

git clone ssh://john@example.com/path/to/my-project.git 
cd my-project 
# Start working on the project

第一条命令在本地计算机上的 my-project 文件夹中初始化一个新的 Git 存储库,并使用中央存储库的内容填充该存储库。然后,您可以 cd 进入项目并开始编辑文件、提交快照以及与其他存储库进行交互。还要注意的是,克隆的存储库中省略了 .git 扩展。这反映了本地副本的非裸露状态。

克隆到特定文件夹

git clone <repo> <directory>

将位于 <repo> 的存储库克隆到本地计算机上名为 ~<directory>! 的文件夹中。

克隆特定标记

git clone --branch <tag> <repo>

克隆位于 <repo> 的存储库,并仅克隆 <tag> 的引用。

浅层克隆

git clone -depth=1 <repo>

克隆位于 <repo> 的存储库并仅克隆 由 depth=1 选项指定的提交历史记录。在此示例中,对 <repo> 进行了克隆,并且新克隆的代码存储库中仅包含最新的提交。浅层克隆在处理具有大量提交历史记录的代码存储库时最有用。大量提交历史记录可能会导致扩展问题,例如磁盘空间使用限制和克隆时等待时间长。浅层克隆可以帮助缓解这些扩展问题。

配置选项

git clone -branch

-branch 参数允许您指定要克隆的特定分支,而不是远程 HEAD 指向的分支,通常是主分支。此外,您也可以传入标签而不是分支来达到同样的效果。

git clone --branch

git clone -mirror vs. git clone -bare

git clone --bare

git init --bare 类似,将 -bare 参数传递给 git clone 时,将使用省略的工作目录创建远程存储库的副本。这意味着将建立一个存储库,其中包含可以推送和拉取的项目历史记录,但不能直接编辑。此外,不会使用 -bare 存储库为该代码存储库配置任何远程分支。与 git init --bare 一样,它用于创建开发人员不会直接编辑的托管存储库。

git clone --mirror

传递 --mirror 参数也会隐式传递 --bare 参数。这意味着 --bare 的行为由 --mirror 继承。导致一个没有可编辑工作文件的裸代码存储库。此外,--mirror 将克隆远程存储库的所有扩展引用,并维护远程分支跟踪配置。然后您可以在镜像上运行 git remote 更新,它将覆盖原始代码存储库中的所有引用。为您提供精确的‘镜像’功能。

其他配置选项

有关其他 git clone 选项的完整列表,请访问官方 Git 文档。在本文档中,我们将介绍其他一些常用选项。

git clone --template

git clone --template=<template_directory> <repo location>

<repo location> 处克隆代码存储库,并将 <template directory> 中的模板应用到新创建的本地分支。有关 Git 模板的详尽参考,可以在我们的 git init 页面上找到。 

Git 网址

Git 有自己的网址语法,用于将远程存储库位置传递给 Git 命令。由于 git clone 最常用于远程存储库,因此我们将在此处研究 Git 网址语法。 

Git 网址协议

'-SSH

安全 Shell (SSH) 是一种使用非常普遍且经过身份验证的网络协议,通常在大多数服务器上默认配置。由于 SSH 是一种经过身份验证的协议,因此您需要在连接之前与托管服务器建立凭据。ssh://[user@]host.xz[:port]/path/to/repo.git/  

'- GIT

git 独有的协议。Git 附带了一个在端口 (9418) 上运行的守护进程。该协议与 SSH 类似,但它没有身份验证。git://host.xz[:port]/path/to/repo.git/  

'- HTTP

超文本传输协议。网页协议,最常用于通过互联网传输网页 HTML 数据。Git 可配置为通过 HTTP http[s]://host.xz[:port]/path/to/repo.git/ 进行通信  

摘要

在本文档中,我们深入研究了 git clone。最重要的要点是:

1. git clone 用于创建目标代码存储库的副本

2. 目标代码存储库可以是本地的也可以是远程的

3. Git 支持一些网络协议来连接到远程代码存储库

4. 有许多不同的配置选项可以变更克隆的内容  

要进一步了解 git clone 功能,请查阅官方 Git 文档。我们还在设置存储库指南中介绍了 git clone 的实际示例。

为您推荐

Bitbucket 博客

DevOps 学习路径

了解有关 Git 的更多信息

在此中心查找更多 Git 指南和资源。