繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM