本来想叫《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。很遗憾,一个人也没有 ?。

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

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

一番研究后,我发现了 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 好久没用了,应该也是一样的),之后的每一次提交都是直接从钥匙串中获取,不需要重新输入密码。

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

秘密

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

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

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

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

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

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

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

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

思考

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

参考链接

在 GitHub 公开仓库中隐藏自己的私人邮箱地址(https://blog.walterlv.com/post/remove-personal-emails-from-public-repos.html),吕毅

git提交到github总是要输入密码_GitHub不为人知的秘密相关推荐

  1. git提交到github总是要输入密码_push到github时,每次都要输入用户名和密码的问题...

    解决方案:方案一: 在你的用户目录下新建一个文本文件.git-credentials Windows :C:/Users/username Mac OS X : /Users/username Lin ...

  2. 使用git提交到github,每次都要输入用户名和密码的解决方法

    使用git提交到github,每次都要输入用户名和密码的解决方法 参考文章: (1)使用git提交到github,每次都要输入用户名和密码的解决方法 (2)https://www.cnblogs.co ...

  3. Git基础:第七、八章 Git提交规范Github/Gitee(github资料附录表)

    文章目录 第七章 Git提交规范 7.1 Commit Message 7.1.1 自动化校验commit message 7.2 Author & Committer 7.3 Changed ...

  4. git提交到github

    第一步:在本机上操作 1.安装 Git 客户端 如何安装不同操作系统的 Git 客户端,参见:http://help.github.com/win-set-up-git/ 2.打开 Git Bash, ...

  5. 使用git将代码提交到github

    第一次代码提交 1.在github新建一个空白仓库 2.进入项目的文件夹打开git 命令端 右键选择git Bash here 3. git init #初始化 4. git remote add o ...

  6. 本地代码替换到某个提交点_github教程 -- Windows平台下如何将项目华丽的提交到Github上...

    一.准备工作 1.下载msysgit (点击下载msysgit) 2.注册github账号,在GitHub上新建项目,点击"New Repository",然后填入项目名称.描述和 ...

  7. git 提交命令_Git和Github快速上手指南

    此教程为从加入github创建一个仓库开始,到使用git命令提交代码到github完成的一个基本完整代码提交使用指南. 1. Github概述 GitHub是一个面向开源及私有软件项目的托管平台,因为 ...

  8. mac电脑Git提交代码到Github提示git-credential-osxkeychain 验证解决方案

    mac电脑Git提交代码到Github提示git-credential-osxkeychain 验证解决方案 参考文章: (1)mac电脑Git提交代码到Github提示git-credential- ...

  9. Git提交项目到GitHub

    一.GitHub新建项目 1.进入Github首页,点击New repository新建一个项目 2.填写相应信息后点击create即可 Repository name: 仓库名称 Descripti ...

最新文章

  1. 51单片机的工作寄存器R0~R7位于内部RAM什么位置
  2. val_loss突然变很大_程干朋说网络营销之网站收录突然降低怎么办?
  3. 想学数据分析但不会Python,过来看看SQL吧(上)~
  4. mysql更新数据 update格式和alter对比
  5. 玩转CocoaPods
  6. 查看openfrie是否连接mysql_openfire连接mysql数据库的字符集问题解决
  7. 《Linux内核分析》第三周笔记 构造一个简单的Linux系统MenuOS
  8. 盘点前 10 名的免费跨浏览器测试工具
  9. Python套接字编程(1)——socket模块与套接字编程
  10. Fragment的使用
  11. SimpleFs文件系统初步一(编译并挂载)
  12. Spring 常用注解
  13. Sparrow 开发板化身电脑音量调节器
  14. 世界上最大的在线学习平台: Coursera 入门指南
  15. 打造前端MAC工作站(五)让我们熟悉一下 MAC 命令行吧!
  16. 港科夜闻|香港科技大学举行第六届冠名教授席就职典礼
  17. android设置头像同时设置模糊背景
  18. HFS,超好用的本地文件分享利器
  19. 【数据结构】第15-16周练习题 查找排序
  20. 数据分析6_视频游戏销售分析_kaggle入门

热门文章

  1. Java ClassLoader setDefaultAssertionStatus()方法与示例
  2. python—os模块、时间模块
  3. mysql saveorupdate_Mybatis SaveOrUpdate插件
  4. c#equals方法源码_C#中的Int32.Equals()方法示例
  5. tohexstring方法_Java Long类toHexString()方法的示例
  6. 在Python中执行while循环
  7. 漫画:如何找到链表的倒数第n个结点?
  8. 面试官 | JVM 为什么使用元空间替换了永久代?
  9. 英语笔记:写作:Recreational activities
  10. Linux ubuntu安装搜狗输入法