Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';git clone(镜像)和git clone(裸机)之间的区别是什么_Git_Git Clone - Fatal编程技术网

什么';git clone(镜像)和git clone(裸机)之间的区别是什么

什么';git clone(镜像)和git clone(裸机)之间的区别是什么,git,git-clone,Git,Git Clone,git clone帮助页面上有这样一句话,关于--mirror: 设置远程存储库的镜像。这意味着--bare 但是没有详细说明--mirror克隆与--bare克隆有何不同 $ git clone --mirror $URL 是的缩写 $ git clone --bare $URL $ (cd $(basename $URL) && git remote add --mirror=fetch origin $URL) (直接复制自) 当前手册页的内容: 与--bare相比,-

git clone帮助页面上有这样一句话,关于
--mirror

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

但是没有详细说明
--mirror
克隆与
--bare
克隆有何不同

$ 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
覆盖


不同之处在于,当使用
--mirror
时,所有引用都按原样复制。这意味着一切:远程跟踪分支、注释、refs/originals/*(来自筛选器分支的备份)。克隆回购拥有一切。它还设置为远程更新将从源重新获取所有内容(覆盖复制的引用)。这个想法实际上是镜像存储库,拥有一个完整的副本,例如,您可以在多个位置托管您的中央回购,或者对其进行备份。考虑一下直接复制回购协议,除了以更优雅的git方式

新的报告几乎说明了这一切:

--镜像

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

我最初的回答还指出了裸克隆和普通(非裸)克隆之间的区别——非裸克隆设置远程跟踪分支,只为
头创建本地分支,而裸克隆直接复制分支

假设origin有几个分支(
master(HEAD)
next
pu
,和
maint
),一些标记(
v1
v2
v3
),一些远程分支(
devA/master
devB/master
),以及一些其他引用(
refs/foo/bar
refs/foo/baz
,可能是便笺、藏书、其他开发者的名称空间,谁知道呢)

  • git克隆源url
    (非裸):
    您将获得复制的所有标记,一个本地分支
    主机(HEAD)
    跟踪远程分支
    origin/master
    、远程分支
    origin/next
    origin/pu
    、和
    origin/maint
    。设置跟踪分支的目的是,如果您执行类似于
    git fetch origin
    的操作,它们将按照您的预期进行获取。任何远程分支(在克隆的远程分支中)而其他参考文献则完全被忽略

  • git clone——裸源url
    您将复制所有标记,本地分支
    master(HEAD)
    next
    pu
    maint
    ,没有远程跟踪分支。也就是说,所有分支都按原样复制,并且设置完全独立,不需要再次获取。任何远程分支(在克隆的远程中)和其他引用都被完全忽略

  • git clone--镜像源url
    这些引用中的每一个都将按原样复制。您将获得所有标记、本地分支
    主(头)
    next
    pu
    、和
    maint
    、远程分支
    devA/master
    devB/master
    、其他refs
    refs/foo/bar
    refs/foo/baz
    。所有内容都与克隆远程中的内容一模一样。远程跟踪设置为,如果您运行
    git remote update
    ,所有refs都将在将从原始位置被覆盖,就好像您刚刚删除了镜像并将其重新锁定。正如文档最初所说,它是一个镜像。它应该是功能相同的副本,可以与原始版本互换

  • -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
    

克隆从远程复制引用,并将其填充到名为“这些是远程拥有的引用”的子目录中

镜像从远程设备复制参照并将其放入自己的顶层-它将用远程设备的参照替换自己的参照


这意味着,当有人从您的镜像中提取镜像的引用并将其填充到其子目录中时,他们将获得与原始镜像相同的引用。从最新镜像获取的结果与直接从初始repo获取的结果相同。

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


GitHub文档中关于以下内容的细微解释:

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


我添加了一张图片,显示镜像和裸机之间的差异。 左边是空的,右边是镜像。您可以清除,镜像的配置文件有
fetch
键,这意味着您可以通过
git remote update
git fetch--all

$ git clone --bare https://github.com/example
此命令将使新的“
example
”目录本身成为$GIT_DIR(而不是
example/.GIT
)。此外,远程分支头直接复制到相应的本地分支头,而不进行映射。使用此选项时,远程跟踪分支和相关配置变量都不会
$ git clone --mirror https://github.com/example