5

Git 假设-l何时从本地文件系统请求克隆,可能是为了加快克隆速度并节省磁盘空间。这种克隆的含义是什么?如果我克隆一个存储库两次,然后对其中一个进行提交,那么更改是否会在另一个克隆中可见?我想知道Git是否小心复制写入。如果原始存储库是只读的,那么这会给克隆带来问题吗?

4

1 回答 1

5

联机帮助页git clone指出:-l

当要克隆的存储库位于本地计算机上时,此标志绕过正常的“git 感知”传输机制,并通过复制 HEAD 以及 objects 和 refs 目录下的所有内容来克隆存储库。.git/objects/ 目录下的文件被硬链接以尽可能节省空间。

这意味着您将获得所有 Git 对象的硬链接,这没有任何实际意义,因为这些对象无论如何都是不可变的,而且一旦创建,Git 就不会更新它们。您还可以获得实际副本HEAD和其他符号引用,因此在一个存储库中对它们的更改将不会在其他存储库中看到。如果您提交更改,则会在下面创建一些.git/objects对象,并且HEAD引用将更新为指向最新提交(这将是新创建的对象之一);不会更新现有对象,因此您不必担心硬链接。

手册页说明了一个含义,这可能很有趣:

要强制复制而不是硬链接(如果您尝试备份存储库,这可能是可取的),但仍然避免通常的“git 感知”传输机制,可以使用 --no-hardlinks。

硬链接的缺点是它们引用磁盘上相同的实际 inode,因此如果一个 Git 对象损坏,则硬链接到它的所有本地克隆都将具有损坏的对象。如果没有硬链接,您将拥有所有对象的实际备份副本。

于 2012-10-23T20:39:18.637 回答