当从本地文件系统请求克隆时,Git假定-l
,可能是为了加速克隆并节省磁盘空间。这种克隆的含义是什么?如果我将存储库克隆两次然后提交一个存储库,那么更改是否会在另一个克隆中可见?我想知道Git是否小心复制写入。如果原始存储库是只读的,那么这会给克隆带来问题吗?
答案 0 :(得分:5)
git clone
联机帮助页说明了-l
:
当要克隆的存储库位于本地计算机上时,此标志会绕过正常的“git aware”传输机制,并通过制作HEAD副本以及对象和refs目录下的所有内容来克隆存储库。 .git / objects /目录下的文件是硬链接的,以便在可能的情况下节省空间。
这意味着您将获得所有Git对象的硬链接,这些对象没有实际意义,因为这些对象无论如何都是不可变的,并且Git在创建后不会更新它们。您还可以获得HEAD
和其他符号引用的实际副本,因此在一个存储库中对它们的更改将 在其他存储库中不可见。如果您提交更改,将在.git/objects
下创建一些 new 对象,并且HEAD
引用将更新为指向最新提交(将是其中一个新创建的对象);不会更新现有对象,因此您不必担心硬链接。
该联机帮助页指出了一个可能有意义的含义:
强制复制而不是硬链接(如果你试图备份你的存储库,这可能是合乎需要的),但仍然避免使用通常的“git感知”传输机制,可以使用--no-hardlinks。
硬链接的缺点是它们在磁盘上引用相同的实际inode,因此如果一个Git对象被破坏,那么与其硬链接的所有本地克隆都将具有损坏的对象。如果没有硬链接,您将拥有所有对象的实际备份副本。