标签归档:github

一台机器上Github/Gitlab多账户管理SSH Key切换解决push冲突

问题产生场景


无密码与远程服务器交互的秘密 – SSH

如果采用ssh 协议或者git 协议通过终端命令对远程仓库进行push操作的时候,大概的过程如下:(前提在 Github 上已经配置的本机的 SSH Public Key)

  1. 客户端发起一个 Public Key 的认证请求,并发送RSA Key的模数作为标识符。(关于 RSA Key 详细 维基百科
  2. 服务端检查是否存在请求帐号的公钥(Linux中存储在~/.ssh/authorized_keys文件中),以及其拥有的访问权限。
  3. 服务端使用对应的公钥对一个随机的256位的字符串进行加密,并发送给客户端。
  4. 客户端使用私钥对字符串进行解密,并将其结合session id生成一个MD5值发送给服务端。 结合session id的目的是为了避免攻击者采用重放攻击(replay attack)。
  5. 服务端采用同样的方式生成MD5值与客户端返回的MD5值进行比较,完成对客户端的认证。
  6. 将push的内容进行加密与服务端传输数据。

关于 SSH,请查看 SSH原理简介 ,更通俗易懂的文章请查看阮一峰-SSH原理与运用(一):远程登录 。

具体场景

无论使用哪种代码托管服务商,对于 Git 而言,邮箱 是识别用户的唯一手段,所以对于不同的服务商,由于邮箱不同,那么通过邮件名创建的 SSH Key 自然是不同的,这时候在不同的服务商之间进行 push 命令的时候,Git 是不知道使用哪个 SSH Key ,自然导致 push 的失败。场景如下:

  1. 在公司团队使用搭建的 Gitlab 服务,提交邮箱xirong.liu@corp.xx.com, 个人 Github 服务,提交邮箱 ixirong.liu@gmail.com(Bitbucket 同理)。
  2. 有两个Github账户,不同的账户提交不同的仓库内容。

解决方案

方案一:同一个邮箱

由于邮箱是识别的唯一手段,那么自然的,这两者采用同一个邮箱,生成的 public key 也会是同一个,上传到 Github 或者 Gitlab 上面,在 Git 的配置中 ,设置好 Global 的配置 :git config --global user.name 'xirong.liu' && git config --global user.email 'xirong.liu@corp.xx.com' 进行日常的开发是没有问题的。

实际生活中采用同一个邮箱的可能性并不是太大,这就引出了方案二

方案二:基于config文件

所谓的方案二,原理上就是对 SSH 协议配置 config 文件,对不同的域名采用不同的认证密钥。

git config 介绍

Git有一个工具被称为git config,它允许你获得和设置配置变量;这些变量可以控制Git的外观和操作的各个方面。这些变量可以被存储在三个不同的位置:

  1. /etc/gitconfig 文件:包含了适用于系统所有用户和所有库的值。如果你传递参数选项’--system’ 给 git config,它将明确的读和写这个文件。
  2. ~/.gitconfig 文件 :具体到你的用户。你可以通过传递 ‘--global’ 选项使Git 读或写这个特定的文件。
  3. 位于 Git 目录的 config 文件 (也就是 .git/config) :无论你当前在用的库是什么,特定指向该单一的库。每个级别重写前一个级别的值。因此,在 .git/config 中的值覆盖了在/etc/gitconfig中的同一个值,可以通过传递‘--local’选项使Git 读或写这个特定的文件。

由于采用了不同的邮箱,对不同的服务商进行提交,所以此时我们经常配置的 git config --global 就不能常用了,必须在每个仓库的目录下进行配置自己的用户名、邮箱。(嫌麻烦?xirong 是这么解决的,由于个人的 Github 上有较多的仓库,而自己团队的代码基本上都是稳定的,有数的几个,所以在 git config --global user.email 'ixirong.liu@gmail.com' 中全局配置的是个人邮箱,在团队的项目中配置)

1. 配置 Git 用户名、邮箱

如刚才所说,xirong 的配置如下:

1
2
3
4
5
# 全局配置,Github仓库中默认使用此配置
git config –global user.name ‘xirong’ && git config –global user.email ‘ixirong.liu@gmail.com’
# 团队项目配置,每次新创建一个项目,需要执行下
git config —local user.name ‘xirong.liu’ && git config —local user.email ‘xirong.liu@corp.xxx.com’

2. 生成 ssh key 上传到 Github/Gitlab

ssh key 默认生成后保存在 ~/.ssh/目录下 ,默认为 id_rsa 和 id_rsa.pub 两个文件,由于我们需要分开配置,所以这么做:

1
2
3
4
5
# 生成公钥、密钥的同时指定文件名,Gitlab使用
ssh-keygen -t rsa -f ~/.ssh/id_rsa.gitlab -C “xirong.liu@corp.xxx.com”
# 生成默认,Github使用
ssh-keygen -t rsa -C “ixirong.liu@gmail.com”

命令执行完成后,这时~/.ssh目录下会多出id_rsa.gitlabid_rsa.gitlab.pub两个文件,id_rsa.gitlab.pub 里保存的就是我们要使用的key,这个key就是用来上传到 Gitlab上的。

3. 配置 config 文件

在 ~/.ssh目录下,如果不存在,则新建 touch ~/.ssh/config文件 ,文件内容添加如下:

1
2
3
Host *.corp.xxx.com
IdentityFile ~/.ssh/id_rsa.gitlab
User xirong.liu

配置完成后,符合 *.corp.xxx.com后缀的 Git 仓库,均采取~/.ssh/id_rsa.gitlab 密钥进行验证,其它的采取默认的。

4. 上传public key 到 Github/Gitlab

以Github为例,过程如下:

  1. 登录github
  2. 点击右上方的Accounting settings图标
  3. 选择 SSH key
  4. 点击 Add SSH key

在出现的界面中填写SSH key的名称,填一个你自己喜欢的名称即可,然后将上面拷贝的~/.ssh/id_rsa.pub文件内容粘帖到key一栏,在点击“add key”按钮就可以了。

添加过程github会提示你输入一次你的github密码 ,确认后即添加完毕。 上传Gitlab的过程一样,请自己操作。

5. 验证是否OK

由于每个托管商的仓库都有唯一的后缀,比如 Github的是 git@github.com:*,所以可以这样测试:

1
2
3
4
➜ ~ ssh -T git@github.com
Hi xirong! You‘ve successfully authenticated, but GitHub does not provide shell access.
➜ ~ ssh -T git@gitlab.dev
Welcome to GitLab, xirong.liu!

看到这些 Welcome 信息,说明就是 OK的了。

以后,如果还有任何的需求,都可以这么解决,看下 xirong 的几个托管仓库:

1
2
3
4
5
6
7
8
9
10
➜ ~ ll ~/.ssh
total 40
-rw-r–r– 1 xirong staff 264 Jul 10 14:42 config
-rw——- 1 xirong staff 3243 Jul 10 14:09 id_rsa
-rw——- 1 xirong staff 1675 Jan 28 20:39 id_rsa.gitlab
-rw-r–r– 1 xirong staff 407 Jan 28 20:39 id_rsa.gitlab.pub
-rw-r–r– 1 xirong staff 747 Jul 10 14:09 id_rsa.pub
-rw——- 1 xirong staff 1679 Jun 22 11:42 id_rsa_gitcafe
-rw-r–r– 1 xirong staff 407 Jun 22 11:42 id_rsa_gitcafe.pub
-rw-r–r– 1 xirong staff 9139 Jul 29 15:08 known_hosts

如何高效的使用GITHUB,GITHUB的正确使用方式

转载:http://stormzhang.com/github/2016/07/28/learn-github-from-zero7/

之前发过一系列有关 GitHub 的文章,有同学问了,GitHub 我大概了解了,Git 也差不多会使用了,但是 还是搞不清 GitHub 如何帮助我的工作,怎么提升我的工作效率?

问到点子上了,GitHub 其中一个最重要的作用就是发现全世界最优秀的开源项目,你没事的时候刷刷微博、知乎,人家没事的时候刷刷 GitHub ,看看最近有哪些流行的项目,久而久之,这差距就越来越大,那么如何发现优秀的开源项目呢?这篇文章我就来给大家介绍下。

1. 关注一些活跃的大牛

GitHub 主页有一个类似微博的时间线功能,所有你关注的人的动作,比如 star、fork 了某个项目都会出现在你的时间线上,这种方式适合我这种比较懒的人,不用主动去找项目,而这种基本是我每天获取信息的一个很重要的方式。不知道怎么关注这些人?那么很简单,关注我 stormzhang ,以及我 GitHub 上关注的一些大牛,基本就差不多了。

图片描述

点击下图的 Explore 菜单到“发现”页面

图片描述

紧接着点击 Trending 按钮

图片描述

这个 Trending 页面是干嘛的呢?直译过来就是趋势的意思,就是说这个页面你可以看到最近一些热门的开源项目,这个页面可以算是很多人主动获取一些开源项目最好的途径,可以选择「当天热门」、「一周之内热门」和「一月之内热门」来查看,并且还可以分语言类来查看,比如你想查看最近热门的 Android 项目,那么右边就可以选择 Java 语言。

图片描述

这样页面推荐大家每隔几天就去看下,主动发掘一些优秀的开源项目。

除了 Trending ,还有一种最主动的获取开源项目的方式,那就是 GitHub 的 Search 功能。

举个例子,你是做 Android 的,接触 GitHub 没多久,那么第一件事就应该输入 android 关键字进行搜索,然后右上角选择按照 star 来排序,结果如下图:

图片描述

如果你是学习 iOS 的,那么不妨同样的方法输入 iOS 关键字看看结果:

图片描述

可以看到按照 star 数,排名靠前基本是一些比较火的项目,一定是很有用,才会这么火。值得一提的是左侧依然可以选择语言进行过滤。

而对于实际项目中用到一些库,基本上都会第一时间去 GitHub 搜索下有没有类似的库,比如项目中想采用一个网络库,那么不妨输入 android http 关键字进行搜索,因为我只想找到关于 Android 的项目,所以搜索的时候都会加上 android 关键字,按照 star 数进行排序,我们来看下结果:

图片描述

可以看到 Retrofit、OkHttp、android-async-http 是最流行的网络库,只不过 android-async-http 的作者不维护了,之前很多人问我网络库用哪个比较好?哪怕你对每个网络库都不是很了解,那么单纯的按照这种方式你都该优先选择 Retrofit 或者 OkHttp,而目前绝大部分 Android 开发者确实也都是在用这两个网络库,当然还有部分在用 Volley 的,因为 google 没有选择在 GitHub 开源 volley,所以搜不到 volley 的上榜。

除此之外,GitHub 的 Search 还有一些小技巧,比如你想搜索的结果中 star 数大于1000的,那么可以这样搜索:

android http stars:>1000

当然还有其他小技巧,但是我觉得不是很重要,就不多说了。

有些人如果习惯用 Google 进行搜索,那么想搜索 GitHub 上的结果,不妨前面加 GitHub 关键字就ok了,比如我在 google 里输入 GitHub android http ,每个关键字用空格隔开,然后搜索结果如下:

图片描述

可以看到,基本也是我们想要的结果,只不过排序就不是单纯的按照 star 来排序了。

福利大放送

相信以上三种方法够大家遨游在 GitHub 的海洋了,最后给大家献上一些福利,这些项目是 GitHub 上影响力很大,同时又对你们很有用的项目:

这个项目目前 star 数排名 GitHub 第三,总 star 数超过6w,这个项目整理了所有跟编程相关的免费书籍,而且全球多国语言版的都有,中文版的在这里:free-programming-books-zh,有了这个项目,理论上你可以获取任何编程相关的学习资料,强烈推荐给你们!

俗话说,不会用 shell 的程序员不是真正的程序员,所以建议每个程序员都懂点 shell,有用不说,装逼利器啊!而 oh-my-zsh 毫无疑问就是目前最流行,最酷炫的 shell,不多说了,懂得自然懂,不懂的以后你们会懂的!

GitHub 上有各种 awesome 系列,简单来说就是这个系列搜罗整理了 GitHub 上各领域的资源大汇总,比如有 awesome-android, awesome-ios, awesome-java, awesome-python 等等等,就不截图了,你们自行去感受。

GitHub 的使用有各种技巧,只不过基本的就够我们用了,但是如果你对 GitHub 超级感兴趣,想更多的了解 GitHub 的使用技巧,那么这个项目就刚好是你需要的,每个 GitHub 粉都应该知道这个项目。

这个项目是我一个好朋友 Trinea 整理的一个开源项目,基本囊括了所有 GitHub 上的 Android 优秀开源项目,但是缺点就是太多了不适合快速搜索定位,但是身为 Android 开发无论如何你们应该知道这个项目。

这个项目跟上面的区别是,这个项目只整理了所有跟 Android UI 相关的优秀开源项目,基本你在实际开发终于到的各种效果上面都几乎能找到类似的项目,简直是开发必备。

这个项目是我的邪教群的一位管理员整理的,几乎包括了国内各种学习 Android 的资料,简直太全了,我为这个项目也稍微做了点力,强烈推荐你们收藏起来。

这个就不多说了,之前给大家推荐过的,国内一线互联网公司内部面试题库。

这是一份非常详细的面试资料,涉及 Android、Java、设计模式、算法等等等,你能想到的,你不能想到的基本都包含了,可以说是适应于任何准备面试的 Android 开发者,看完这个之后别说你还不知道怎么面试!

总结

GitHub 上优秀开源项目真的是一大堆,就不一一推荐了,授人以鱼不如授人以渔,请大家自行主动发掘自己需要的开源项目吧,不管是应用在实际项目上,还是对源码的学习,都是提升自己工作效率与技能的很重要的一个渠道,总有一天,你会突然意识到,原来不知不觉你已经走了这么远!

觉得不错,不妨随手转发、点赞,都是对我良心张莫大的鼓励!