Git 克隆 fsync input/output linux 中的错误

Git clone fsync input/output error in linux

我正在尝试克隆 tensorflow/models 存储库。我使用 ssh 连接到远程机器。我尝试了很多解决问题的建议,但 none 对我有用。

git clone --recursive https://github.com/tensorflow/models.git
Cloning into 'models'...
remote: Counting objects: 1670, done.
remote: Compressing objects: 100% (28/28), done.
remote: Total 1670 (delta 10), reused 0 (delta 0), pack-reused 1642
Receiving objects: 100% (1670/1670), 49.23 MiB | 8.44 MiB/s, done.
Resolving deltas: 100% (670/670), done.
fatal: fsync error on '/home/OFFICE/utk/projects/syntaxnet/models/.git/objects/pack/tmp_pack_2w67RB': Input/output error
fatal: index-pack failed

如果没有明显的解决方案允许直接在远程机器上克隆,请尝试:

  • 在本地克隆 GitHub 存储库
  • make a bundle

     cd /path/to/my/repo
     git bundle create /tmp/myrepo.bundle --all
    
  • 通过 ssh

  • 一个 文件 (myrepo.bundle) 复制到远程计算机
  • 从远程机器上的包中克隆它:

    git clone myrepo.bundle myrepo
    

问题是我试图在 nfs 文件系统中克隆。 解决方案是在非 nfs 位置克隆 repo,然后将文件夹移动到所需的 nfs 位置。

cd /tmp   (non nfs location)
git clone blablabla.git
mv blablabla ~

简答:使用 "eatmydata"(这是一个程序,检查 "apt install eatmydata")

长答案: Git 频繁调用 "fsync()" 系统调用,以确保存储库一致。这一点很重要,尤其是当多人同时使用同一个存储库时,并且还要确保存储库处于定义的状态,例如电源中断时。写入包文件后,在更新元数据之前强制同步(也就是完成写入实际磁盘而不是仍在缓冲区中)。

一些文件系统——尤其是 NFS、sshfs 等远程文件系统不支持 fsync(),但 git 没有禁用这些调用的标志。

在 linux 下可以提供帮助的是一个名为 "eatmydata" 的包装器。通过包装器调用的任何程序都将模拟其 fsync() 调用,而不会实际同步。 虽然这会增加存储库损坏的风险,但如果写入实际上没有通过,这在手动监督过程时通常是可以接受的。

只需安装eatmydata,然后调用

eatmydata git clone --recursive https://github.com/tensorflow/models.git
sync