标签归档:git

解决拉取github仓库报错“gnutls_handshake() failed”问题

本文首发于:https://blog.frytea.com/archives/421/

gnutls_handshake() failed: The TLS connection was non-properly terminated.

最近为新配置的虚机拉取库,但是从 GitHub 拉取库总是出问题,查阅网上文献将问题锁定在代理,但是找了一圈还是没有找到答案。

经过仔细排查,发现还是由于代理设置有错,为 http 错误配置了 https 的代理,导致出错。

如果没有配置代理,可使用以下命令 取消代理

git config --global --unset http.proxy
git config --global --unset https.proxy

如果需要使用 代理http 协议通过以下命令配置,使用 7890 端口为例:

git config --global http.https://github.com.proxy http://127.0.0.1:7890
git config --global https.https://github.com.proxy https://127.0.0.1:7890

socket 协议通过以下命令配置,使用 7890 端口为例:

git config --global http.proxy 'socks5://127.0.0.1:1080'
git config --global https.proxy 'socks5://127.0.0.1:1080'

也可以这样子 仅代理 GitHub

git config --global http.https://github.com.proxy socks5://127.0.0.1:1080
#取消代理
git config --global --unset http.https://github.com.proxy

拓展阅读

解决git不小心提交大文件导致无法提交问题

在一次不小心向GitHub提交了一个1GB文件后,出现一个令人崩溃的错误:

remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.
remote: error: Trace: a22b6b202ddb6da3e2795ca71663de19
remote: error: See http://git.io/iEPt8g for more information.
remote: error: File system_status/test_26457 is 1024.00 MB; this exceeds GitHub's file size limit of 100.00 MB

更崩溃的是,在此之后又进行了几次提交,可不能因为这次手误丢掉几次提交成果呀。
在网上浏览一圈后找到解决方法:

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch system_status/test_26457'

大概原理是,删除大文件,重新生成commit,但运行后又出现问题:

Cannot rewrite branches: You have unstaged changes.

之后找到一种较为暴力的解决方法:

git stash

在网上找到关于这段命令(git 储藏)的使用场景:

  • 发现有一个类是多余的,想删掉它又担心以后需要查看它的代码,想保存它但又不想增加一个脏的提交。这时就可以考虑git stash。
  • 使用git的时候,我们往往使用分支(branch)解决任务切换问题,例如,我们往往会建一个自己的分支去修改和调试代码, 如果别人或者自己发现原有的分支上有个不得不修改的bug,我们往往会把完成一半的代码commit提交到本地仓库,然后切换分支去修改bug,改好之后再切换回来。这样的话往往log上会有大量不必要的记录。其实如果我们不想提交完成一半或者不完善的代码,但是却不得不去修改一个紧急Bug,那么使用git stash就可以将你当前未提交到本地(和服务器)的代码推入到Git的栈中,这时候你的工作区间和上一次提交的内容是完全一样的,所以你可以放心的修Bug,等到修完Bug,提交到服务器上后,再使用git stash apply将以前一半的工作应用回来。
  • 经常有这样的事情发生,当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。解决这个问题的办法就是git stash命令。储藏(stash)可以获取你工作目录的中间状态——也就是你修改过的被追踪的文件和暂存的变更——并将它保存到一个未完结变更的堆栈中,随时可以重新应用。

解决后,再次修复,重新提交,完成!

$ git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch system_status/test_26457'
Rewrite 11983344a8934d6e9a7a1e225e6d0f6daf3923a4 (15/21)rm 'system_status/test_26457'
Rewrite 49ac22cd47b0504350d3643ff77b09b14f01ed03 (16/21)rm 'system_status/test_26457'
Rewrite 8a721565399d929514e3ed4661ea7c938074eb32 (17/21)rm 'system_status/test_26457'
Rewrite 6e9e291690bdd9923daef62a18d08229dc30a320 (21/21)
Ref 'refs/heads/master' was rewritten
$ git push

参考文献

版本控制及代码托管平台综述

版本控制是协助软件开发的重要工具之一,根据维基百科中“版本控制”词条的描述,版本控制(英语:Version control)是维护工程蓝图的标准作法,能追踪工程蓝图从诞生一直到定案的过程。此外,版本控制也是一种软件工程技巧,借此能在软件开发的过程中,确保由不同人所编辑的同一程序文件都得到同步。

在程式设计中,分散式版本控制(英语:distributed revision control 或 distributed version control,又译为分布式版本控制),又称去中心化版本控制(decentralized version control),是一种版本控制的方式,它允许软件开发者可以共同参与一个软件开发专案,但是不必在相同的网络系统下工作。以分散式版本控制方法,作出的软件版本控制系统,称为分散式版本控制系统(distributed revision control system,缩写为DRCS,或是distributed version control system,缩写为DVCS)。著名的分散式版本控制系统有MonotoneGit等。版本控制可辅助开发者精确记录自己对代码的每一次修改;若在团队开发中则辅助整个团队中的每一个人管理同一项目的每一个版本,保证整个团队共同开发的项目随时保持同步。

综上,版本控制是工程中常用做法,而在软件工程中常用分布式版本控制,在分布式版本控制系统中, Git 最早是根据 Monotone 改写,但通过 Git 进行版本控制的软件源代码托管服务平台 GitHub已经成为了世界上最大的代码存放网站和开源社区。目前许多大型项目和著名项目开源到 GitHub 且使用 Git 做版本控制,如 Linux 内核。因此团队进行软件开发使用分布式版本控制系统是很有必要的,而当前使用 Git 做分布式版本控制系统并搭建基于 Git 的代码仓库是很先进的。

相关背景

上文论证了使用 Git 做分布式版本控制系统的必要性和先进性,在这里介绍相关技术、产品的背景,内容主要来自维基百科。

Git

git(/ɡɪt/)是一个分布式版本控制软件,最初由林纳斯·托瓦兹创作,于2005年以GPL发布。最初目的是为更好地管理Linux内核开发而设计。

git是用于Linux内核开发的版本控制工具。与CVS、Subversion一类的集中式版本控制工具不同,它采用了分布式版本库的作法,不需要服务器端软件,就可以运作版本控制,使得源代码的发布和交流极其方便。git的速度很快,这对于诸如Linux内核这样的大项目来说自然很重要。git最为出色的是它的合并追踪(merge tracing)能力。

GitHub

GitHub是通过Git进行版本控制的软件源代码托管服务平台,由GitHub公司(曾称Logical Awesome)的开发者Chris Wanstrath、PJ Hyett和Tom Preston-Werner使用Ruby on Rails编写而成。

GitHub同时提供付费账户和免费账户。这两种账户都可以创建公开或私有的代码仓库,但付费用户支持更多功能。根据在2009年的Git用户调查,GitHub是最流行的Git访问站点。除了允许个人和组织创建和访问保管中的代码以外,它也提供了一些方便社会化共同软件开发的功能,即一般人口中的社群功能,包括允许用户追踪其他用户、组织、软件库的动态,对软件代码的改动和bug提出评论等。GitHub也提供了图表功能,用于概观显示开发者们怎样在代码库上工作以及软件的开发活跃程度。

截止到2015年,GitHub已经有超过两千八百万注册用户和5700万代码库。事实上已经成为了世界上最大的代码存放网站和开源社区。

2018年6月4日晚上,美国科技公司微软宣布以75亿美元的股票收购GitHub。

GitLab

GitLab是由GitLab Inc.开发,使用MIT许可证的基于网络的Git仓库管理工具,且具有wiki和issue跟踪功能。

GitLab 由乌克兰程序员 Dmitriy Zaporozhets 和 Valery Sizov 开发,它由 Ruby 写成。后来,一些部分用 Go 语言重写。截止 2018 年 5 月,该公司约有 290 名团队成员,以及 2000 多名开源贡献者。GitLab 被 IBM,Sony,Jülich Research Center,NASA,Alibaba,Invincea,O’Reilly Media,Leibniz-Rechenzentrum (LRZ),CERN,SpaceX 等组织使用。

总结

宗上,若公司内部搭建基于版本控制的代码存放网站,可使用私有服务器搭建 GitLab 实现代码托管及权限控制,在客户端使用 Git 进行代码版本控制及代码的拉取和提交。下面介绍搭建 GitLab 所需的软硬件环境。

GitLab 环境需求

硬件要求

  • CPU
    • 1 core supports up to 100 users
    • 2 cores is the recommended minimum number of cores and supports up to 100 users (推荐配置)
    • 4 cores supports up to 500 users
    • 8 cores supports up to 1,000 users
    • 32 cores supports up to 5,000 users
  • 内存
    • 4GB RAM + 4GB swap supports up to 100 users but it will be very slow
    • 8GB RAM is the recommended minimum memory size for all installations and supports up to 100 users(推荐配置)
    • 16GB RAM supports up to 500 users
    • 32GB RAM supports up to 1,000 users
    • 128GB RAM supports up to 5,000 users
  • 硬盘 >= 所有代码仓库所占空间 并为数据库预留 5-10 GB 存储空间

数据库要求

  • PostgreSQL >= 9.6

操作要求

GitLab 支持以下操作系统

  • Ubuntu
  • Debian
  • CentOS
  • openSUSE
  • Red Hat Enterprise Linux (please use the CentOS packages and instructions)
  • Scientific Linux (please use the CentOS packages and instructions)
  • Oracle Linux (please use the CentOS packages and instructions)

软件要求

  • Ruby >= 2.6
  • Go >= 1.12
  • Git >= 2.21.x
  • Node.js >= 8.10.0

总结

综上所述,GitLab 的推荐硬件配置为 2C8GB,接下来介绍 GitLab 的安装。

安装流程

本教程仅简单介绍 GitLab Omnibus package 方式在一台 安装 Ubuntu 操作系统的 服务器/弹性云服务器 上一键安装的方法,更多方法请移步官网文档安装部分https://docs.gitlab.com/ee/install/README.html

代码托管服务器配置(GitLab)

第一步、安装并配置必要的依赖项

$ sudo apt-get update
$ sudo apt-get install -y curl openssh-server ca-certificates

第二步、添加 GitLab 软件包存储库并安装软件包

$ curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bash

接下来使用自己为 GitLab 准备的域名安装 GitLab

$ sudo EXTERNAL_URL="https://gitlab.example.com" apt-get install gitlab-ee

注:若使用 https:// 访问需要验证域名,您也可以使用自己的证书或是使用 http://

也可不指定域名,若不指定安装完成后直接使用服务器 ip 地址 访问 GitLab

$ sudo apt-get install gitlab-ee

第三步、使用域名/IP访问并进行相关配置

第一次进入会要求输入密码,此时设置的密码为 root 账户的密码,此账户为本 GitLab 的最高权限管理员,请妥善管理账号密码。

注册后使用 root 登陆,即可进行添加用户、添加项目、仓库及各种权限管理操作。

本教程到此结束,更多详细内容请移步 GitLab 官方文档: https://docs.gitlab.com/。也可来到我的博客访问 GitLab 部分

客户端配置(Git)

在 Linux 上安装

如果你想在 Linux 上用二进制安装程序来安装 Git,可以使用发行版包含的基础软件包管理工具来安装。 如果以 Fedora 上为例,你可以使用 yum:

$ sudo yum install git

如果你在基于 Debian 的发行版上,请尝试用 apt-get:

  $ sudo apt-get install git

要了解更多选择,Git 官方网站上有在各种 Unix 风格的系统上安装步骤,网址为 http://git-scm.com/download/linux

在 Mac 上安装

在 Mac 上安装 Git 有多种方式。 最简单的方法是安装 Xcode Command Line Tools。 Mavericks (10.9) 或更高版本的系统中,在 Terminal 里尝试首次运行 git 命令即可。 如果没有安装过命令行开发者工具,将会提示你安装。

如果你想安装更新的版本,可以使用二进制安装程序。 官方维护的 OSX Git 安装程序可以在 Git 官方网站下载,网址为 http://git-scm.com/download/mac

你也可以将它作为 GitHub for Mac 的一部分来安装。 它们的图形化 Git 工具有一个安装命令行工具的选项。 你可以从 GitHub for Mac 网站下载该工具,网址为 http://mac.github.com

在 Windows 上安装

在 Windows 上安装 Git 也有几种安装方法。 官方版本可以在 Git 官方网站下载。 打开 http://git-scm.com/download/win ,下载会自动开始。 要注意这是一个名为 Git for Windows 的项目(也叫做 msysGit),和 Git 是分别独立的项目;更多信息请访问 http://msysgit.github.io/

另一个简单的方法是安装 GitHub for Windows。 该安装程序包含图形化和命令行版本的 Git。 它也能支持 Powershell,提供了稳定的凭证缓存和健全的换行设置。 稍后我们会对这方面有更多了解,现在只要一句话就够了,这些都是你所需要的。 你可以在 GitHub for Windows 网站下载,网址为 http://windows.github.com

注:内容来自 git 官网教程:https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git

总结

至此,完整交代了 GitLab 及 Git 的安装配置流程,其中 Git 是版本控制工具,用于拉取、提交及对代码的版本控制;而 GitLab 则是远程的代码托管平台,管理员可对代码仓库进行权限控制保证代码安全。用户在需要的使用使用 Git 从 GitLab 拉取代码仓库的代码,并将编写好的代码通过 Git 提交到远程的 GitLab 代码仓库。使用这一组合可以完美实现代码的管理、版本控制、团队协作及代码仓库的权限管理。

参考文献/推荐阅读

WebStorm中使用Git同步代码到Github

WebStorm下配置GitHub实现代码同步

项目开发时使用GitHub作为公共代码仓库托管代码,可以极大的提高团队合作效率,同时也可以实现代码云端存储等,方便自己也方便大家!下面记录一下自己配置webstorm同步github的过程,仅供参考。

安装git

没什么说的,直接去git官网下载安装即可。

git官网

准备SSH

在进行下一步之前先检查一下计算机中是否有已存在的ssh,打开如下目录C:\Users\songt,其中songt为您的用户名,在该目录下检查是否存在.ssh目录。

情况一-若存在,则表示电脑中存在ssh

可直接复制其中的id_rsa.pub中的内容进行下一步。

情况二-不存在,创建ssh

打开git bash,可通过快捷方式打开,也可通过鼠标右键打开。

打开后在其中运行如下代码

ssh-keygen -t rsa -C “你的邮箱”

我的输入如下图所示

上述代码我运行了两次,暂时不清楚原因。

之后就是三次回车,即可生成ssh。

在我的电脑C:\Users\songt\.ssh目录下可以找到生成的id_rsa.pub文件。

使用ssh

接下来就要配置github,在github中添加我们的git进入github的密钥啦!

打开github

进入个人设置

选择左侧的SSH and GPG keys选项

添加ssh

输入title和key即可,其中title自定义,key内容为C:\Users\songt\.sshid_rsa.pub文件中的内容。(注:文件直接使用记事本打开即可)

ok!

测试ssh是否配置成功

在git bash中运行如下代码

ssh -T git@github.com

若询问Are you sure you want to continue connecting (yes/no)?则输入yes

输入类似下列信息即连接成功

Hi songtianlun! You've successfully authenticated, but GitHub does not provide shell access.

webstorm

配置GitHub

打开webstorm,在file-settings中搜索github,输入自己的账号密码。

若没有异常提醒,就可以看到自己的GitHub了。

配置git

在settings中查找git,将git的安装路径输入,点击text,若没有异常提示则应该可以看到如下界面。

尽情使用吧

代码拉取

准备工作做好之后就可以上传代码啦,打开webstorm,如图

之后会弹出如下窗口,填写实例如图

其中URL填写代码仓库的地址,在图示位置中可以找到。

directory中填写本地项目地址,即您的电脑中存储该项目的路径。

如果上传路径和已有仓库同名产生冲突,直接换个文件夹的路径就好了。

下面信息写给我的同组伙伴们,实践作业的代码仓库地址如下:https://github.com/songtianlun/Gis-ChangChun-Info.git,在url中填入这个地址

注,在在这里的操作是直接将代码仓库中的文件拉取到选择的本地路径,这个路径下的文件夹要保证为空或不存在,webstorm可直接使用这个文件夹作为工程文件打开。

点击clone就会将代码仓库中的内容直接拉取到本地,如图所示。

代码上传

在本地对代码进行了修改,需要上传时,使用VCS-Commit,如图。

点击之后弹出如下窗口

蓝色的文件表示待提交文件,在commit message中简要描述做的修改操作,之后点击commit and push。

成功提交会弹出以下提示。

在GitHub代码仓库中就可以看到刚刚提交的内容了。

在webstorm中如果仅使用commit,不push,则在github中看不到提交的代码,代码仅仅是提交给了git,因此注意提交代码需要使用commit and push!