在linux中Git克隆fsync输入/输出错误

时间:2016-11-28 16:56:22

标签: git git-clone fsync

我正在尝试克隆tensorflow / models repo。我用ssh连接到远程机器。我尝试了很多建议来解决这个问题,但没有一个对我有用。

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

如果没有明显的解决方案允许直接在远程计算机上进行克隆,请尝试改为:

  • 在本地克隆GitHub repo
  • make a bundle

     cd /path/to/my/repo
     git bundle create /tmp/myrepo.bundle --all
    
  • 通过ssh将一个文件(myrepo.bundle)复制到远程计算机上

  • 从远程计算机上的捆绑包中克隆它:

    git clone myrepo.bundle myrepo
    

答案 2 :(得分:0)

简短答案:使用“ 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