git clone完整使用手册

git-clone - 将一个仓库克隆到一个新目录中

用法

bash 复制代码
git clone [--template=<模板目录>]
          [-l] [-s] [--no-hardlinks] [-q] [-n] [--bare] [--mirror]
          [-o <名称>] [-b <名称>] [-u <上传包>] [--reference <仓库>]
          [--dissociate] [--separate-git-dir <git目录>]
          [--depth <深度>] [--[no-]single-branch] [--no-tags]
          [--recurse-submodules[=<路径模式>]] [--[no-]shallow-submodules]
          [--[no-]remote-submodules] [--jobs <n>] [--sparse] [--[no-]reject-shallow]
          [--filter=<过滤器> [--also-filter-submodules]] [--] <仓库>
          [<目录>]

描述

将一个仓库克隆到一个新创建的目录中,为克隆的仓库中的每个分支创建远程跟踪分支(可通过git branch --remotes查看),并创建并检出一个从克隆仓库的当前活动分支派生的初始分支。

克隆完成后,一个没有参数的git fetch命令将更新所有远程跟踪分支,而一个没有参数的git pull命令还会将远程主分支合并到当前的主分支(如果指定了--single-branch,这不适用;参见下文)。

这种默认配置是通过在refs/remotes/origin下创建指向远程分支头的引用,并初始化remote.origin.url和remote.origin.fetch配置变量来实现的。

选项

-l, --local

当克隆的仓库位于本地机器上时,该标志绕过常规的"Git感知"传输机制,通过复制HEAD和objects与refs目录下的所有内容来克隆仓库。

如果仓库指定为本地路径(如/path/to/repo),这是默认行为,--local实质上没有作用。如果仓库是一个URL,则忽略此标志(并且不会使用本地优化)。

如果仓库的$GIT_DIR/objects包含符号链接或本身是符号链接,克隆将失败。此操作可防止通过解引用符号链接意外复制文件。

强制在本地文件系统上从仓库克隆时复制.git/objects目录下的文件,而不是使用硬链接。适用于需要备份仓库的情况。

-s, --shared

克隆时共享对象而不复制,结果仓库不会包含自己的对象。此操作有风险,可能导致数据丢失,建议谨慎使用。

--reference[-if-able] <仓库>

使用本地参考仓库共享对象,减少网络和存储消耗。

--dissociate

在克隆完成后停止借用参考仓库的对象,必要时复制借用的对象到本地。

-q, --quiet

静默操作,不输出进度。

-v, --verbose

详细输出。

--progress

强制显示进度状态。

-n, --no-checkout

克隆完成后不检出HEAD。

--bare

创建裸仓库,$GIT_DIR是<目录>本身,且不会检出工作树。

--mirror

设置镜像仓库,包含所有引用,并配置同步更新。

-o <名称>, --origin <名称>

自定义远程仓库名称,默认为origin。

-b <名称>, --branch <名称>

指定要检出的分支,或通过标签指定某个提交。

--depth <深度>

创建一个浅克隆,历史记录被截断为指定的提交数。

--shallow-since=<date>

创建一个浅克隆仓库,包含从指定时间点之后的历史记录。这可以减少克隆时拉取的提交数量。

--shallow-exclude=<revision>

创建一个浅克隆仓库,排除从指定远程分支或标签开始的提交记录。可以多次指定该选项以排除多个修订点的提交。

--[no-]single-branch

仅克隆指定分支(通过 --branch 选项指定,或默认指向远程仓库的主分支)的历史记录。此选项生成的仓库在后续获取更新时,仅更新该分支的远程跟踪分支。如果远程的 HEAD 不指向任何分支,则不会创建远程跟踪分支。

--no-tags

不克隆任何标签,并在配置中设置 remote.<remote>.tagOpt=--no-tags,确保后续的 git pull 和 git fetch 操作不会跟随任何标签。后续的显式标签获取仍然有效(详见 git-fetch(1))。此选项可以与 --single-branch 一起使用,以克隆并维护一个不包含其他引用的最小化分支仓库。这对于某些仓库的默认分支的搜索索引等用途非常有用。

--recurse-submodules[=<pathspec>]

在克隆完成后,初始化并克隆基于提供的 pathspec 的子模块。如果未提供 pathspec,则初始化并克隆所有子模块。该选项可多次使用以包含多个 pathspec。生成的克隆仓库的 submodule.active 配置为提供的 pathspec,如果没有提供则为 .(表示所有子模块)。

子模块会使用其默认设置初始化和克隆,等效于在克隆完成后立即运行 git submodule update --init --recursive <pathspec>。如果克隆的仓库没有工作区(即使用 --no-checkout/-n、--bare 或 --mirror 选项),则忽略此选项。

--[no-]shallow-submodules

将克隆的所有子模块设置为浅克隆,深度为 1。

--[no-]remote-submodules

所有克隆的子模块将使用子模块的远程跟踪分支状态进行更新,而非项目的记录 SHA-1。等效于向 git submodule update 传递 --remote。

--separate-git-dir=<git-dir>

将克隆的仓库放置在指定的目录中,而不是默认位置,并在目标位置创建指向该目录的文件系统无关 Git 符号链接。这样可以将 Git 仓库与工作树分离。

-j <n> / --jobs <n>

同时获取的子模块数量。默认值由 submodule.fetchJobs 配置选项决定。

<repository>

指定要克隆的仓库(可能是远程仓库)。有关指定仓库的更多信息,参见 GIT URLS 部分。

<directory>

指定要克隆到的新目录名称。如果未显式指定目录,则使用源仓库的 "humanish" 部分作为默认名称(例如 /path/to/repo.git 的名称为 repo,host.xz:foo/.git 的名称为 foo)。仅允许克隆到空目录中。

--bundle-uri=<uri>

在从远程仓库获取数据之前,从指定的 <uri> 获取一个 bundle,并将数据解压到本地仓库中。bundle 中的引用将存储在隐藏的 refs/bundle/* 命名空间中。此选项与 --depth、--shallow-since 和 --shallow-exclude 选项不兼容。

GIT URLS

通常情况下,URL 包含有关传输协议、远程服务器地址以及仓库路径的信息。根据传输协议的不同,某些信息可能会缺失。

Git 支持 ssh、git、http 和 https 协议(此外,也可以使用 ftp 和 ftps 来获取内容,但它们效率低下,已经被弃用;请不要使用它们)。

原生的传输方式(即 git:// URL)不进行身份验证,因此在不安全的网络环境中应谨慎使用。

以下语法可以与这些协议一起使用:

bash 复制代码
ssh://[user@]host.xz[:port]/path/to/repo.git/
git://host.xz[:port]/path/to/repo.git/
http[s]://host.xz[:port]/path/to/repo.git/
ftp[s]://host.xz[:port]/path/to/repo.git/

对于 ssh 协议,还可以使用类似 scp 的替代语法:

bash 复制代码
[user@]host.xz:path/to/repo.git/

此语法仅在第一个冒号前没有斜杠时才被识别。这有助于区分包含冒号的本地路径。例如,本地路径 foo:bar 可以指定为绝对路径或 ./foo:bar,以避免被误认为是 ssh URL。

ssh 和 git 协议还支持 ~username 扩展:

bash 复制代码
ssh://[user@]host.xz[:port]/~[user]/path/to/repo.git/
git://host.xz[:port]/~[user]/path/to/repo.git/
[user@]host.xz:/~[user]/path/to/repo.git/

对于 Git 原生支持的本地仓库,可以使用以下语法:

bash 复制代码
/path/to/repo.git/ 
file:///path/to/repo.git/

这两种语法基本等效,除了前者隐含了 --local 选项。

git clone、git fetch 和 git pull 命令也接受合适的 bundle 文件。参见 git-bundle(1)。

当 Git 不知道如何处理某个传输协议时,它会尝试使用 remote-<transport> 远程助手(如果存在)。要明确请求远程助手,可以使用以下语法:

bash 复制代码
<transport>::<address>

其中 <address> 可以是路径、服务器和路径或被特定远程助手识别的任意类似 URL 的字符串。详情请参阅 gitremote-helpers(7)。

如果有大量同名的远程仓库,且希望为它们使用不同的 URL 格式(即,您使用的 URL 会被重写为可用的 URL),您可以创建如下形式的配置部分:

bash 复制代码
[url "<actual url base>"] 
    insteadOf = <other url base>

例如,配置如下:

bash 复制代码
[url "git://git.host.xz/"]
    insteadOf = host.xz:/path/to/
    insteadOf = work:

此时,像 work:repo.git 或 host.xz:/path/to/repo.git 这样的 URL 将会在任何使用 URL 的上下文中被重写为 git://git.host.xz/repo.git。

如果您仅希望重写用于推送的 URL,可以创建如下形式的配置部分:

bash 复制代码
[url "<actual url base>"]
    pushInsteadOf = <other url base>

例如,配置如下:

bash 复制代码
[url "ssh://example.org/"]
    pushInsteadOf = git://example.org/

此时,像 git://example.org/path/to/repo.git 这样的 URL 将会在推送时被重写为 ssh://example.org/path/to/repo.git,但拉取时仍会使用原始 URL。

EXAMPLES 示例

从上游克隆:

bash 复制代码
$ git clone git://git.kernel.org/pub/scm/.../linux.git my-linux
$ cd my-linux
$ make

借助当前目录进行本地克隆,但不检查任何内容:

bash 复制代码
$ git clone -l -s -n . ../copy
$ cd ../copy
$ git show-branch

从上游克隆,同时借用现有的本地目录:

bash 复制代码
$ git clone --reference /git/linux.git \
        git://git.kernel.org/pub/scm/.../linux.git \
        my-linux
$ cd my-linux

创建一个裸仓库,用于将您的更改发布到公共场所:

bash 复制代码
$ git clone --bare -l /home/proj/.git /pub/scm/proj.git

CONFIGURATION 配置

从本节起,以下内容是从 git-config(1) 文档中选择性引用的。内容与 git-config(1) 文档中相同:

  • init.templateDir:指定将从哪个目录复制模板。(参见 git-init(1) 中的 "TEMPLATE DIRECTORY" 部分)
  • init.defaultBranch:允许覆盖默认分支名称,例如在初始化新仓库时。
  • clone.defaultRemoteName:克隆仓库时创建的远程仓库名称。默认为 origin,可以通过传递 --origin 命令行选项覆盖。
  • clone.rejectShallow:拒绝克隆一个浅仓库,可以通过命令行中的 --reject-shallow 选项覆盖。参见 git-clone(1)。
  • clone.filterSubmodules:如果提供了部分克隆过滤器(参见 git-rev-list(1) 中的 --filter),并且使用了 --recurse-submodules,则也将过滤器应用于子模块
相关推荐
和裕10 小时前
年度框架直供 vs 零散按需采购:定制纸箱采购成本、交付与服务核心区别全对比
大数据·运维·网络·人工智能·算法
具身AGI11 小时前
ARR还是交付量,物理AI 国产 的三种收入口径
大数据·人工智能
计算机源码社11 小时前
基于大数据技术的城市空气质量时序趋势与站点特征分析系统 面向监测站点的城市空气污染时空异质性分析与可视化系统
大数据·机器学习·数据挖掘·数据分析·毕业设计·课程设计·数据可视化
IT大白鼠11 小时前
搜索系列 · 第 07 篇——调优实战:写入、查询与监控
elasticsearch·nosql
AC赳赳老秦12 小时前
OpenClaw 数据引用规范自动生成:为公开数据构建可信来源标注与标准引用体系
大数据·开发语言·汇编·数据库·人工智能·deepseek·openclaw
乐迪信息12 小时前
AI防爆摄像机,监测港口船舶航行偏航隐患
大数据·人工智能·深度学习·算法·计算机视觉
西索斯coding12 小时前
grok-4.7 调用一直 429 怎么办?不是额度用完——是 RPM 和 TPM 双桶限流,附响应头读取代码和退避策略
大数据·人工智能·机器学习·ai
阿钱真强道13 小时前
课时00 嵌入式技术应用设计实训 | 开发环境搭建与开发板认识
git·hal库·keil·vs code·开发环境搭建·stm32f103·st-link
QYR-分析14 小时前
生物识别装备升级:全球全掌掌纹扫描仪市场格局与发展前景解析
大数据
蜗牛互联网14 小时前
从Barclays扩大Claude部署看受监管软件工程的责任重分配
java·大数据·人工智能·后端·软件工程