git clone --mirror和git clone --bare之间的区别是什么

时间:2010-10-18 13:59:39

标签: git git-clone

git clone帮助页面可以说明--mirror

  

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

但是没有详细说明--mirror克隆与--bare克隆的区别。

7 个答案:

答案 0 :(得分:483)

不同之处在于,使用--mirror时,所有引用都会按原样复制 。这意味着一切:远程跟踪分支,备注,引用/原件/ *(来自filter-branch的备份)。克隆的回购拥有一切。它也设置为远程更新将从原点重新获取所有内容(覆盖复制的引用)。这个想法实际上是为了镜像存储库,以获得一个完整的副本,以便您可以在多个位置托管您的中央存储库,或者备份它。想想只是直接复制回购,除了更优雅的git方式。

新的documentation几乎说了这一切:

  

--mirror

     

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

我的原始答案还注意到裸克隆和普通(非裸)克隆之间的差异 - 非裸克隆设置远程跟踪分支,仅为HEAD创建本地分支,而裸露clone直接复制分支。

假设原点有一些分支(master (HEAD)nextpumaint),一些标记(v1v2v3),一些远程分支(devA/masterdevB/master)和其他一些引用(refs/foo/barrefs/foo/baz,可能是笔记,藏匿,其他devs的名称空间,谁知道)。

  • git clone origin-url(非裸):您将复制所有标记,本地分支master (HEAD)跟踪远程分支origin/master和远程分支origin/nextorigin/puorigin/maint。设置跟踪分支,以便在执行git fetch origin之类的操作时,可以按预期获取它们。任何远程分支(在克隆的远程中)和其他引用都被完全忽略。

  • git clone --bare origin-url :您将获得所有已复制的代码,本地分支master (HEAD)nextpu和{ {1}},没有远程跟踪分支。也就是说,所有分支都按原样复制,并且它设置为完全独立,不期望再次获取。任何远程分支(在克隆的远程中)和其他引用都被完全忽略。

  • maint :这些引用中的最后一个将按原样复制。您将获得所有标记,本地分支git clone --mirror origin-urlmaster (HEAD)nextpu,远程分支maintdevA/master,其他引用devB/masterrefs/foo/bar。一切都与克隆的遥控器完全一样。设置远程跟踪,以便在运行refs/foo/baz时,所有引用都将从原点覆盖,就像您刚删除镜像并重新克隆它一样。正如文档最初所说,它是一面镜子。它应该是功能相同的副本,可与原始副本互换。

答案 1 :(得分:48)

$ git clone --mirror $URL

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

(直接从here复制)

当前的手册页如何表达:

  

--bare相比,--mirror不仅将源的本地分支映射到目标的本地分支,还映射所有引用(包括远程分支,注释等)并设置refspec配置这样所有这些引用都被目标存储库中的git remote update覆盖。

答案 2 :(得分:23)

我今天使用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

答案 3 :(得分:12)

克隆从远程复制引用并将它们填充到名为“这些是远程具有的引用”的子目录中。

镜像从远程复制refs并将它们放入自己的顶层 - 它将自己的refs替换为远程的refs。

这意味着当有人从镜像中拉出并将镜像的refs填充到其子目录中时,它们将获得与原始镜像相同的引用。从最新镜像获取的结果与直接从初始存储库获取的结果相同。

答案 4 :(得分:12)

来自Duplicating a Repository的GitHub文档的细致解释:

  

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

答案 5 :(得分:12)

我添加了一张图片,显示了镜像和裸露之间的config差异。 enter image description here 左边是裸露的,右边是镜子。你可以清楚,镜像的配置文件有fetch键,这意味着你可以通过git remote updategit fetch --all

更新它

答案 6 :(得分:2)

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

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

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

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