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

我试图git克隆LibreOffice代码库,但目前我有一个大约300kbps的互联网连接,它只是什么都不稳定。我可以在任何时候恢复连接,但是git克隆进程已经停止工作,没有办法让它再次运行。有没有什么方法可以让git克隆下载更具抗失败性?

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

83912 次浏览

如果你可以访问第三方服务器,你可以克隆那里,然后复制。

我觉得这个还没准备好。有旧的GSoC页面计划实现你想要的功能。我最好的办法是,像你建议的那样把它下载成一个目录。我假设你能够通过其他协议恢复下载。

可重新开始的克隆

当克隆一个大型存储库(例如 如KDE, Open Office, Linux内核) 目前无法重新启动 一个中断的克隆。这可能需要 对于用户来说相当长的时间 末端的一个小管道下载 数据,克隆是否中断 中间是用户当前需要的 从头再来,然后 再试一次。对于某些用户来说,可能是这样 使它不可能克隆一个大 库。< / p >

目标:允许git-clone自动 恢复以前失败的下载 通过本地git://协议。 语言:C导师:肖恩·皮尔斯 建议:Shawn Pearce on gmane


更新

随着浅克隆(git clone --depth=1)建议在其他答案之一,如果有人可以为你做一个裸库,如果你可以与提供者沟通,这可能是有帮助的。你可以很容易地转换裸仓库到一个完整的仓库。另外,请阅读答案中的评论,因为肤浅的克隆可能并不总是有帮助。

您可以尝试在hg-git扩展中使用mercurial。

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

想到的两个解决方案(更确切地说是< em >工作区< / em >)是:

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

  • 询问某人bundle到一些标记的发布(参见git-bundle(1) manpage)。bundle本身是一个普通的文件,你可以通过任何方式下载,通过HTTP/FTP支持恢复,通过BitTorrent,通过rsync等等。你可以从bundle中创建克隆,修复配置,并从官方的LibreOffice存储库中进一步获取。

你可以“下载其他人的.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)读取的相同目录。如果你用网络下载器(例如wget -m -np)复制了这些目录,你可以从你的拷贝中克隆,它会像你直接从http存储库中克隆一样工作。

所以,你可以做的是:对于每个存储库,用你最喜欢的网络下载器获取它的副本(它将处理恢复失败下载的所有问题),并从该副本克隆。当你想要更新时,再次使用你最喜欢的网络下载器来更新你的副本,并从该副本中提取。现在你的克隆和更新就像你最喜欢的网络下载器一样抵抗坏连接。

这个问题也困扰着我。对我来说,有一个变通办法。它可能适用于你,也可能不适用。

我有时会使用手机在远程系统上启动git操作。如果我的wi-fi断了,会话当然会结束,git会放弃整个克隆操作而不恢复。但是由于从我的远程系统到git master的互联网连接是可靠的,所以没有必要让克隆停止。我所需要的只是从终端会话分离克隆的常识。这可以通过使用screen/tmux或nohup/daemon来完成。所以在我的情况下,这是一个生活设备故障。

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

< p >首先,做 git clone --bare,然后 rsync -v -P -e ssh user@host:repo.git . Windows下可以使用msys。< / p >

使用CNTRL Z停止克隆。不要关闭终端,让系统/笔记本电脑处于休眠状态,然后稍后使用fg命令继续。 我今天在试图从github克隆一个回购时也面临着同样的问题。

"永远不要低估一只信鸽和一捆SD卡的带宽"是这个答案的现代形式。把它涂上沥青,普通的cp -a,不管怎样,然后把这该死的东西寄出去。找一个愿意花两分钟时间把u盘放进SASE的人。在那里找个联系人,他们甚至可以帮你。

使用一个git代理,比如ngitcachedgit-proxy

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

这个命令帮助我(感谢尼古拉保鲁西)

例如

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

让我们把git clone分解成它的组成部分,并使用git checkout来防止重新下载文件。

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

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

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

git checkout --force <branch>

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

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

  1. 使用服务器端Git包装创建自己的服务器
  2. 在您的服务器中克隆它
  3. 使用服务器端Zip文档's压缩它
  4. 从服务器端恢复支持下载

,但这只适用于非常基本的web开发经验;) 并且你还需要在你的服务器中git.exe

同样的问题-我有一个非常脆弱的互联网连接,通常不超过10-15 kb/秒:- p

对我来说,wget方法非常有效。

转到存储库站点,那里有绿色按钮“克隆或下载”;是,单击它并复制ZIP下载选项的链接。

然后插入到wget命令的链接:

wget -c -m -np https://github.com/your/repository/archive/master.zip

工作起来很有魅力……

我想把我的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的repo,当然我必须执行取回和拉几次,但仍然…

对我来说最有效的解决方法是:

我也遇到过同样的问题,因为网络连接不好。所以我想出了以下解决方案:

我在服务器上创建了一个小的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文件。

增加缓冲区大小将有助于解决这个问题。按照步骤做就可以了。

  1. 打开终端或Git Bash,并使用cd去到你想克隆repo的位置。

  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. 等待克隆完成