Close

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 分支

Bitbucket 徽标
查看解决方案

了解 Bitbucket Cloud 的 Git

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 的实际示例。


分享此文章
下一主题

推荐阅读

将这些资源加入书签,以了解 DevOps 团队的类型,或获取 Atlassian 关于 DevOps 的持续更新。

人们通过满是工具的墙进行协作

Bitbucket 博客

Devops 示意图

DevOps 学习路径

与 Atlassian 专家一起进行 Den 功能演示

Bitbucket Cloud 与 Atlassian Open DevOps 如何协同工作

注册以获取我们的 DevOps 新闻资讯

Thank you for signing up