我不确定如何说出这个问题,如果不清楚就道歉。如果你git clone
有一堆悬挂物的回购,你会克隆那些吗?相反的情况也是如此。如果您执行了git gc
并将其推送给其他人,那么他们的回购会丢失git gc
清理过的任何内容吗?
我猜这些都不会发生,但我找不到关于这种情况的任何文档。
我发现some information似乎暗示大多数协议git clone
为您提供了一个干净的回购,但如果您使用文件路径指定文件,则会复制所有内容。
The main reason to specify the file:// prefix is if you want a clean copy of the
repository with extraneous references or objects left out.
答案 0 :(得分:5)
Git clone不会克隆悬空对象。
当您推送它时,git gc
不会以任何方式影响远程仓库,除非您的推动导致悬空物体,然后在远程运行git gc
以移除它们。
除非....
它是一个共享克隆(使用--shared
或-s
标志指定)或本地克隆(--local
或-l
)。来自文档:
-l </ P>
当要从中克隆的存储库位于本地计算机上时,此标志 绕过正常的“git意识”传输机制并克隆 通过制作 HEAD以及对象和内容下的所有内容的副本 refs目录。 .git / objects /目录下的文件是 尽可能节省空间。这是现在的默认值 源存储库是使用/ path / to / repo语法指定的,所以它 本质上是一个无操作选项。强制复制而不是硬链接 (如果你想要备份你的,这可能是可取的 存储库),但仍然避免通常的“git意识”传输 机制, - no-hardlinks可以使用。
-s
当要克隆的存储库位于本地计算机上时,而不是 使用硬链接,自动设置.git / objects / info / alternates 与源存储库共享对象。生成的存储库 从没有任何自己的对象开始。
注意:这可能是危险的操作;不要使用它,除非 你了解它的作用。如果使用此方法克隆存储库 选项和然后删除分支(或使用任何其他git命令 一些在源存储库中进行任何现有的commit unreferenced) 对象可能变得没有引用(或悬空)。这些对象可能是 通过正常的git操作(例如git commit)删除了 自动调用git gc --auto 。
因此,当您执行git clone /path/to/repo
时,您正在复制对象(或创建硬链接),在这种情况下您将获得悬空对象。在其他情况下(使用git协议,ssh,文件协议等),你永远不会得到克隆中的悬空对象。
在此查看传输如何发生 - http://progit.org/book/ch9-6.html