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

And*_*ndy 9 git

我不确定如何提出这个问题,如果不清楚则道歉.如果你git clone是一个有一堆悬空物的回购,你会克隆那些吗?相反的情况也是如此.如果你做了一个git gc并将其推送给其他人,那么他们的回购会失去任何git gc可以清理的东西吗?

我猜这些都不会发生,但我找不到任何关于这种情况的文档.

我发现一些信息似乎暗示大多数协议都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.
Run Code Online (Sandbox Code Playgroud)

man*_*lds 5

Git clone不会克隆悬空对象.

而你git gc将不会以任何方式影响远程回购,当你推到它,除非你推使悬挂物体,然后git gc是上远程运行删除这些文件.

除非....

它是共享克隆(使用--shared-s标志指定)或本地克隆(--local-l).来自文档:

-l

当要克隆的存储库位于本地计算机上时,此标志会绕过正常的"git aware"传输机制,并通过制作HEAD副本以及对象和refs目录下的所有内容来克隆存储库..git/objects /目录下的文件是硬链接的,以便在可能的情况下节省空间.现在,当使用/ path/to/repo语法指定源存储库时,这是默认设置,因此它本质上是一个无操作选项.强制复制而不是硬链接(如果你试图备份你的存储库,这可能是合乎需要的),但仍然避免使用通常的"git aware"传输机制,可以使用--no-hardlinks.

-s

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

注意:这是一个可能危险的操作; 除非你明白它的作用,否则不要使用它.如果使用此选项克隆存储库,然后在源存储库中删除分支(或使用使任何现有提交未引用的任何其他git命令),则某些对象可能会变为未引用(或悬空).这些对象可以通过自动调用git gc --auto的常规git操作(例如git commit)来删除.

因此,当您执行a时,git clone /path/to/repo您正在复制对象(或创建硬链接),在这种情况下您将获得悬空对象.在其他情况下(使用git协议,ssh,文件协议等),你永远不会得到克隆中的悬空对象.

在这里查看运输是如何发生的 - http://progit.org/book/ch9-6.html