git clone --shared和--reference有什么区别?

28 git

阅读文档后,我还没有真正理解的差异之间有什么--shared--reference <repo>.他们看起来很相似.

  1. 这些 --shared 选项有什么区别--reference <repo>

  2. 在制作另一个本地克隆的多个本地克隆时,它们可以用来节省驱动器空间吗?

  3. 每个本地克隆都可以签出不同的分支吗?

注意:我知道我可以使用带有截断历史的多个浅克隆git clone --depth <depth>,但是为了做到这一点,每个克隆仍然必须复制至少一些历史记录,所以我想这可能不是最佳的保存方式驱动空间(虽然它总比没有好).

背景

有时我喜欢在存储库中有多个工作副本的签出,因此我创建了多个克隆,其中每个克隆都有自己的签出.

但是,我并不需要每个克隆的整个历史记录,只需要最新版本的分支,因此我可以通过让每个克隆使用标记,提交,树,来节省大量的驱动器空间,原始本地克隆中的blob和blob对象(例如,通过符号链接).

git clone 文件

我检查git clone文档,看看有什么我可以使用的.

--shared

我看到有一个--shared选项:

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

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

--reference <repository>

然后我也看到了--reference <repository>选项:

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

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

这说明它会降低本地存储成本,因此这也可能有用.

小智 12

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

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

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

你自己看

创建--shared克隆和--reference克隆.计算每个中使用的对象git count-objects -v.您会注意到共享克隆没有对象,并且引用克隆具有与源相同数量的对象.此外,请注意文件系统中每个的大小差异.如果要移动源,并git log在共享和参考存储库中进行测试,则日志在共享克隆中不可用,但在引用克隆中可以正常工作.


Sam*_*man 5

对你的问题的评论中链接真的是一个更明确的答案:--reference暗示--shared.重点--reference是在远程存储库的初始克隆期间优化网络I/O.

与上面的答案相反,我发现--shared--reference存储库 - 来自相同的源 - 具有相同的大小,并且都具有零对象.当然,如果您使用--reference基于公共源的其他存储库,则大小和对象将反映存储库之间的差异.请注意,在这两种情况下,我们都不会在工作树中保存空间,只保留空间.git/objects.

维护此设置有一些细微差别 - 请阅读主题以获取更多详细信息.从本质上讲,这两个应该被视为公共存储库,在重新打包/修剪/垃圾收集的情况下,重视历史重写.

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

  1. 拉源
  2. 重新包装来源
  3. 拉二级
  4. git gc 在中学

可能最好阅读该主题中的讨论.

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

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

我自己没有用过这么多,所以我不知道管理它是多么容易出错.