我们在一个桑巴舞文件系统上使用$ git clone -B releases/gcc-13.2.0 git:gcc.gnu.org/git/gcc.git #,注意到git在CWD中创建了 * 大量 * 临时文件(这会导致性能问题,因为这个$ git clone...#的数据会通过网络传输多次..)。是否有任何选项可以将这些文件存储在$TMPfs(例如,Linux/Solaris/Illumos上的/tmp、tmpfs)中,由RAM支持?
h22fl7wq1#
一般来说,Git会创建大量的临时文件,以支持原子行为和各种文件系统的锁定,包括那些不支持POSIX锁定的文件系统(如SMB/CIFS)。如果Git不这样做,它将容易受到竞争条件的影响,从而损坏仓库。虽然Git并不总是以这种方式在工作树中写入文件,但它确实会将几乎所有其他文件写入临时文件,然后原子地重命名到适当的位置。对于.git中的对象,引用和几乎所有其他内容都是如此。(我应该指出,虽然我不熟悉SMB/CIFS的细节,但通过连接再次发送数据以执行重命名将是一个可怕的协议设计错误,因此希望系统上的重命名成本只是另一个协议消息,这可能更容易接受。通常,这些临时文件不能位于$TMPDIR中,因为它们不需要位于同一文件系统中,并且不可能跨文件系统重命名它们(Unix将返回EXDEV)。即使mv在这种情况下工作,它本质上是复制然后删除旧文件,Git不允许.git的内容跨文件系统,所以在那里执行这些重命名总是安全的。Git * 确实 * 使用$TMPDIR来处理那些可以被diff程序调用的文件,并且这些文件不需要最终保存在仓库中。这是一个正确的决定,因为它允许使用$TMPDIR通常提供的所有好处。如果你想创建更少的临时文件,你可以使用--separate-git-dir将.git目录移动到其他地方。这将创建一个名为gitlink的.git文件。(而不是一个目录),指向正确的位置。但是,这个目标是绝对的,所以你应该知道,实际的.git目录不应该被移动,如果没有挂载.git目录,你也不能使用工作树,因为即使是像shell这样的东西也可以调用git status这样的东西,如果Git找不到它的数据,它会很不高兴。一般来说,我的建议是不要对Git数据使用SMB或CIFS,因为Git希望从其文件系统中获得类似POSIX的功能(例如,在写操作之后发生的读操作 * 必须 * 返回写操作的数据),在Unix上尤其如此。甚至有些NFS服务器也被破坏了,因为Git希望在读写打开文件时能够创建具有0400权限的文件,有些NFS服务器不能正确处理这个问题。当然,您的情况可能会有所不同。
.git
$TMPDIR
EXDEV
mv
--separate-git-dir
git status
1条答案
按热度按时间h22fl7wq1#
一般来说,Git会创建大量的临时文件,以支持原子行为和各种文件系统的锁定,包括那些不支持POSIX锁定的文件系统(如SMB/CIFS)。如果Git不这样做,它将容易受到竞争条件的影响,从而损坏仓库。
虽然Git并不总是以这种方式在工作树中写入文件,但它确实会将几乎所有其他文件写入临时文件,然后原子地重命名到适当的位置。对于
.git
中的对象,引用和几乎所有其他内容都是如此。(我应该指出,虽然我不熟悉SMB/CIFS的细节,但通过连接再次发送数据以执行重命名将是一个可怕的协议设计错误,因此希望系统上的重命名成本只是另一个协议消息,这可能更容易接受。
通常,这些临时文件不能位于
$TMPDIR
中,因为它们不需要位于同一文件系统中,并且不可能跨文件系统重命名它们(Unix将返回EXDEV
)。即使mv
在这种情况下工作,它本质上是复制然后删除旧文件,Git不允许.git
的内容跨文件系统,所以在那里执行这些重命名总是安全的。Git * 确实 * 使用
$TMPDIR
来处理那些可以被diff程序调用的文件,并且这些文件不需要最终保存在仓库中。这是一个正确的决定,因为它允许使用$TMPDIR
通常提供的所有好处。如果你想创建更少的临时文件,你可以使用
--separate-git-dir
将.git
目录移动到其他地方。这将创建一个名为gitlink的.git
文件。(而不是一个目录),指向正确的位置。但是,这个目标是绝对的,所以你应该知道,实际的.git
目录不应该被移动,如果没有挂载.git
目录,你也不能使用工作树,因为即使是像shell这样的东西也可以调用git status
这样的东西,如果Git找不到它的数据,它会很不高兴。一般来说,我的建议是不要对Git数据使用SMB或CIFS,因为Git希望从其文件系统中获得类似POSIX的功能(例如,在写操作之后发生的读操作 * 必须 * 返回写操作的数据),在Unix上尤其如此。甚至有些NFS服务器也被破坏了,因为Git希望在读写打开文件时能够创建具有0400权限的文件,有些NFS服务器不能正确处理这个问题。当然,您的情况可能会有所不同。