【问题标题】:How do I clone a large Git repository on an unreliable connection?如何在不可靠的连接上克隆大型 Git 存储库?
【发布时间】:2012-03-05 07:38:56
【问题描述】:

我想克隆 LibreOffice。官网是这样写的:

我们所有的源代码都托管在 git 中:

克隆:$ git clone git://anongit.freedesktop.org/libreoffice/core#(浏览)

克隆 (http):$ git clone http://anongit.freedesktop.org/git/libreoffice/core.git # 更慢

压缩包:http://download.documentfoundation.org/libreoffice/src/

请找到最新版本(通常在底部附近)

现在,当我在 git bash 中编写此命令进行克隆时,它开始获取。但是存储库太大了,几个小时后我失去了几秒钟的连接,它回滚下载,我什么也得不到。

有什么方法可以让我在中断的情况下顺利下载存储库?

附:我是 Git 的新用户,我使用 1 MB 的 DSL 互联网连接。存储库必须超过 1 GB。

【问题讨论】:

  • (离题)直到今天 git 仍然没有解决这个问题,真是令人惊讶!我开始想知道下一代版本控制系统在哪里,不需要命令行,并且可以首先考虑离线和仅移动...

标签: git bash clone git-clone


【解决方案1】:

增加缓冲区大小,以便 git 可以正确利用您的带宽。使用以下命令。

git config --global core.compression 0

git config --global http.postBuffer 1048576000

git config --global http.maxRequestBuffer 100M

git clone <repo url>

等待克隆完成。

【讨论】:

  • 为什么这不是公认的答案。这样就解决了问题。
【解决方案2】:

据我所知,最好的方法是将shallow clone (--depth 1) 功能与sparse checkout 结合使用,即只检出您需要的子文件夹或文件。 (浅克隆也意味着--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,我最终也可以拉出大型 repos……

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

【讨论】:

    【解决方案3】:

    您可以执行以下操作:

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

    第一个clone 仍然是原子的,所以如果您的连接不够可靠,无法获取当前的 HEAD,那么您将遇到麻烦。

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 在共享主机中没有给出 shell 访问权限。
      【解决方案5】:

      可以通过http 协议(又名哑协议)访问存储库: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
      

      【讨论】:

      • 这适用于 LibreOffice,但如果 repo 没有托管在其他任何地方怎么办。
      【解决方案6】:

      执行 'git clone --depth 100' 它应该抓取最后 100 次提交

      【讨论】:

      • 谢谢,这对我的情况很有帮助
      • git fetch --unshallow 已添加到 git 自从编写此答案后
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      • 1970-01-01
      • 2013-11-04
      • 2016-04-28
      • 2013-07-14
      • 2012-07-15
      • 1970-01-01
      相关资源
      最近更新 更多