代码之家  ›  专栏  ›  技术社区  ›  Sam

git克隆——镜像和git克隆——裸的区别是什么

  •  405
  • Sam  · 技术社区  · 14 年前

    git克隆帮助页面有以下内容 --mirror :

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

    但没有详细说明 --镜子 --赤裸的 克隆。

    7 回复  |  直到 8 年前
        1
  •  549
  •   H. Pauwelyn    5 年前

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

    新的 documentation 几乎可以说:

    --镜子

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

    我最初的回答还指出了裸克隆和普通(非裸)克隆之间的区别-非裸克隆设置远程跟踪分支,只为 HEAD ,而裸克隆则直接复制分支。

    假设原点有几个分支( master (HEAD) , next , pu ,和 maint ),一些标记( v1 , v2 v3 ),一些远程分支( devA/master devB/master ),以及其他一些参考文献( refs/foo/bar , refs/foo/baz ,可能是notes、stashes、其他dev的名称空间,谁知道呢)。

    • git clone origin-url 你会得到所有的标签拷贝,一个本地分支 主(头) origin/master ,和远程分支 origin/next , origin/pu ,和 origin/maint . 设置跟踪分支,以便在执行以下操作时 git fetch origin ,它们将按您所期望的方式被获取。完全忽略任何远程分支(在克隆的远程中)和其他引用。

    • git clone --bare origin-url : 你会得到所有的标签拷贝,本地分支 主(头) , 下一个 聚氨基甲酸酯 维护 ,没有远程跟踪分支。也就是说,所有的分支都是按原样复制的,并且它是完全独立设置的,不希望再次获取。完全忽略任何远程分支(在克隆的远程中)和其他引用。

    • git clone --mirror origin-url : 这些参考文献中的每一个都将原封不动地被复制。你会得到所有的标签,当地的分店 主(头) , , 聚氨基甲酸酯 维护 ,远程分支 devB/主机 参考/食物/酒吧 参考文献/foo/baz . 一切都和克隆的遥控器一模一样。设置了远程跟踪,以便在运行 git远程更新 所有引用都将从原点覆盖,就好像您刚刚删除了镜像并重新调整了它一样。正如医生最初所说,这是一面镜子。它应该是一个功能相同的副本,可以与原件互换。

        2
  •  53
  •   jhpratt    5 年前
    $ git clone --mirror $URL
    

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

    (直接从 here

    当前手册页如何表述:

    --bare , --mirror git remote update 在目标存储库中。

        3
  •  24
  •   Mark E. Hamilton    10 年前

    我今天使用git-2.0.0进行的测试表明--mirror选项不会复制hook、配置文件、描述文件、信息/排除文件,至少在我的测试用例中不会复制几个ref(我不明白这一点)。我不会将其称为“功能相同的副本,可以与原始副本互换”

    -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
    
        4
  •  14
  •   Feckmore    9 年前

    GitHub文档对 Duplicating a Repository

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

        5
  •  13
  •   PaulMurrayCbr    11 年前

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

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

        6
  •  12
  •   yanzi1225627    8 年前

    我添加图片,显示 config 镜子和裸体的区别。 enter image description here 左边是光的,右边是镜子。你可以说,镜像的配置文件 fetch git remote update git fetch --all

        7
  •  3
  •   Shantanu Singh    5 年前
    $ git clone --bare https://github.com/example
    

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

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