GitHub不为人知的秘密

秘密.jpg

本来想叫《GitHub骚操作》的,发现相关的文章已经有很多,而且和我本章要讲的内容完全不同,所以就换了这个也算贴切的标题。

起因

之前写过一篇文章《VM Manager 插件分享》,事后我发现有个地方不对劲!看之前文章标题大家应该都能猜到,这是一篇分享我自己开发的插件的文章,内容比较简单,没有什么问题,问题是出在这个项目上。

我自己有两个 GitHub 账号,一个用于个人学习和测试(hzh-test),另一个用来做分享(hzh-cocong)。

在以前,我本地用的一直都是 hzh-test 这个账号。VM Manager 这个插件是放在 hzh-cocong 上的,我在一开始开发的时候直接用 HTTPS 地址克隆项目(git clone https://github.com/hzh-cocong/VM-Manager.git),结果如大家所料,代码无法 push 到 GitHub 仓库,因为 push 用的是 hzh-test 身份,而这个项目是属于 hzh-cocong 所有的。于是我设置了本地项目的 user.name 和 user.email,发现还是无法提交,搞了很久都没成功,最后无奈改成 SSH 方式才提交成功。(以前是弄过 SSH 的,只是没完全懂,又觉得麻烦,所以习惯用 HTTPS 的方式)

就这样,项目愉快地上线了,文章也发出去了。虽然没什么人看,但毕竟是自己发布的第二篇文章,所以我还是很关注的,没事我就会去看看有没有人 start 或者 fork。很遗憾,一个人也没有 😅。

在这个过程中,我偶然发现一个问题,请看下图。

7CD0076C-8832-4F44-9B31-41BE51658F24.png

这个项目我不是用的 hzh-cocong 的身份创建和开发的吗?怎么多了个 hzh-test,而且除了最开始的提交,后面的提交都是 hzh-test。真是逆天了!还能不能愉快地玩耍了!

A53D8FB5-071C-4105-98F0-F209BF921289.png

一番研究后,我发现了 GitHub 不为人知的秘密!

缘由

相信不少人第一次用 GitHub 都是去网上搜索教程,而网上的教程第一步大都要我们先设置 user.name 和 user.email 这两个全局变量。于是,自然而然地我们会把这些变量和我们的 GitHub 身份联系在一起。我这个本地 VM Manager 项目默认用的也是全局配置(虽然前面说到我做了修改,不过后面又改回来了),所以在 Git 的历史提交记录中,其记录的是 hzh-test,而在项目提交时所做的密码验证或者 SSH 配置其实只是在确认用户身份(hzh-cocong),和 user.name 和 user.email 没有任何关系。前面说到我修改了 user.name 和 user.email 仍然无法提交就是这个原因。(HTTPS 方式克隆的第一次提交是要输入用户名和密码的,这里也可以看出其是和项目配置无关的,不然怎么还要输入用户名,直接输密码不就行了。)

其实,如果是使用 HTTPS 克隆项目的话,在第一次使用 GitHub 并在提交时输入 GitHub 的用户名和密码后,Git 就会把密码保存在本地钥匙串中(这里说的是 Mac,Windows 好久没用了,应该也是一样的),之后的每一次提交都是直接从钥匙串中获取,不需要重新输入密码。

钥匙串.png

所以我之前切换 GitHub 身份不一定非要使用 SSH,直接修改钥匙串中的用户名和密码,或者删除钥匙串内容(下次提交会重新提示输入用户名和密码),就可以切换身份了。

秘密

问题终于水落石出了,这是由于 GitHub 上的提交记录显示的是我们配置的 user.email 对应的用户,而非真实提交的用户。那这样的话,如果我把本地的 user.name 和 user.email 修改成别人的,岂不是能够伪造出一个“人人为项目做贡献”的假象?答案是“是的”。

不过这里有个前提,你得知道别人的邮箱是什么。网上搜索了一下,很轻松地就找到了方法。这里有详细的教程,有兴趣大家可以去看一下,在 GitHub 公开仓库中隐藏自己的私人邮箱地址,这里我简单说明一下。

随便寻找一个 GitHub 项目,查看最近的提交记录,点击查看更改的内容,如:https://github.com/hzh-test/test/commit/1b8650e55e1a0eb7b1c3c004144587178945593f

326A724C-6372-4305-B3CD-25242988FC8A.png

在地址末位加上 .patch,如:https://github.com/hzh-test/test/commit/1b8650e55e1a0eb7b1c3c004144587178945593f.patch

214708CE-3DDE-4E37-BCC8-98493039D587.png

这样,我们就拿到了别人的邮箱(这个是可以屏蔽的,个人觉得没必要,网上大多也都没有屏蔽)。有了邮箱就好办了,我们直接用以下命令设置项目。

$ git config --local user.name "walterlv"
$ git config --local user.email "xxxxxx@qq.com"

接下来所有的提交就都是用的我们设置的本地用户名和邮箱,于是就有了下面这张图。(我和 walterlv 完全不认识)

E0311163-7D2F-48D8-99C5-674769D15C65.png

虽然我们自己操作的项目可以伪造贡献者信息,但是对于被伪造的用户是没有任何影响的,其个人主页并不会说在最近有参与别人的项目。GitLab 我试了一下,在 Git Log 中是有作用的,不过它在网页上用的是真实提交的用户,所以不会有 GitHub 这个问题。

思考

到这里,秘密不再是秘密。细细想来,其实这也只能是自娱自乐罢了,不过我觉得还是挺有意思的。严格来说,这不是 GitHub 的问题,因为这是 Git 本身拥有的功能,所以不应该算是一个问题,但总是让人觉得有点别扭,不知道大家怎么看?

参考链接

在 GitHub 公开仓库中隐藏自己的私人邮箱地址,吕毅