如何在不稳定的连接上完成大项目的git克隆?

时间:2010-10-17 19:22:35

标签: git git-clone

我正在尝试克隆LibreOffice代码库,但目前我有一个大约300kbps的互联网连接,它只是稳定的东西。我可以随时获取连接,但随后git clone进程已经停止工作,无法让它再次运行。有没有办法让更多的抗故障git克隆下载?

我认为自己的一个选择是下载其他人的.git目录,但这完全依赖于其他目录,对我来说似乎不是最好的解决方案。

18 个答案:

答案 0 :(得分:111)

我想到的两个解决方案(或者更确切地说是 解决方法 )是:

  • 使用浅层克隆git clone --depth=1,然后使用git fetch --depth=N 加深此克隆,增加 N 。您可以使用git fetch --unshallow(自1.8.0.3起)下载所有剩余的修订版。

  • 要求某人捆绑一些标记版本(请参阅git-bundle(1)联构帮助页)。捆绑包本身是一个普通的文件,您可以通过HTTP / FTP以及简历支持,通过BitTorrent,通过rsync等以任何方式下载。您可以从捆绑包创建克隆,修复配置,并从官方LibreOffice存储库进一步提取

答案 1 :(得分:65)

我认为这还没有准备好。有an old GSoC page计划实现您想要的功能。我最好的选择是,像你建议的那样将其下载为目录。我假设你能够通过其他协议恢复下载。

  

可重新启动的克隆

     

克隆大型存储库时(例如   作为KDE,Open Office,Linux内核)   目前无法重启   一个中断的克隆。可能需要   用户在相当长的时间   下载一个小管道的结尾   数据,以及克隆是否被中断   在用户当前需要的中间   从头开始重新开始   再试一次。对于一些用户,这可能   无法克隆一个大的   库中。

     

目标:自动允许git-clone   恢复以前失败的下载   在本机git://协议上。   语言:C导师:Shawn Pearce    建议者:肖恩   Pearce on gmane


更新

除了其他一个答案中的浅层克隆(git clone --depth=1)建议之外,如果您可以与提供商进行通信,那么有人可以为您创建一个裸存储库可能会有所帮助。您可以轻松地convert裸存储库到完整存储库。同时阅读该答案中的评论,因为浅层克隆可能并不总是有帮助。

答案 2 :(得分:13)

此方法使用第三方服务器。

首先,做 那么git clone --bare rsync -v -P -e ssh user@host:repo.git . 您可以在Windows下使用msys。

答案 3 :(得分:9)

您可以“下载其他人的.git目录”,但其他人本身就是官方存储库。 LibreOffice存储库可通过http获取,例如他们的build.git位于http://anongit.freedesktop.org/git/libreoffice/build.git/(有关完整列表,请参阅http://cgit.freedesktop.org/libreoffice/,http URL位于每个存储库页面的底部)。

您在这些http URL上看到的只不过是一个.git目录(实际上是一个“裸”存储库,它只有您在.git目录中找到的内容)。它与git://协议(git daemon)的服务器读取的目录相同。如果您使用Web下载程序(例如wget -m -np)制作这些目录的副本,则可以从副本中进行克隆,并且如果您直接从http存储库克隆,它将起作用。

因此,您可以做的是:对于每个存储库,使用您喜欢的Web下载程序(它将处理恢复损坏的下载的所有问题)获取它的副本,并从该副本克隆。如果要更新,请再次使用您喜欢的网络下载程序来更新您的副本,并从该副本中提取。现在,您的克隆和更新与您最喜欢的网络下载器的不良连接一样耐用。

答案 4 :(得分:8)

Never underestimate the bandwidth of a carrier pigeon and a bundle of SD cards”将成为这个答案的现代形式。把它抬起来,简单的cp -a它,无论如何,并邮寄该死的东西。找一个愿意花两分钟时间将拇指驱动器放入SASE的人。找到一个联系人,在那里,他们甚至可以为你做。

答案 5 :(得分:4)

如果您有权访问第三方服务器,则可以在那里进行克隆,然后复制。

答案 6 :(得分:4)

让我们将git clone分解为其组成部分,并使用git reset来阻止重新下载文件。

git clone运行时,它所做的前几件事等同于

git init
git remote add origin <repo_url>
git fetch origin <branch>

如果您手动运行上述步骤,并假设它们已正确完成,您现在可以根据需要多次运行以下步骤:

git checkout --force <branch>

请注意,它会在每次运行时检出所有文件,但您不必重新下载文件,这可能会为您节省大量时间。

答案 7 :(得分:3)

这个问题也让我感到困惑。在我的情况下,有一个解决方法。它可能适用于您的情况,也可能不适用。

我有时会使用手机在远程系统上启动git操作。如果我的wi-fi当然会中断,会话结束并且git会丢弃整个克隆操作而不会恢复。但是,由于从我的远程系统到git master的互联网连接很稳定,所以克隆不需要停止。我需要的只是将克隆从终端会话中分离出来的常识。这可以通过使用screen / tmux或nohup / daemon来完成。所以在我的案例中它是一个实时软件故障。

答案 8 :(得分:3)

git clone --depth <Number> <repository> --branch <branch name> --single-branch

此命令可以帮助我(感谢Nicola Paolucci

例如

git clone --depth 1 https://github.com/gokhanmoral/siyahkernel3 --branch ics  --single-branch

答案 9 :(得分:2)

增加缓冲区大小将帮助您解决此问题。只需按照步骤操作即可。

  1. 打开终端或Git Bash,然后用cd转到要克隆存储库的位置。

  2. 将压缩率设置为0

    git config --global core.compression 0
    
  3. 设置postBuffer大小

    git config --global http.postBuffer 1048576000
    
  4. 设置maxRequestBuffer大小

    git config --global http.maxRequestBuffer 100M
    
  5. 现在开始克隆

    git clone <repo url>
    
  6. 等待克隆完成。

答案 10 :(得分:2)

基于克隆/基于深度的答案 - 几行bash可以轻松完成...

git clone --depth=1 something@somegit.com:/var/git/whatever.git <directory> cd <directory> for m in `seq 1 100`;do git fetch --depth=$m;done

答案 11 :(得分:2)

使用CNTRL Z停止克隆。不要关闭终端,让系统/笔记本电脑处于休眠状态,然后通过fg命令继续。 我在尝试克隆一个repo frm github时遇到了同样的问题。这对我来说是节省时间的。

答案 12 :(得分:1)

使用git代理,例如ngitcachedgit-proxy

答案 13 :(得分:0)

如果我们假设服务器具有良好的带宽(并且您有服务器),则另一个答案是:

  1. 使用服务器端Git Wrapper
  2. 创建自己的服务器
  3. 在您的服务器中克隆它
  4. 使用服务器端Zip Archiver
  5. 对其进行压缩
  6. 从服务器端Resume support
  7. 下载并使用它

    但这仅适用于非常基本的Web开发经验;) 而且你的服务器中还需要git.exe

答案 14 :(得分:0)

这里有同样的问题-我的互联网连接非常不稳定,通常不超过10-15 kb / sec :-P

对我来说,wget的方法效果很好。 转到绿色的“克隆或下载”按钮所在的存储库站点,单击它并复制ZIP下载选项的链接。

然后插入指向wget命令的链接:
wget -c -m -np https://github.com/your/repository/archive/master.zip

像魅力一样工作...

答案 15 :(得分:0)

我想把我的5美分放在这里。 这实际上是帮助我解决此问题的原因

  • 关闭压缩
  • 增加http.postBuffer
  • 进行部分克隆
  • 导航到克隆目录并获取克隆的其余部分
  • 拉剩下的
git config --global core.compression 0
git config --global https.postBuffer 524288000
git clone  <your_git_http_url_here> --depth 1
git fetch --unshallow 
git pull --all

这帮助我通过8Mbps的adsl连接克隆了约3GB的存储库,当然我必须执行提取操作并提取几次,但仍然...

答案 16 :(得分:0)

最适合我的解决方法:

我因为互联网连接问题而面临同样的问题。所以我想出了以下解决方案:

在我的服务器上创建了一个小的php文件,以zip文件的形式下载该软件包:

<?php
$url = "https://codeload.github.com/CocoaPods/Specs/zip/master";
file_put_contents("coco.zip", fopen($url, 'r'));
?>  

<a href="coco.zip">coco.zip</a>

然后使用任何支持简历的下载管理器下载zip文件

答案 17 :(得分:0)

您可以尝试将mercurial与hg-git扩展名一起使用。

如果这不起作用,您可以使用git fetch <commit-id>仅获取远程git存储库的一部分(您可以获取到空的git存储库,不需要使用clone创建它)。但是,当您使用此方法时,您可能会更正分支配置(=创建本地和远程跟踪分支)。