git克隆--共享和--引用之间有什么区别?

git克隆--共享和--引用之间有什么区别?,git,Git,在阅读了文档之后,我仍然不太明白 区别在于--shared和--reference之间。他们看起来很相似 共享的和之间有什么区别 --参考选项? 在制作多个本地克隆时,它们是否可以用来节省驱动器空间 另一个本地克隆? 每个本地克隆是否可以签出不同的分支? 注意:我知道我可以使用多个具有截断 使用git clone--depth创建历史记录,但每个克隆仍然必须 为了做到这一点,我至少复制了一些历史,所以我 认为这可能不是节省驱动器空间的最佳方式(尽管 总比没有好) 背景 有时,我喜欢在一个文件夹中

在阅读了文档之后,我仍然不太明白 区别在于
--shared
--reference
之间。他们看起来很相似

  • 共享的
    之间有什么区别
    
    --参考
    选项?

  • 在制作多个本地克隆时,它们是否可以用来节省驱动器空间 另一个本地克隆?

  • 每个本地克隆是否可以签出不同的分支?

  • 注意:我知道我可以使用多个具有截断 使用git clone--depth创建历史记录,但每个克隆仍然必须 为了做到这一点,我至少复制了一些历史,所以我 认为这可能不是节省驱动器空间的最佳方式(尽管 总比没有好)

    背景 有时,我喜欢在一个文件夹中对我的工作副本进行多个签出 所以我创建了多个克隆,每个克隆都有自己的签出

    然而,我并不真正需要每个克隆的全部历史,只是最简单的 我的分支的最新版本,所以我可以节省很多驱动器 通过让每个克隆使用 原始本地克隆(例如,通过某物的符号链接)

    git克隆
    文档 我查了一下,看有没有我想要的东西 可以用

    --共享
    我看到有一个
    --共享
    选项:

    当要克隆的存储库位于本地计算机上时,而不是使用硬拷贝 链接,自动设置
    .git/objects/info/alternates
    以共享对象 使用源存储库。生成的存储库开始时没有任何 它自己的对象

    这看起来有助于节省驱动器空间 具有不同签出的多个克隆,因为每个克隆共享 具有原始本地克隆的对象

    --参考
    然后我还看到了
    --reference
    选项:

    如果引用存储库位于本地计算机上,则自动设置
    .git/objects/info/alternates
    从引用中获取对象 存储库。将现有存储库用作备用存储库需要 要从正在克隆的存储库中复制的对象更少,从而减少了网络开销 和本地存储成本

    注意:请参阅
    --shared
    选项的注意事项

    这意味着它将降低本地存储成本,因此这可能也很有用
    好的。

    两个选项都会更新
    .git/objects/info/alternates
    以指向源存储库,这可能很危险,因此文档中的两个选项都有警告说明

    --shared
    选项不会将对象复制到克隆中。这是主要区别

    --reference
    使用了一个额外的存储库参数。在克隆过程中,使用
    --reference
    仍会将对象复制到目标中,但是您指定的对象是从引用存储库中已有的源中复制的。这可以通过使用
    --reference
    将路径传递到更快的/本地设备上的存储库,从而减少源存储库的网络时间和IO

    你自己看看吧

    创建
    --共享
    克隆和
    --引用
    克隆。使用git Count objects-v
    对每个数据库中的对象进行计数。您会注意到共享克隆没有对象,而引用克隆的对象数与源克隆的对象数相同。此外,请注意文件系统中每个文件的大小差异。如果要移动源代码,并在共享存储库和引用存储库中测试
    git日志
    ,则共享克隆中的日志不可用,但在引用克隆中工作正常。

    这确实是一个更清楚的答案:
    --reference
    意味着
    --shared
    参考的要点是在远程存储库的初始克隆期间优化网络I/O。

    与上面的答案相反,我发现来自同一源的
    --共享
    --引用
    存储库具有相同的大小,并且都没有对象。当然,如果对基于公共源的其他存储库使用
    --reference
    ,那么大小和对象将反映存储库之间的差异注意在这两种情况下,我们都没有在工作树中节省空间,只有
    .git/objects

    继续维护此设置有一些细微差别-阅读线程了解更多详细信息。从本质上讲,这两个数据库应该被视为公共存储库,在重新打包/修剪/垃圾收集的情况下,小心地重写历史

    在初始克隆后保持最佳磁盘空间使用率的工作流程似乎是:

  • 牵引源
  • 重新打包源
  • 牵引辅助
  • git gc
    在中学
  • 不过,最好还是读一下这篇文章中的讨论

    您可以通过将源的
    对象
    目录的绝对路径放入
    secondary/.git/objects/info/alternates
    并运行
    git-gc
    (许多人使用
    git-repack-a-d-l
    ,这是由
    git-gc
    完成的)向现有存储库中添加一个备用存储库

    您可以通过在辅助文件中运行
    git repack-a-d
    (no
    -l
    ),然后从
    alternates
    文件中删除该行来删除备用文件。如线程中所述,可以有多个备用线程

    我自己也没用过这么多,所以我不知道管理起来有多容易出错。

    你的问题的答案是