git clone帮助页面可以说明--mirror
:
设置远程存储库的镜像。这意味着
--bare
。
但是没有详细说明--mirror
克隆与--bare
克隆的区别。
答案 0 :(得分:483)
不同之处在于,使用--mirror
时,所有引用都会按原样复制 。这意味着一切:远程跟踪分支,备注,引用/原件/ *(来自filter-branch的备份)。克隆的回购拥有一切。它也设置为远程更新将从原点重新获取所有内容(覆盖复制的引用)。这个想法实际上是为了镜像存储库,以获得一个完整的副本,以便您可以在多个位置托管您的中央存储库,或者备份它。想想只是直接复制回购,除了更优雅的git方式。
新的documentation几乎说了这一切:
--mirror
设置源存储库的镜像。这意味着
--bare
。与--bare
相比,--mirror
不仅将源的本地分支映射到目标的本地分支,它还映射所有引用(包括远程分支,注释等)并设置refspec配置,以便所有这些引用被目标存储库中的git remote update
覆盖。
我的原始答案还注意到裸克隆和普通(非裸)克隆之间的差异 - 非裸克隆设置远程跟踪分支,仅为HEAD
创建本地分支,而裸露clone直接复制分支。
假设原点有一些分支(master (HEAD)
,next
,pu
和maint
),一些标记(v1
,v2
,v3
),一些远程分支(devA/master
,devB/master
)和其他一些引用(refs/foo/bar
,refs/foo/baz
,可能是笔记,藏匿,其他devs的名称空间,谁知道)。
git clone origin-url
(非裸):您将复制所有标记,本地分支master (HEAD)
跟踪远程分支origin/master
和远程分支origin/next
,origin/pu
和origin/maint
。设置跟踪分支,以便在执行git fetch origin
之类的操作时,可以按预期获取它们。任何远程分支(在克隆的远程中)和其他引用都被完全忽略。
git clone --bare origin-url
:您将获得所有已复制的代码,本地分支master (HEAD)
,next
,pu
和{ {1}},没有远程跟踪分支。也就是说,所有分支都按原样复制,并且它设置为完全独立,不期望再次获取。任何远程分支(在克隆的远程中)和其他引用都被完全忽略。
maint
:这些引用中的最后一个将按原样复制。您将获得所有标记,本地分支git clone --mirror origin-url
,master (HEAD)
,next
和pu
,远程分支maint
和devA/master
,其他引用devB/master
和refs/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
差异。
左边是裸露的,右边是镜子。你可以清楚,镜像的配置文件有fetch
键,这意味着你可以通过git remote update
或git fetch --all
答案 6 :(得分:2)
$ git clone --bare https://github.com/example
此命令将使新的本身成为$ GIT_DIR。而且,远程的分支头直接复制到相应的本地分支头,而无需映射。使用此选项时,将不会创建远程跟踪分支或相关的配置变量。
$ git clone --mirror https://github.com/example
与裸克隆一样,镜像克隆包括所有远程分支和标记,但是每次提取时所有本地引用(包括远程跟踪分支,注释等)都将被覆盖,因此它始终与原始存储库。