Setup and Config
Getting and Creating Projects
Basic Snapshotting
Branching and Merging
Sharing and Updating Projects
Inspection and Comparison
Patching
Debugging
External Systems
Server Admin
Guides
- gitattributes
- Command-line interface conventions
- Everyday Git
- Frequently Asked Questions (FAQ)
- Glossary
- Hooks
- gitignore
- gitmodules
- Revisions
- Submodules
- Tutorial
- Workflows
- All guides...
Administration
Plumbing Commands
-
2.49.0
2025-03-14
- 2.48.1 no changes
-
2.48.0
2025-01-10
- 2.47.1 → 2.47.2 no changes
-
2.47.0
2024-10-06
- 2.46.1 → 2.46.3 no changes
-
2.46.0
2024-07-29
- 2.45.1 → 2.45.3 no changes
-
2.45.0
2024-04-29
- 2.44.1 → 2.44.3 no changes
-
2.44.0
2024-02-23
- 2.43.1 → 2.43.6 no changes
-
2.43.0
2023-11-20
- 2.41.1 → 2.42.4 no changes
-
2.41.0
2023-06-01
- 2.38.1 → 2.40.4 no changes
-
2.38.0
2022-10-02
- 2.36.1 → 2.37.7 no changes
-
2.36.0
2022-04-18
- 2.35.1 → 2.35.8 no changes
-
2.35.0
2022-01-24
- 2.32.1 → 2.34.8 no changes
-
2.32.0
2021-06-06
- 2.30.2 → 2.31.8 no changes
-
2.30.1
2021-02-08
-
2.30.0
2020-12-27
- 2.29.1 → 2.29.3 no changes
-
2.29.0
2020-10-19
- 2.28.1 no changes
-
2.28.0
2020-07-27
- 2.27.1 no changes
-
2.27.0
2020-06-01
- 2.25.1 → 2.26.3 no changes
-
2.25.0
2020-01-13
- 2.23.1 → 2.24.4 no changes
-
2.23.0
2019-08-16
- 2.22.2 → 2.22.5 no changes
-
2.22.1
2019-08-11
-
2.22.0
2019-06-07
- 2.21.1 → 2.21.4 no changes
-
2.21.0
2019-02-24
- 2.18.1 → 2.20.5 no changes
-
2.18.0
2018-06-21
- 2.17.0 → 2.17.6 no changes
-
2.16.6
2019-12-06
- 2.15.4 no changes
-
2.14.6
2019-12-06
-
2.13.7
2018-05-22
- 2.12.5 no changes
-
2.11.4
2017-09-22
- 2.10.5 no changes
-
2.9.5
2017-07-30
-
2.8.6
2017-07-30
-
2.7.6
2017-07-30
- 2.4.12 → 2.6.7 no changes
-
2.3.10
2015-09-28
- 2.1.4 → 2.2.3 no changes
-
2.0.5
2014-12-17
概述
git clone [--template=<template-directory>] [-l] [-s] [--no-hardlinks] [-q] [-n] [--bare] [--mirror] [-o <name>] [-b <name>] [-u <upload-pack>] [--reference <repository>] [--dissociate] [--separate-git-dir <git-dir>] [--depth <depth>] [--[no-]single-branch] [--[no-]tags] [--recurse-submodules[=<pathspec>]] [--[no-]shallow-submodules] [--[no-]remote-submodules] [--jobs <n>] [--sparse] [--[no-]reject-shallow] [--filter=<filter-spec>] [--also-filter-submodules]] [--] <repository> [<directory>]
描述
将仓库克隆到新创建的目录中,为克隆仓库中的每个分支创建远程跟踪分支(使用 git branch --remotes
可见),并创建、签出从克隆仓库当前活动的分支派生的初始分支。
克隆后,执行不带参数的 git fetch
命令将更新所有远程跟踪的分支,执行不带参数的 git pull
命令将另把远程 master 分支合并到当前 master 分支(如果存在)(如果附加 --single-branch
参数,则情况不同;请参阅下文)。
通过在 refs/remotes/origin
下创建对远程分支头的引用,并通过初始化 remote.origin.url
和 remote.origin.fetch
配置变量来创建此默认配置。
选项
-
-l
-
--local
-
当要从中进行克隆的仓库位于本地计算机上时,此标志会绕过常规的 “Git 感知” 传输机制,并通过为
HEAD
以及对象和引用目录内的所有内容创建副本以克隆仓库。尽可能将.git / objects /
目录下的文件进行硬链接以节省空间。如果将存储库指定为本地路径(例如,
/path/to/repo
),--local
参数实质上是不起作用的。如果将仓库指定为 URL,则忽略此标志(不使用本地优化)。指定--no-local
将在给定/path/to/repo
时覆盖默认值,而使用常规 Git 传输方式。如果仓库的
$GIT_DIR/objects
有符号链接或者它就是符号链接,克隆将会失败。这是一项安全措施,以防止通过解读符号链接意外地复制文件。出于安全原因,此选项不适用于其他用户拥有的仓库,并且必须指定
--no-local
选项才能使克隆成功。注意:此操作可能会与源仓库的并发修改发生冲突,类似于在修改
<src>
时运行cp -r <src> <dst>
。 -
--no-hardlinks
-
从本地文件系统上的仓库进行克隆时,强制复制
.git / objects
目录下的文件,而不使用硬链接。如果您要备份仓库,则可能需要这样做。 -
-s
-
当要克隆的仓库位于本地计算机上时,不使用硬链接,而是自动设置
.git/objects/info/alternates
与源仓库共享对象。生成的仓库开始时没有其自己的任何对象。注意:这可能是一个危险的操作;除非你了解它的作用,否则*不要*使用它。如果使用该选项克隆源仓库,然后删除源仓库中的分支(或使用任何其他 Git 命令使现有提交不再被引用),一些对象可能会变得不再被引用(或悬空)。这些对象可能会被自动调用
git maintenance run --auto
的正常 Git 操作(如git commit
)移除。(参见 git-maintenance[1])如果这些对象被移除,并被克隆的版本库引用,那么克隆的版本库就会损坏。请注意,在使用
--shared
选项克隆的仓库中运行不带--local
选项的git repack
命令会将源仓库中的对象复制到克隆存储库中的包中,从而消除使用clone --shared
节省的磁盘空间。不过,运行git-gc
是安全的,它默认使用--local
选项。如果要断开用
--shared
克隆的仓库对其源仓库的依赖关系,只需运行git repack -a
即可将源仓库中的所有对象复制到克隆仓库中的一个包中。 -
--reference[-if-able] <仓库>
-
如果引用仓库位于本地计算机上,则自动设置
.git / objects / info / alternates
以从引用仓库重获取对象。使用现有的仓库作为备用仓库,则将需要从要克隆的仓库中复制较少的对象,从而降低了网络和本地存储成本。当使用--reference-if-able
时,不存在的目录会被警告跳过,而不是中止克隆。注意:请参阅
--shared
选项的注释,以及--dissociate
选项。 -
--dissociate
-
从用
--reference
选项指定的引用仓库中借用对象仅是为了减少网络传输,并在克隆后通过制作借用对象的必要本地副本来停止从对象借用。当从已经从另一个仓库借用对象的存储库进行本地克隆时,也可以使用此选项:新仓库将从同一个仓库借用对象,并且该选项可用于停止借用。 -
-q
-
--quiet
-
静默操作。进度不会报告给标准错误流。
-
-v
-
--verbose
-
冗余运行。不影响向标准错误流报告进度状态。
-
--progress
-
默认情况下,附加到终端时,会将进度状态报告给标准错误流,除非指定了
--quiet
选项。即使标准错误流未定向到终端,该标志也会强制显示进度状态。 -
--server-option=<选项>
-
使用协议版本2进行通信时,将给定的字符串传输到服务器。给定的字符串不得包含NUL或LF字符。服务器对服务器选项(包括未知选项)的处理是取决于服务器。当给出多个`--server-option=<选项>
时,它们都按照命令行中列出的顺序发送到另一端。当从命令行没有提供 ++--server-option=++__<option>__ 参数时,将使用配置变量 `remote.<名称>.serverOption
的值代替。 -
-n
-
--no-checkout
-
克隆完成后,不执行
HEAD
检出操作。 -
--
[no-
]reject-shallow
-
如果源仓库是一个浅层仓库,则失败。
clone.rejectShallow
配置变量可以用来指定默认值。 -
--bare
-
创建一个 ‘裸’ Git 仓库。也就是说,不要创建 <目录> 并将管理文件放在
<目录>/.git
,而是将 <目录> 本身设为$GIT_DIR
。这显然暗含着--no-checkout
选项,因为没有地方可以检出工作目录树。此外,远程的分支头直接复制到相应的本地分支头,而不将它们映射到refs/remotes/origin/
。使用此选项时,不会创建远程跟踪分支或相关配置变量。 -
--sparse
-
使用稀疏检出(sparse-checkout),最初只检出顶层目录中的文件。 git-sparse-checkout[1] 命令可根据需要扩大工作目录。
-
--filter=<过滤规范>
-
使用部分克隆功能,要求服务器根据给定的对象过滤器发送一个可到达的对象的子集。当使用
--filter
选项时,提供的 <过滤规则> 将被用于部分克隆过滤器。例如,--filter=blob:none
将过滤掉所有的数据对象(文件内容),直到 Git 需要相应的数据。另外,--filter=blob:limit=<大小>
将过滤掉所有文件大小至少为 <大小> 的数据对象。关于过滤器定义的更多细节,请参阅 git-rev-list[1] 中的--filter
选项。 -
--also-filter-submodules
-
同时对仓库中的任何子模块应用部分克隆过滤器。 需要
--filter
和--recurse-submodules
。这可以通过设置clone.filterSubmodules
配置项来默认开启。 -
--mirror
-
建立源存储库的镜像。这默认包含
--bare
选项。与--bare
相比,--mirror
不仅将源的本地分支映射到目标的本地分支,还映射所有引用(包括远程跟踪分支,注释等)并设置了引用规范,因而在目标仓库中执行git remote update
时,所有这些引用都会被覆盖。 -
-o
<名称> -
--origin
<名称> -
不使用远程名称
origin
来跟踪远程仓库,而使用 <名称> 值。 这会覆盖配置中clone.defaultRemoteName
的设置。 -
-b
<分支名> -
--branch
<分支名> -
不将新创建的
HEAD
指向克隆仓库的HEAD
所指向的分支,而是指向 <分支名> 分支。在非裸仓库中,这是将被检出的分支。--branch
也可以使用标签并在生成的仓库中的提交时分离HEAD
。 -
--revision=<rev>
-
Create a new repository, and fetch the history leading to the given revision <rev> (and nothing else), without making any remote-tracking branch, and without making any local branch, and detach
HEAD
to <rev>. The argument can be a ref name (e.g.refs/heads/main
orrefs/tags/v1.0
) that peels down to a commit, or a hexadecimal object name. This option is incompatible with--branch
and--mirror
. -
-u
<上传包> -
--upload-pack
<上传包> -
如果指定了要克隆的仓库,且可以通过 ssh 访问该仓库,这将为另一端运行的命令指定非默认路径。
-
--template=<模板目录>
-
指定将使用模板的目录;(请参阅 git-init[1] 的 “模板目录” 部分。)
-
-c
<键>=<值>
-
--config
<键>=<值>
-
在新创建的仓库中设置配置变量;这将在初始化仓库之后、获取远程历史记录或签出任何文件之前立即生效。密钥的格式与 git-config[1] 期望的格式相同(例如,
core.eol = true
)。如果为同一 <键> 指定了多个值,则每个值都将写入配置文件。例如,这可以安全地将其他抓取引用规则添加到源远程仓库。由于当前实现方式的限制,某些配置变量要等到初始获取和签出后才能生效。已知不会生效的配置变量有:
remote.<名称> .mirror
和remote.<名称> .tagOpt
。如要修改,应改用相应的--mirror
和--no-tags
选项。 -
--depth <深度>
-
创建一个历史记录被截断为指定提交次数的 ‘浅’ 克隆。暗含
--single-branch
选项,除非给出--no-single-branch
来获取所有分支顶端附近的历史记录。如果要浅层克隆子模块,还可以使用--shallow-submodules
选项。 -
--shallow-since=<日期>
-
创建浅克隆,只包含指定的时间之后的历史记录。
-
--shallow-exclude=<引用>
-
创建一个有历史的浅克隆,不包含可以被指定远程分支或标签访问的提交。本选项可以使用多次。
-
--[no-]single-branch
-
仅克隆直到单一分支末尾的历史,该分支被
--branch
选项或主分支远程HEAD
指定。被创建仓库之后的抓取将只更新在克隆时被指定的远程跟踪分支。如果在--single-branch
克隆时,远程 HEAD 未指向任何分支,则不会创建远程跟踪分支。 -
--[no-]tags
-
Control whether or not tags will be cloned. When
--no-tags
is given, the option will be become permanent by setting theremote.<remote>.tagOpt=--no-tags
configuration. This ensures that futuregit pull
andgit fetch
won’t follow any tags. Subsequent explicit tag fetches will still work (see git-fetch[1]).By default, tags are cloned and passing `--tags` is thus typically a no-op, unless it cancels out a previous `--no-tags`.
可以与
--single-branch
结合使用,以克隆和维护除单个克隆分支外没有其他引用的分支。这在例如维护某些仓库的默认分支的最小克隆以进行搜索索引时有用。 -
--recurse-submodules[=<路径规范>]
-
创建克隆后,根据提供的 <路径规范> 初始化并克隆其中的子模块。如果未提供
=<路径规范>
,则将初始化并克隆所有子模块。对于由多个条目组成的路径规范,可以多次赋予此选项。生成的克隆将把submodule.active
设为提供的路径规范。如果未提供路径规范,生成的克隆将把submodule.active
设为 ".
" (表示所有子模块)。子模块使用其默认设置进行初始化和克隆。这等效于克隆完成后立即运行
git submodule update --init --recursive <路径规范>
。如果克隆的仓库没有工作区/检出(即给出了--no-checkout
/-n
,--bare
或 `--mirror`中的任何一个选项),则忽略此选项 -
--[no-]shallow-submodules
-
所有克隆的子模块都将是浅克隆,深度为 1。
-
--[no-]remote-submodules
-
克隆的所有子模块将使用子模块的远程跟踪分支的状态来更新子模块,而不是超级项目的已记录 SHA-1。等同于将
--remote
传递给git submodule update
。 -
--separate-git-dir=<Git 目录>
-
不将克隆的仓库放置在原处,而是将克隆的仓库放置在指定的目录中,然后在此处建立与文件系统无关的 Git 符号链接。这可以将 Git 仓库与工作区分离。
-
--ref-format=<引用格式>
-
指定存储库的给定引用存储格式。有效值为:
-
files
选项用于处理未打包的文件和打包的引用关系。这是默认的配置方式。 -
reftable
用于 reftable 格式。这种格式是试验性的,其内部结构可能会发生变化。
-
-
-j
<n> -
--jobs
<n> -
同时抓取的子模块数。默认为
submodule.fetchJobs
选项。 - <仓库>
-
要克隆的(可能是远程的)<仓库>。有关指定仓库的更多信息,参阅下面的 GIT 地址 部分。
- <目录>
-
要克隆到的新目录的名称。如果未明确指定 <目录>,则使用源仓库中的 “人性化” 部分(对于
/path/to/repo.git
而言,为repo
;对于host.xz:foo/.git
而言,为foo
)。仅当目录为空时才允许克隆到现有目录。 -
--bundle-uri=<uri>
-
在从远程获取之前,从给定的 <uri> 中获取一个捆绑包,并将数据解绑到本地仓库中。捆绑包中的引用将被存储在隐藏的
refs/bundle/*
命名空间下。该选项不与--depth
、--shallow-since
、--shallow-exclude
兼容。
GIT 地址
通常,地址包含有关传输协议,远程服务器的地址以及仓库路径的信息。对于某些传输协议,一些信息可能会缺失。
Git 支持 ssh,git,http 和 https 协议(此外,可以使用 ftp 和 ftps 进行抓取,但这效率低下且不建议使用;请勿使用)。
本地传输(即 git://
地址)不进行身份验证,在不安全的网络上应谨慎使用。
以下是上述几个传输协议的格式:
-
ssh://[<user>@]<host>[:<port>]/<path-to-git-repo>
-
git://<主机地址>[:<端口>]/<Git 仓库路径>
-
http[s]://<主机地址>[:<端口>]/<Git 仓库路径>
-
ftp[s]://<主机地址>[:<端口>]/<Git 仓库路径>
ssh 协议也可以使用类似 scp 的语法:
-
[<用户名>@]<主机地址>:/<Git 仓库路径>
仅当第一个冒号之前没有斜杠时才能识别此语法。这有助于区分包含冒号的本地路径。例如,可以将本地路径 foo:bar
指定为绝对路径,或者将 ./foo:bar
指定为绝对路径,以避免被误识别为 ssh url。
ssh 和 git 协议还支持 ~<用户名>
扩展:
-
ssh://[<user>@]<host>[:<port>]/~<user>/<path-to-git-repo>
-
git://<主机地址>[:<端口>]/~<用户名>/<Git 仓库路径>
-
[<用户名>@]<主机地址>:~<用户名>/<Git 仓库路径>
对于本地仓库(Git 本身也支持),可以使用以下语法:
-
/path/to/repo.git/
-
file:///path/to/repo.git/
These two syntaxes are mostly equivalent, except the former implies --local
option.
git clone
、git fetch
和 git pull
(但不包括 git push
)也会接受合适的捆绑包文件。参见 git-bundle[1]。
当 Git 不知道如何处理某种传输协议时,它会尝试使用 remote-<传输方式>
远程帮助程序(如果存在)。要显式请求远程帮助程序,可以使用以下语法:
-
<传送>::<地址>
其中,<地址> 可以是路径,服务器与路径,也可以是可被调用的特定远程帮助程序识别的类似于网页地址的任意字符串。有关详细信息,请参阅 gitremote-helpers[7]。
如果存在大量类似名称的远程仓库,并且您要为其使用不同的格式(这样,您使用的地址将被重写为有效的地址),则可以创建以下形式的配置:
[url "<实际基础网址>"] insteadOf = <其他基础网址>
例如,有如下:
[url "git://git.host.xz/"] insteadOf = host.xz:/path/to/ insteadOf = work:
诸如 "work:repo.git" 或 "host.xz:/path/to/repo.git" 的地址会在任何类似于 "git://git.host.xz/repo" 地址的上下文中重写。
如果要重写仅用于推送的地址,可以创建表单的配置部分:
[url <实际基础网址>"] pushInsteadOf = <其他基础网址>
例如,有如下:
[url "ssh://example.org/"] pushInsteadOf = git://example.org/
类似于 "git://example.org/path/to/repo.git" 的地址会被重写为 "ssh://example.org/path/to/repo.git",用于推送。但拉取代码时仍然使用原始的地址。
实例
-
从上游仓库克隆:
$ git clone git://git.kernel.org/pub/scm/.../linux.git my-linux $ cd my-linux $ make
-
制作一个从当前目录借用的本地克隆,而无需进行检出:
$ git clone -l -s -n . ../copy $ cd ../copy $ git show-branch
-
从上游仓库克隆时借用本地目录:
$ git clone --reference /git/linux.git \ git://git.kernel.org/pub/scm/.../linux.git \ my-linux $ cd my-linux
-
创建一个裸仓库,以将您的更改发布给公众:
$ git clone --bare -l /home/proj/.git /pub/scm/proj.git
-
克隆一个不同用户的本地仓库:
$ git clone --no-local /home/otheruser/proj.git /pub/scm/proj.git
配置
本节中这一行以下的内容都是从 git-config[1] 文档中摘录的。其内容与那里的内容相同:
Warning
|
Missing See original version for this content. |
Warning
|
Missing See original version for this content. |
GIT
属于 git[1] 文档