如何在不稳定的网络连接下克隆一个大的Git仓库?

35
我想克隆LibreOffice。从官方网站上,这是写着的:
所有源代码都托管在Git中: 克隆:$ git clone git://anongit.freedesktop.org/libreoffice/core #(浏览) 克隆(http):$ git clone http://anongit.freedesktop.org/git/libreoffice/core.git # 较慢 Tarballs:http://download.documentfoundation.org/libreoffice/src/ 请找到最新版本(通常在底部)
现在,当我在git bash中写入此命令进行克隆时,它开始获取。但存储库很大,几个小时后,如果我失去连接几秒钟,它会回滚下载,我将一无所获。
即使出现中断,是否有任何方法可以顺利下载存储库?
附言:我是Git的新用户,我使用1 MB DSL互联网连接。存储库必须超过1 GB。

https://dev59.com/iXM_5IYBdhLWcg3w1G2N - ustun
6个回答

21

这个仓库可以通过 http 协议 (也称为 dumb protocol) 访问,地址如下:http://anongit.freedesktop.org/git/libreoffice/core.git

你可以使用 wget 或其他下载工具下载所有内容,然后你就拥有了该仓库的克隆。之后将目录从 core.git 重命名为 .git,并使用以下命令告诉 git 远程 url:

$ git remote add remote http://anongit.freedesktop.org/git/libreoffice/core.git
$ git reset --hard HEAD

2
这适用于LibreOffice,但如果仓库没有托管在其他地方呢? - neogeomat

17

执行 'git clone --depth 100' 命令,它将获取最近的100个提交记录


谢谢,这对我的情况很有帮助。 - Jaeho Lee
1
自从回答写出来以后,git fetch --unshallow 已经被添加到 git 中。 - Rich

10

您可以执行以下操作:

git clone --depth 1 git@github.com:User/Project.git .
git fetch --unshallow

第一个clone仍然是原子性的,因此如果您的连接不够可靠以获取当前HEAD,则会遇到问题。

随后的fetch应该是增量的,并且如果连接在中途断开,则可以重试。


8

增加缓冲区大小以使git能够充分利用您的带宽。使用以下命令。

git config --global core.compression 0

git config --global http.postBuffer 1048576000

git config --global http.maxRequestBuffer 100M

git clone <repo url>

等到克隆完成。

为什么这不是被接受的答案?这个解决了问题。 - london_utku

3
我所知道的最好方法是将浅克隆(--depth 1)功能与稀疏检出结合使用,即仅检出您需要的子文件夹或文件。(浅克隆还意味着--single-branch,这也很有用。)请参见udondan's answer中的示例。
此外,我使用一个bash循环来不断重试,直到成功为止。像这样:
#!/bin/bash

git init <repo_dir>
cd <repo_dir>
git remote add origin <repo_url>

# Optional step: sparse checkout
git config core.sparsecheckout true                     # <-- enable sparse checkout
echo "subdirectory/*" >> .git/info/sparse-checkout      # <-- specify files you need

# Keep pulling until successful
until $( git pull --depth=1 origin master ); do         # <-- shallow clone
    echo "Pulling git repository failed; retrying..."
done

通过这种方式,即使在中国使用缓慢的VPN,我最终也能够拉取大型仓库...

重要的是,通过这种方式拉取,您仍然可以推送。


2

我使用具有shell访问权限的web托管服务器首先克隆了它,然后使用rsync将其复制到本地。当恢复时,rsync只会复制剩余的文件。


在共享主机中,不提供Shell访问权限。 - khunshan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接