解决github上大项目的git clone经常失败的问题

      国内访问github的速度很慢且不稳定,当github上项目文件很多或者有几百M的大文件时,使用git clone下载到本地可能会经常失败,例如,报得比较常见的错误:

    RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected length was received

    RPC failed; curl 18 transfer closed with outstanding read data remaining

    RPC failed; curl 56 GnuTLS recv error (-54): Error in the pull function

对于第一个错误,可能是git版本需要更新,删除重新安装一下:

    sudo apt-get purge git
    sudo apt-get install git

对于第二个错误,可能是缓冲区不够,加大缓冲区到500M #或者2G:

   git config --global http.postBuffer  524288000     #2147483648

做了上面的改动如果仍旧下载中途出错,下载速度很慢的话,可以试试设置:

   git config --global http.lowSpeedLimit 0
   git config --global http.lowSpeedTime 999999

如果依旧clone失败,则首先浅层clone,然后更新远程库到本地:

  git clone --depth=1 https://github.com/<repository_name>/<project_name>.git

  下载完后,然后获取所有历史记录:

   cd <project_name>

   git fetch --unshallow

     

       如果上面的方式仍然经常中断下载,那就得换个协议了,一般地,使用ssh协议下载比https下载稳定多了,虽然也不能保证每次都能顺利完成全部下载,但是成功的可能性比git clone https方式高多了。步骤:

   首先得生成个人的rsa key,Linux下执行命令:

    ssh-keygen -t rsa -C "<你注册github账号的邮箱>"    # e.g.,    abc@126.com   

    然后连续回车直至生成公钥和私钥文件,然后打开 ~/.ssh/id_rsa.pub,拷贝其内容,登录Github网站,到你自己的账号里的菜单里去设置:  Settings -> SSH and GPG keys 点 new SSH key后,将从id_rsa.pub文件里拷贝的内容贴到框里确认即可:

      

完后然后就可以执行

     git clone git@github.com:<repository_name>/<project_name>.git了

如果有时还是中断,可以先只clone一层后面再更新全部:

     git clone --depth=1 git@github.com:<repository_name>/<project_name>.git

下载完后,更新全部历史到本地:

    cd <project_name>

    git fetch --unshallow

对于使用秘钥文件登录的云服务器环境,可能实际登录时使用的普通用户,但是执行任何写操作时都得带上超级用户身份,例如Ubuntu下得使用sudo开头,否则报错权限不够:

ubuntu@ip172:/home/ubuntu$ git clone git@github.com:arld/tensorRT_cpp.git 
fatal: could not create work tree dir 'tensorRT_cpp': Permission denied

这时执行即使按上面那样生成并在github上配置了rsa key,使用ssh -T git@github.com命令也提示You've successfully authenticated,但是使用执行sudo ssh -T git@github.com或者sudo git clone命令时还是报错Permission denied:

ubuntu@ip172:/home/ubuntu$ ssh -T git@github.com
Hi arld! You've successfully authenticated, but GitHub does not provide shell access.

ubuntu@ip172:/home/ubuntu$ sudo ssh -T git@github.com
git@github.com: Permission denied (publickey).

这实际上是由于生成ras key时是使用的登录用户,生成在登录用户的home目录下的<home>/.ssh/下,需要把id_rsa和id_rsa.pub文件同时拷贝到/root/.ssh/下,这样才能解决上面的以sudo方式执行读取不到公钥的问题,因为执行命令时是root身份,默认需要从/root/.ssh/下读取rsa key文件!

ubuntu@ip172:/home/ubuntu$ sudo ls /root/.ssh
authorized_keys  known_hosts
ubuntu@ip172:/home/ubuntu$ sudo cp ~/.ssh/id_rsa* /root/.ssh/

再执行sudo ssh -T git@github.com就可以看到You've successfully authenticated了:

ubuntu@ip172:/home/ubuntu$ sudo ssh -T git@github.com
Hi arld! You've successfully authenticated, but GitHub does not provide shell access.

然后就可以使用 

sudo git clone git@github.com:<repository_name>/<project_name>.git了

以ssh方式下载任何公开或者已授权的reprository的代码了。

补充两组和上面无关但是经常可能用到的命令:

循环拉取远程仓库里的所有分支

git clone -b [branch-name] [git-url]  <local_repo_dir> #先拉取一个分支

cd <local_repo_dir>

git fetch --all                                                #获取remote差异

#执行下面的命令之一,拉取本库的所有分支

for i in `git branch -r`; do git checkout `basename $i` && git pull --all; done

for i in `git branch -r`; do git checkout `basename $i` && git reset --hard && git pull --all; done

只取指定commit 版本的代码:
git clone -b [branch-name] [git-url]
git reset --hard [commit-number]

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arnold-FY-Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值