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


192

我正在尝试git克隆LibreOffice代码库,但是目前我的Internet连接大约为300kbps,这几乎是稳定的。我可以随时恢复连接,但是git clone进程已经停止工作,无法重新运行它。有什么方法可以下载更具抗故障能力的git clone吗?

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


6
您需要克隆所有修订,还是仅克隆最新的?也许depth -1是一个解决方案?
Takehin 2010年

1
对于诸如repos之类的仓库,捆绑方法已经存在kernel/git/torvalds/linux.git。正在讨论可恢复的git克隆(2016年3月)。请参阅stackoverflow.com/a/29192890/6309
VonC

我想知道。不会做git init,先设置一个遥控器,然后再取回直到成功,这有什么用?我认为,如果连接失败,则抓取不会丢弃成功下载的对象。
АндрейБеньковский

@АндрейБеньковский有人尝试过吗?
William Entriken '17

Answers:


71

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

可重启克隆

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

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


更新资料

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


感谢您提供的信息,因此我的问题已广为人知,并且正在研究解决方案...作为替代方案,您会建议什么?
LaPingvino

9
就在昨天,由于这个问题,我损失了我的600卢比(10美元)。在我的世界中,互联网带宽是非常宝贵的东西。
阿米特·辛格·托马尔

2
很多人要求更新,没有人分享他们对解决方案的贡献。
William Entriken '17

2
18年3月-卢金仍然...在这个地球上!!
Earthling

3
11年后,谷歌利用谷歌光纤和谷歌Fi攻击带宽不可靠的潜在社会经济问题,结果喜忧参半。在路易斯维尔市,它的纤维微沟槽被太浅地切成沥青,工作后不久发现电缆从路面突然冒出。同时,--depth 1并且--unshallow似乎经受了多年的使用。
rwong

126

我想到了两个解决方案(或更确切地说,解决方法):

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

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


3
浅层克隆技巧在实践中效果不佳。克隆包装良好的仓库(git://libvirt.org/libvirt.git)会将68M传输更改为61M + 35M传输。优先于工作树而不是深度1的所有分支的功能可能会更好;恢复会话仍会更好。
东武2012年

1
@Tobu:浅克隆技巧可能在具有lonG历史记录的存储库中起作用。目前正在进行一些工作,以使浅层克隆默认情况下仅获得单个分支。那可能有所帮助。或不。
雅库布·纳伦斯基(JakubNarębski)2012年

6
现在使用git 1.7.10 确实可以很好地工作。Git存储库的初始depth = 1克隆仅为4.72Mb,而整个存储库为55Mb。进一步的提取可以根据您的需要进行最小化(深度= 100给我带来了约20Mb的提取)。一次克隆和3次提取后,总压缩下载量为31Mb。
naught101 2013年

2
@ naught101它会下载对象以进行一个修订,如果源代码本身很大(不是历史记录),那么它将再次成为问题……
2014年

1
for m in $(seq 1 50);do git fetch --depth=$[m*100];done为我工作,谢谢!:)
Trass3r

15

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

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


我试过--bare选项,它创造的内部repo.git git的内部文件预期的内容,我不得不这样做git的克隆文件:///path/to/repo.git/获得实际的仓库
PiyusG

1
Linus 并没有 “通过“第三方服务器” 拥有GitHub ”,您实际上是说“ Git服务器不会将其用户关押得太重,以至于禁止rsync(1) 使用GitHub看着我的方式使用它们”?或者,您是要先git clone 第三方服务器上然后将其重新同步到本地计算机上?
JamesTheAwesomeDude18年

12

永远不要低估鸽子和SD卡的带宽 ”将是这个答案的现代形式。把它焦油起来,把它弄旧cp -a,不管用什么,然后邮寄该死的东西。找到愿意花两分钟时间将拇指驱动器放入SASE的人。在那里找到一个联系人,他们甚至可以为您做。


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)的服务器将与该目录相同。如果您使用网络下载器(例如wget -m -np)来复制这些目录,则可以从该副本进行克隆,并且可以像直接从http存储库中克隆一样进行复制。

因此,您可以做的是:对于每个存储库,请使用您喜欢的Web下载器(该文件将处理恢复断点续传的所有问题)获得一个副本,然后从该副本中进行克隆。当您要更新时,请再次使用您喜欢的Web下载程序来更新副本,然后从该副本中提取。现在,您的克隆和更新可以像最喜欢的Web下载器一样抵抗不良连接。


他们现在已转换为一个存储库,尝试您的技巧wget决定立即下载该站点……(现在重试,可能稍后再更新...)
LaPingvino

您的命令似乎获得了网站上的所有链接,这并不是要发生的事情。我求助于编写一个似乎可以在此处使用的脚本:gist.github.com/1307703 无论如何,非常感谢您的最初想法!
LaPingvino 2011年

有趣的主意,我正在尝试从github获取ruby / ruby​​仓库,而我却被robots.txt阻止...有什么建议吗?
hanetzer 2014年

6

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

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

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

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

git checkout --force <branch>

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


1
它无法按照您所描述的方式工作,在提取
失败

就像我说的那样,一旦您假设获取成功完成,就可以运行git reset。如果您的提取中断,则重置将不起作用。您需要A)反复尝试再次获取直到它可以工作为止,或者B)放弃此操作并尝试其他操作。
cowlinator

我做了奇迹般的工作。我做了一个git pull而不是git fetch =)
MaikoID

@MaikoID我相信git pull只是在内部调用git fetch,然后合并,所以该命令应该
有所作为

4

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


4
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

4

基于基于克隆/深度的答案-几行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


谢谢,它似乎可以正常工作,我正在尝试克隆Arduino,它的25%容量约为800MB,并且崩溃了。分批下载似乎更安全,但不一定要以1为步长,也许10或50更好,具体取决于更新方式,可以想象有8万个文件,所以写得很少。使用:中的m seq 1 10 1000;执行git pull --depth = $ m; done以获取10的步骤。PS如果执行Ctrl + CI,则仅丢失当前程序包,可以重新开始
user3394963

3

这个问题也困扰着我。就我而言,有一种解决方法。它可能适用或可能不适用于您的情况。

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



2

使用CNTRL Z停止克隆。不要关闭终端,使其进入休眠状态,然后再通过fg命令继续操作。我今天在尝试克隆rem frm github时也遇到了同样的问题。这为我节省了时间。


1

我想把我的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的存储库,当然我必须执行提取操作并提取几次,但是仍然...


1

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

脚步:

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

谢谢。快乐编码!


0

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

  1. 使用服务器端创建你自己的服务器的Git包装
  2. 将其克隆到您的服务器中
  3. 邮编它使用服务器端压缩归档
  4. 从服务器端简历下载中下载并获得支持

但这仅适用于非常基础的Web开发经验;),并且您也需要git.exe服务器


0

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

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

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

奇迹般有效...


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文件


-1

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.