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

LaP*_*ino 180 git git-clone

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

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

Jak*_*ski 117

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

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

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

  • `for m in \`seq 1 100 \`;做git fetch --depth = $ m; done`对我来说效果很好.. (7认同)
  • 这对**现在非常好**,使用git 1.7.10.Git存储库的初始深度= 1克隆仅为4.72Mb,而整个存储库为55Mb.进一步的提取可以根据需要进行,(深度= 100给我一个~20Mb的提取).总压缩下载量为31Mb,超过一个克隆和3次提取. (6认同)
  • `for m in $(seq 1 50);do git fetch --depth=$[m*100];done` 对我有用,谢谢!:) (4认同)
  • 浅克隆技巧在实践中效果不佳.克隆一个包装精良的仓库(git://libvirt.org/libvirt.git)将68M转换转换为61M + 35M转移.优先考虑工作树而不是深度为1的所有分支的功能可能会更好; 会议恢复会更好. (3认同)
  • @Tobu:浅克隆技巧可能在具有悠久历史的存储库中起作用。目前正在进行的工作是使浅层克隆默认情况下仅获得一个分支。这可能有帮助。或不。 (2认同)
  • @naught101它下载一个版本的对象,如果源代码本身很大(不是历史),那么它将再次出现问题...... (2认同)

Jun*_*ter 68

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

可重新启动的克隆

克隆大型存储库(例如KDE,Open Office,Linux内核)时,目前无法重新启动中断的克隆.对于小管道末端的用户来说,下载数据可能需要相当长的时间,如果克隆在中间被中断,则用户当前需要从头开始重试并再次尝试.对于某些用户,这可能使得无法克隆大型存储库.

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


更新

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

  • 这2年半以后有没有更新? (13认同)
  • 就在昨天,我失去了我的600卢比(10美元)因为这个问题.互联网带宽在我的世界各地都是非常珍贵的东西. (7认同)
  • 很多人要求更新,没有人分享他们对解决方案的贡献. (2认同)
  • Mar'18-lukin仍然……在这个地球上! (2认同)
  • 8年后......还没有更新? (2认同)
  • 11年后,谷歌对Google Fiber和Google Fi带来的不可靠带宽的潜在社会经济问题的攻击结果好坏参半.它在路易斯维尔市的纤维微型沟槽被切割得太浅了**进入沥青,并且发现电缆在下班后很快从路面冒出来.与此同时,`--depth 1`和`--unshallow`似乎经受住了多年的使用. (2认同)

Raf*_*sin 15

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

首先,执行 git clone --bare,然后 rsync -v -P -e ssh user@host:repo.git . 您可以在Windows下使用msys.

  • Linus [不拥有 GitHub](https://github.com/torvalds/linux/pull/17#issuecomment-5654674)…“第 3 方服务器”,您实际上的意思是“Git 服务器不会监禁其用户如此之多以至于禁止他们使用 `rsync(1)` _顺便说一句 GitHub 我正在看着你_”?或者,您的意思是首先在第 3 方服务器上“git clone”,然后将其同步到本地计算机? (2认同)

Ces*_*arB 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://protocol(git daemon)的服务器读取的目录相同.如果您使用Web下载程序(例如wget -m -np)制作这些目录的副本,则可以从副本中克隆它,如果您直接从http存储库克隆,它将起作用.

所以,你可以做的是:每个仓库,得到它与您最喜爱的网络下载从副本复印件(这将处理所有与恢复中断的下载问题),和克隆.如果要更新,请再次使用您喜欢的网络下载程序来更新您的副本,并从该副本中提取.现在,您的克隆和更新与您喜欢的网络下载器一样可以抵御糟糕的连接.


jth*_*ill 9

" 永远不要低估载体鸽和一捆SD卡的带宽 "将成为这个答案的现代形式.瞄准它,简单地cp -a说它,无论如何,并邮寄该死的东西.找一个愿意花两分钟时间将拇指驱动器放入SASE的人.找到一个联系人,他们甚至可以为你做.


Ahe*_*Eid 6

git clone --depth <Number> <repository> --branch <branch name> --single-branch
Run Code Online (Sandbox Code Playgroud)

这个命令帮助我(感谢Nicola Paolucci

例如

git clone --depth 1 https://github.com/gokhanmoral/siyahkernel3 --branch ics  --single-branch
Run Code Online (Sandbox Code Playgroud)


小智 6

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

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

  2. 将压缩设置为 0

    git config --global core.compression 0
    
    Run Code Online (Sandbox Code Playgroud)
  3. 设置postBuffer尺寸

    git config --global http.postBuffer 1048576000
    
    Run Code Online (Sandbox Code Playgroud)
  4. 设置maxRequestBuffer尺寸

    git config --global http.maxRequestBuffer 100M
    
    Run Code Online (Sandbox Code Playgroud)
  5. 现在开始克隆

    git clone <repo url>
    
    Run Code Online (Sandbox Code Playgroud)
  6. 等待克隆完成。

  • 这绝对应该是公认的答案。它解决了问题。 (2认同)

Amb*_*ber 5

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


cow*_*tor 5

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

git clone运行时,它做的第一件几件事情相当于

git init
git remote add origin <repo_url>
git fetch origin <branch>
Run Code Online (Sandbox Code Playgroud)

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

git checkout --force <branch>
Run Code Online (Sandbox Code Playgroud)

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

  • 它不按照你描述的方式工作,它不允许在 fetch 损坏后进行 git 重置 (2认同)

mat*_*son 5

我想把我的 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
Run Code Online (Sandbox Code Playgroud)

这帮助我通过 8Mbps adsl 连接克隆了 ~3GB 的 repo,当然我不得不执行几次提取和拉取,但仍然......