git clone --mirror和git clone --bare有什么区别


486

git clone帮助页面上有这句话 --mirror如下:

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

但没有详细介绍--mirror克隆与克隆之间的区别--bare


3
很有帮助,但是如果您还想将此镜像推送到github之类的远程存储库,我会发现此链接很方便。
2014年

Answers:


568

区别在于,使用时--mirror所有 ref均按原样复制。这意味着一切:远程跟踪分支,注释,参考/原始文件/ *(来自过滤分支的备份)。克隆的回购包含所有内容。还进行了设置,以便远程更新将从源重新获取所有内容(覆盖复制的引用)。这个想法实际上是镜像存储库,以拥有总副本,以便例如可以在多个位置托管中央存储库或对其进行备份。除了以一种更为优雅的git方法外,您还可以考虑直接复制存储库。

文档几乎说明了所有这些:

--mirror

设置源存储库的镜像。这意味着--bare。与相比--bare--mirror不仅将源的本地分支映射到目标的本地分支,还映射所有ref(包括远程分支,注释等)并设置refspec配置,以便所有这些ref被git remote update目标存储库中的a覆盖。。

我的原始答案还指出了裸克隆和普通(非裸)克隆之间的区别-非裸克隆设置了远程跟踪分支,仅为创建了本地分支HEAD,而裸克隆直接复制了分支。

假设起源有几个分支(master (HEAD)nextpumaint),一些标签(v1v2v3),一些远程分支机构(devA/masterdevB/master),以及其他一些裁判(refs/foo/barrefs/foo/baz,这可能是笔记,储物箱,其他开发者的命名空间,谁知道)。

  • git clone origin-url(非裸):您将得到所有复制的标签,一个本地分支master (HEAD)追踪远程分支origin/master和远程分支origin/nextorigin/puorigin/maint。设置了跟踪分支,因此,如果您执行诸如此类的操作git fetch origin,则将按您期望的方式提取它们。任何远程分支(在克隆的远程中)和其他引用都将被完全忽略。

  • git clone --bare origin-url您将获得全部复制的标签,地方分支机构master (HEAD)nextpu,和maint,没有远程跟踪分支。也就是说,所有分支均按原样复制,并且设置为完全独立,不希望再次获取。任何远程分支(在克隆的远程中)和其他引用都将被完全忽略。

  • git clone --mirror origin-url这些参考中的最后一个都会原样复制。你会得到所有的标签,地方分支机构master (HEAD)nextpu,和maint,远程分支机构devA/masterdevB/master其他裁判refs/foo/barrefs/foo/baz。一切都与克隆的遥控器完全相同。设置了远程跟踪,因此,如果您运行git remote update所有引用,将从原始位置覆盖所有引用,就好像您刚刚删除镜像并将其重新克隆一样。正如文档最初所说的,它是一面镜子。它应该是功能相同的副本,可以与原始副本互换。


“正常克隆”是指没有--bare或--mirror标志的克隆吗?
山姆

1
是的,确实如此。就像手册页上所说的那样,使用裸露的克隆,分支也直接被复制(没有引用/远程处理/起源,没有跟踪)。编辑英寸
Cascabel

您能否添加更多有关差异的用法示例,而不仅仅是git-internal差异?
cmcginty 2010年

@Casey是您要找的东西吗?我根本不认为我最初写的是“内部的”-标签和树枝是很多瓷器特征。
卡斯卡贝尔

“按原样复制分支”是否意味着将分支复制到克隆上的相同相对路径?还是意味着分支以某种方式进行了转换?
山姆

56
$ 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目标存储库中的a覆盖。。


4
我相信您必须遵循一个git fetch,这样它才能完全相同。无论如何,这是一种无法解决的问题-问题的关键是“镜像远程/克隆与普通镜像远程/克隆有何不同?”
卡斯卡贝尔

6
我实际上喜欢这种展示差异的方式。希望它是准确的!我希望hfs添加fetch命令。
joeytwiddle

真不明白,比如什么是$(基名$ URL)翻译成等
Kzqai

5
basename是普通的unix实用程序,用于剥离路径的目录部分,并且$()只是bash的命令替换。
Victor Zamanian

6
这仍然存在--mirror。如果它解释了什么git remote add --mirror,这将是一个可以接受的答案。
Zenexer 2014年

24

我今天使用git-2.0.0进行的测试表明--mirror选项不会复制钩子,配置文件,描述文件,信息/排除文件,至少在我的测试用例中是一些引用(我不这样做)不能理解。)我不会将其称为“功能相同的副本,可以与原始副本互换”。

-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

14

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

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


1
谢谢; 这为我澄清了使用镜像克隆将覆盖本地标签以及分支。非常有帮助。
2015年

2
您可能还想--prune在运行git fetch时使用以删除不再在远程上的本地引用。
nishanths

13

克隆将从远程服务器复制参考,并将其填充到名为“这些是远程服务器具有的参考”的子目录中。

镜像从远程复制参考,并将其放入自己的顶层-用远程替换其自身的参考。

这意味着,当有人从您的镜像中拉出并将镜像的ref塞入其子目录时,他们将获得与原始镜像相同的ref。从最新镜像中获取的结果与直接从初始存储库中获取的结果相同。


12

我添加了图片,显示config了镜子和裸露眼镜之间的区别。 在此处输入图片说明 左边是裸露的,右边是镜子。您可以清除,镜像的配置文件具有fetch密钥,这意味着您可以通过git remote updategit fetch --all


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

此命令将使新的本身成为$ GIT_DIR。而且,远程的分支头直接复制到相应的本地分支头,而无需映射。使用此选项时,不会创建远程跟踪分支或相关的配置变量。

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.