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)
, next
, pu
和maint
),一些标签( v1
, v2
, v3
),一些远程分支( devA/master
, devB/master
)和一些其他的refs( refs/foo/bar
, refs/foo/baz
,这可能是笔记,寄存器,其他开发人员的命名空间,谁知道)。
-
git clone origin-url
(non-bare):你将得到所有被复制的标签,一个本地分支master (HEAD)
跟踪一个远程分支的origin/master
,远程分支的origin/next
,origin/pu
,origin/maint
。 跟踪分支的设置是这样的,如果你做了像git fetch origin
这样的东西,他们会像你期望的那样被抓取。 任何远程分支(在克隆的远程)和其他参考被完全忽略。 -
git clone --bare origin-url
:你将得到所有被复制的标签,本地分支master (HEAD)
,next
,pu
和maint
,没有远程跟踪分支。 也就是说,所有分支都是按照原样复制的,而且它的设置完全独立,不需要再次获取。 任何远程分支(在克隆的远程)和其他参考被完全忽略。 -
git clone --mirror origin-url
:这些ref中的最后一个将被原样复制。 你将得到所有的标签,本地分支master (HEAD)
,next
,pu
和maint
,远程分支devA/master
和devB/master
,其他refsrefs/foo/bar
和refs/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 update
或git fetch --all