[英]Does a git clone/push/pull mirror the exact contents of the repos involved?
我不确定如何提出这个问题,如果不清楚则道歉。 如果你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.
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)来删除 。
因此,当您执行git clone /path/to/repo
您正在复制对象(或创建硬链接),在这种情况下您将获得悬空对象。 在其他情况下(使用git协议,ssh,文件协议等),你永远不会得到克隆中的悬空对象。
在这里查看运输是如何发生的 - http://progit.org/book/ch9-6.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.