7

我正在尝试克隆 tensorflow/models 存储库。我通过 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
4

3 回答 3

10

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

cd /tmp   (non nfs location)
git clone blablabla.git
mv blablabla ~
于 2017-05-05T12:37:37.457 回答
4

简短回答:使用“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
于 2019-02-20T11:34:04.440 回答
1

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

  • 在本地克隆 GitHub 存储库
  • 做一个捆绑

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

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

    git clone myrepo.bundle myrepo
    
于 2016-11-28T20:56:56.817 回答