Answers:
区别在于,使用时--mirror
,所有 ref均按原样复制。这意味着一切:远程跟踪分支,注释,参考/原始文件/ *(来自过滤分支的备份)。克隆的回购包含所有内容。还进行了设置,以便远程更新将从源重新获取所有内容(覆盖复制的引用)。这个想法实际上是镜像存储库,以拥有总副本,以便例如可以在多个位置托管中央存储库或对其进行备份。除了以一种更为优雅的git方法外,您还可以考虑直接复制存储库。
新文档几乎说明了所有这些:
--mirror
设置源存储库的镜像。这意味着
--bare
。与相比--bare
,--mirror
不仅将源的本地分支映射到目标的本地分支,还映射所有ref(包括远程分支,注释等)并设置refspec配置,以便所有这些ref被git remote update
目标存储库中的a覆盖。。
我的原始答案还指出了裸克隆和普通(非裸)克隆之间的区别-非裸克隆设置了远程跟踪分支,仅为创建了本地分支HEAD
,而裸克隆直接复制了分支。
假设起源有几个分支(master (HEAD)
,next
,pu
和maint
),一些标签(v1
,v2
,v3
),一些远程分支机构(devA/master
,devB/master
),以及其他一些裁判(refs/foo/bar
,refs/foo/baz
,这可能是笔记,储物箱,其他开发者的命名空间,谁知道)。
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
,和maint
,没有远程跟踪分支。也就是说,所有分支均按原样复制,并且设置为完全独立,不希望再次获取。任何远程分支(在克隆的远程中)和其他引用都将被完全忽略。
git clone --mirror origin-url
:这些参考中的最后一个都会原样复制。你会得到所有的标签,地方分支机构master (HEAD)
,next
,pu
,和maint
,远程分支机构devA/master
和devB/master
其他裁判refs/foo/bar
和refs/foo/baz
。一切都与克隆的遥控器完全相同。设置了远程跟踪,因此,如果您运行git remote update
所有引用,将从原始位置覆盖所有引用,就好像您刚刚删除镜像并将其重新克隆一样。正如文档最初所说的,它是一面镜子。它应该是功能相同的副本,可以与原始副本互换。
$ 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覆盖。。
git fetch
,这样它才能完全相同。无论如何,这是一种无法解决的问题-问题的关键是“镜像远程/克隆与普通镜像远程/克隆有何不同?”
basename
是普通的unix实用程序,用于剥离路径的目录部分,并且$()
只是bash的命令替换。
--mirror
。如果它解释了什么git remote add --mirror
,这将是一个可以接受的答案。
我今天使用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