什么';git clone(镜像)和git clone(裸机)之间的区别是什么
git clone帮助页面上有这样一句话,关于什么';git clone(镜像)和git clone(裸机)之间的区别是什么,git,git-clone,Git,Git Clone,git clone帮助页面上有这样一句话,关于--mirror: 设置远程存储库的镜像。这意味着--bare 但是没有详细说明--mirror克隆与--bare克隆有何不同 $ git clone --mirror $URL 是的缩写 $ git clone --bare $URL $ (cd $(basename $URL) && git remote add --mirror=fetch origin $URL) (直接复制自) 当前手册页的内容: 与--bare相比,-
--mirror
:
设置远程存储库的镜像。这意味着--bare
但是没有详细说明--mirror
克隆与--bare
克隆有何不同
$ git clone --mirror $URL
是的缩写
$ git clone --bare $URL
$ (cd $(basename $URL) && git remote add --mirror=fetch origin $URL)
(直接复制自)
当前手册页的内容:
与--bare
相比,--mirror
不仅将源的本地分支映射到目标的本地分支,还映射所有ref(包括远程分支、注释等),并设置refspec配置,以便所有这些ref都被目标存储库中的git remote update
覆盖
不同之处在于,当使用
--mirror
时,所有引用都按原样复制。这意味着一切:远程跟踪分支、注释、refs/originals/*(来自筛选器分支的备份)。克隆回购拥有一切。它还设置为远程更新将从源重新获取所有内容(覆盖复制的引用)。这个想法实际上是镜像存储库,拥有一个完整的副本,例如,您可以在多个位置托管您的中央回购,或者对其进行备份。考虑一下直接复制回购协议,除了以更优雅的git方式
新的报告几乎说明了这一切:
--镜像
设置源存储库的镜像。这意味着--bare
。与--bare
相比,--mirror
不仅将源的本地分支映射到目标的本地分支,还映射所有ref(包括远程分支、注释等),并设置refspec配置,以便所有这些ref都被目标存储库中的git remote update
覆盖
我最初的回答还指出了裸克隆和普通(非裸)克隆之间的区别——非裸克隆设置远程跟踪分支,只为头创建本地分支,而裸克隆直接复制分支
假设origin有几个分支(master(HEAD)
,next
,pu
,和maint
),一些标记(v1
,v2
,v3
),一些远程分支(devA/master
,devB/master
),以及一些其他引用(refs/foo/bar
,refs/foo/baz
,可能是便笺、藏书、其他开发者的名称空间,谁知道呢)
git克隆源url
(非裸):您将获得复制的所有标记,一个本地分支主机(HEAD)
跟踪远程分支origin/master
、远程分支origin/next
、origin/pu
、和origin/maint
。设置跟踪分支的目的是,如果您执行类似于git fetch origin
的操作,它们将按照您的预期进行获取。任何远程分支(在克隆的远程分支中)而其他参考文献则完全被忽略
git clone——裸源url
:您将复制所有标记,本地分支master(HEAD)
、next
、pu
和maint
,没有远程跟踪分支。也就是说,所有分支都按原样复制,并且设置完全独立,不需要再次获取。任何远程分支(在克隆的远程中)和其他引用都被完全忽略
git clone--镜像源url
:这些引用中的每一个都将按原样复制。您将获得所有标记、本地分支主(头)
、next
、pu
、和maint
、远程分支devA/master
和devB/master
、其他refsrefs/foo/bar
和refs/foo/baz
。所有内容都与克隆远程中的内容一模一样。远程跟踪设置为,如果您运行git remote update
,所有refs都将在将从原始位置被覆盖,就好像您刚刚删除了镜像并将其重新锁定。正如文档最初所说,它是一个镜像。它应该是功能相同的副本,可以与原始版本互换
-bash-3.2$ git --version
git version 2.0.0
-bash-3.2$ git clone --mirror /git/hooks
Cloning into bare repository 'hooks.git'...
done.
-bash-3.2$ diff --brief -r /git/hooks.git hooks.git
Files /git/hooks.git/config and hooks.git/config differ
Files /git/hooks.git/description and hooks.git/description differ
...
Only in hooks.git/hooks: applypatch-msg.sample
...
Only in /git/hooks.git/hooks: post-receive
...
Files /git/hooks.git/info/exclude and hooks.git/info/exclude differ
...
Files /git/hooks.git/packed-refs and hooks.git/packed-refs differ
Only in /git/hooks.git/refs/heads: fake_branch
Only in /git/hooks.git/refs/heads: master
Only in /git/hooks.git/refs: meta
克隆从远程复制引用,并将其填充到名为“这些是远程拥有的引用”的子目录中
镜像从远程设备复制参照并将其放入自己的顶层-它将用远程设备的参照替换自己的参照
这意味着,当有人从您的镜像中提取镜像的引用并将其填充到其子目录中时,他们将获得与原始镜像相同的引用。从最新镜像获取的结果与直接从初始repo获取的结果相同。我今天使用git-2.0.0进行的测试表明--mirror选项不可用y钩子、配置文件、描述文件、信息/排除文件,以及至少在我的测试用例中的一些引用(我不理解)。我不会称之为“功能相同的副本,可以与原始版本互换。”
GitHub文档中关于以下内容的细微解释:
与裸克隆一样,镜像克隆包括所有远程分支和标记,但每次获取时都会覆盖所有本地引用,因此它将始终与原始存储库相同
我添加了一张图片,显示镜像和裸机之间的差异。
左边是空的,右边是镜像。您可以清除,镜像的配置文件有fetch
键,这意味着您可以通过git remote update
或git fetch--all
$ git clone --bare https://github.com/example
此命令将使新的“example
”目录本身成为$GIT_DIR(而不是example/.GIT
)。此外,远程分支头直接复制到相应的本地分支头,而不进行映射。使用此选项时,远程跟踪分支和相关配置变量都不会
$ git clone --mirror https://github.com/example