
解决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]
更多推荐
所有评论(0)