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.urlremote.origin.fetch配置变量来实现的。

选项

-l, --local

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

如果仓库指定为本地路径(如/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 pullgit 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 的名称为 repohost.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 clonegit fetchgit 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.githost.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,则也将过滤器应用于子模块
相关推荐
好好沉淀5 小时前
ide进去git突然报Cannot identify version of git executable: no response的错误
git
RunningShare6 小时前
千万级用户电商平台,Flink实时推荐系统如何实现毫秒级延迟?
大数据·flink·推荐系统·ab测试
INFINI Labs7 小时前
如何使用 INFINI Gateway 对比 ES 索引数据
大数据·elasticsearch·gateway·easysearch
宇宙超级无敌霸王龙捏8 小时前
Git 分支完整操作指南
git
学编程的小鬼11 小时前
git 中常用的命令
git
他们叫我技术总监12 小时前
外企 BI 工具选型:从合规到落地
大数据·bi
小黄酥12 小时前
Sourcetree克隆/获取gitee工程,Git获取SSH密钥
git·gitee·github
Lansonli13 小时前
大数据Spark(六十七):Transformation转换算子distinct和mapValues
大数据·分布式·spark
RunningShare14 小时前
基于Flink的AB测试系统实现:从理论到生产实践
大数据·flink·ab测试
小Lu的开源日常14 小时前
踩坑日记:为什么 .gitignore 不起作用了
git·代码规范·trae