git clone –mirror和git clone –bare有什么区别?

git克隆帮助页面有这个说--mirror

设置远程存储库的镜像。 这意味着 – --bare

但是并没有详细讨论--mirror clone和--mirror clone是不同的。

不同之处在于,在使用--mirror所有引用都按原样复制。 这意味着一切:远程跟踪分支,注释,参考/原件/ *(从filter分支备份)。 克隆回购有这一切。 它也被设置,以便远程更新将重新从原点获取所有内容(覆盖复制的裁判)。 这个想法是真正的镜像库,有一个完整的副本,所以你可以举例来说,你的中央回购在多个地方,或备份。 想想直接复制回购,除了在一个更优雅的Git方式。

新的文档很多说这一切:

--mirror

设置源代码库的镜像。 这意味着 – --bare 。 与--bare相比,– --mirror不仅将源的本地分支映射到目标的本地分支,还映射所有的引用(包括远程分支,注释等),并build立一个refspecconfiguration,使得所有这些引用都被覆盖通过目标存储库中的git remote update

我原来的回答也注意到了裸克隆和普通(非裸)克隆之间的区别 – 非裸克隆设置远程跟踪分支,只为HEAD创build本地分支,而裸克隆直接复制分支。

假设原点有几个分支( master (HEAD)nextpumaint ),一些标签( v1v2v3 ),一些远程分支( devA/masterdevB/master )和一些其他的refs( refs/foo/barrefs/foo/baz ,这可能是笔记,寄存器,其他开发人员的命名空间,谁知道)。

  • git clone origin-url (non-bare):你将得到所有被复制的标签,一个本地分支master (HEAD)跟踪一个远程分支的origin/master ,远程分支的origin/nextorigin/puorigin/maint 。 跟踪分支的设置是这样的,如果你做了像git fetch origin这样的东西,他们会像你期望的那样被抓取。 任何远程分支(在克隆的远程)和其他参考被完全忽略。

  • git clone --bare origin-url :你将得到所有被复制的标签,本地分支master (HEAD)nextpumaint ,没有远程跟踪分支。 也就是说,所有分支都是按照原样复制的,而且它的设置完全独立,不需要再次获取。 任何远程分支(在克隆的远程)和其他参考被完全忽略。

  • git clone --mirror origin-url :这些ref中的最后一个将被原样复制。 你将得到所有的标签,本地分支master (HEAD)nextpumaint ,远程分支devA/masterdevB/master ,其他refs refs/foo/barrefs/foo/baz 。 一切都和克隆的遥控器一样。 远程跟踪设置,所以如果你运行git remote update所有refs将被覆盖从原点,就像你刚刚删除镜像和recloned它。 正如文件最初所说,这是一面镜子。 它应该是一个function完全相同的副本,可以与原始文件互换。

 $ git clone --mirror $URL 

是一个短暂的

 $ git clone --bare $URL $ (cd $(basename $URL) && git remote add --mirror=fetch origin $URL) 

(从这里直接复制)

目前的手册页如何说明:

--bare相比,– --mirror不仅将源的本地分支映射到目标的本地分支,还映射所有的引用(包括远程分支,注释等),并build立一个refspecconfiguration,使得所有这些引用都被覆盖通过目标存储库中的git remote update

我今天用git-2.0.0进行的testing表明,–mirror选项不会复制钩子,configuration文件,描述文件,info / exclude文件,至less在我的testing用例中有几个参考文献我不会把它称为“function完全相同的副本,可以与原始文件互换”。

 -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 

克隆从远程复制refs并将其填充到名为“这些是远程拥有的refs”的子目录中。

镜像从远程复制refs并把它们放到它自己的顶层 – 它用远程的替代它自己的refs。

这意味着当有人从你的镜子中拉出镜子的参考文件到他们的子目录时,他们将获得与原文相同的参考文献。 从最新的镜像获取的结果与直接从最初的仓库获取的结果相同。

GitHub文档中关于复制存储库的细微说明:

与裸副本一样,镜像克隆包含所有远程分支和标签,但是每次获取时,所有本地引用都将被覆盖,因此它总是与原始存储库相同。

我添加一个图片,显示镜像和裸设置之间的区别。 在这里输入图像说明 左边是光秃的,右边是镜子。 你可以清楚,镜像的configuration文件有fetch密钥,这意味着你可以更新它,通过git remote updategit fetch --all