将临时文件放入 $ git clone ... # 不在 CWD 中?

问题描述 投票:0回答:1

我们在 Samba 文件系统上使用 $ git clone -breleases/gcc-13.2.0 git://gcc.gnu.org/git/gcc.git # ,并注意到 git 在以下位置创建了lots的临时文件CWD(这会导致性能问题,因为这个 $ git clone ... # 的数据通过线路传输多次...)。

是否有任何选项可以将这些文件存储在 $TMPDIR(例如 /tmp、Linux/Solaris/Illumos 上的 tmpfs)由 RAM 支持的本地文件系统)?

git performance git-clone smb
1个回答
0
投票

一般来说,Git 会创建大量临时文件,以支持原子行为和锁定各种文件系统,包括不支持 POSIX 锁定的系统(如 SMB/CIFS)。如果 Git 不这样做,它将很容易受到竞争条件的影响,从而可能损坏存储库。

虽然 Git 并不总是以这种方式在工作树中写入文件,但它确实将几乎所有其他文件写入临时文件,然后自动将其重命名到位。对于对象、参考以及

.git
中的几乎所有其他内容都是如此。

(我应该指出,虽然我不熟悉 SMB/CIFS 的详细信息,但再次通过连接发送数据以执行重命名将是一个可怕的协议设计错误,因此希望重命名的成本你的系统只是另一个协议消息,这可能更容易被接受。)

这些临时文件通常不能位于

$TMPDIR
中,因为它们不需要位于同一文件系统上,并且不可能跨文件系统重命名它们(Unix 将返回
EXDEV
)。尽管
mv
在这种情况下有效,但它本质上是制作一个副本,然后删除旧文件,这不是原子性的,因此可能会导致损坏。 Git 不允许
.git
的内容跨文件系统,因此在那里执行这些重命名始终是安全的。

Git 确实 使用

$TMPDIR
来表示可以由 diff 程序调用的文件,并且不需要最终存放在存储库中。这是正确的决定,因为它允许使用
$TMPDIR
通常提供的所有好处。

如果您希望创建更少的临时文件,可以使用

.git
--separate-git-dir
目录移动到其他位置。这将创建所谓的 gitlink,它是一个指向正确位置的
.git
文件(而不是目录)。但是,此目标是绝对的,因此您应该注意,即使将路径安装到单独的位置,也不应移动实际的
.git
目录。如果
.git
目录没有挂载,你也不能使用工作树,因为即使像你的 shell 这样的东西也可以调用
git status
之类的东西,如果 Git 找不到它的数据,它会非常不高兴。

一般来说,我的建议是不要对 Git 数据使用 SMB 或 CIFS,因为 Git 期望其文件系统具有类似于 POSIX 功能的功能(例如,写入后发生的读取必须返回写入的数据),尤其是这样Unix。甚至一些 NFS 服务器也被认为是损坏的,因为 Git 期望能够在以读写方式打开文件时创建具有 0400 权限的文件,而某些 NFS 服务器无法正确处理该问题。当然,您的里程可能会有所不同。

© www.soinside.com 2019 - 2024. All rights reserved.