git clone / push / pull是否反映了所涉及的repos的确切内容?

时间:2011-07-28 20:14:27

标签: git

我不确定如何说出这个问题,如果不清楚就道歉。如果你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.

1 个答案:

答案 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