git克隆帮助页面有这样说——mirror:

设置远程存储库的镜像。这意味着——裸露。

但没有详细说明——mirror克隆与——bare克隆的不同之处。


当前回答

我添加了一张图片,显示镜像和裸之间的差异。 左边是光秃秃的,右边是镜子。你可以清楚,镜像的配置文件有fetch key,这意味着你可以通过git remote update或git fetch——all来更新它

其他回答

我今天对git-2.0.0的测试表明——mirror选项没有复制钩子、配置文件、描述文件、info/exclude文件,至少在我的测试用例中没有复制一些引用(我不理解)。我不会称它为“功能完全相同的副本,可以与原件互换”。

-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

我添加了一张图片,显示镜像和裸之间的差异。 左边是光秃秃的,右边是镜子。你可以清楚,镜像的配置文件有fetch key,这意味着你可以通过git remote update或git fetch——all来更新它

一个克隆复制的裁判从远程和stuff他们到一个子目录名为“这些是裁判,远程拥有”。

镜像从远程复制裁判,并把他们放在自己的顶级-它替换自己的裁判与那些远程。

这意味着当有人从你的镜像中提取并将镜像的引用放入他们的子目录时,他们将得到与原始镜像相同的引用。从最新镜像中获取的结果与直接从初始回购中获取的结果相同。

$ git clone --bare https://github.com/example

这个命令将使新的“example”目录本身为$GIT_DIR(而不是example/.git)。同样,远程的分支头被直接复制到相应的本地分支头,而不需要映射。使用此选项时,既不会创建远程跟踪分支,也不会创建相关配置变量。

$ git clone --mirror https://github.com/example

与裸克隆一样,镜像克隆包括所有远程分支和标记,但所有本地引用(包括远程跟踪分支、注释等)在每次获取时都将被覆盖,因此它将始终与原始存储库相同。

与git clone不同,git clone -mirror和git clone -bare都是裸回购。它们之间的区别在配置文件中。

Git克隆的配置文件如下所示:

[remote "origin"]
    url = https://github.com/example
    fetch = +refs/heads/*:refs/remotes/origin/*

Git克隆——bare的配置文件如下所示:

[remote "origin"]
    url = https://github.com/example

Git克隆——镜像的配置文件如下:

[remote "origin"]
    url = https://github.com/example
    fetch = +refs/*:refs/*
    mirror = true

我们看到,主要的区别在于用于取回的refspec

refspec的格式首先是一个可选的+,然后是 <src>:<dst>,其中<src>是在 远端和<dst>是跟踪这些引用的地方 本地。+告诉Git更新引用,即使它不是 快进。

对于由git remote add origin命令自动写入的git克隆,git获取服务器上refs/heads/下的所有引用,并将它们写到refs/remotes/origin/ local。

在git clone -bare的情况下,没有refspec用于抓取。

对于git clone——mirror,用于抓取的refspec看起来像fetch = +refs/*:refs/*。这意味着,标签,remotes, replace(在refs目录下)以及头部也将被获取。注意,默认情况下,git克隆只获取头部。

注1:git clone——mirror和git clone——bare——mirror是等价的。

注2:也有不同的包装参考。因为它记录的信息与refs/heads/, refs/tags/和好友记录的信息相同,以一种更有效的方式记录。