2017-02-25 15:46:41

Github笔记

静态图片

为了安全浏览器左上角的小绿锁,github使用了一个图片代理工具,用来将http以及https外链图片转为github静态资源域名开头的图片链接.

尴尬的是,这个图片代理工具支持的图片,默认最大为5M,然而github改成了500K,这导致非常多的gif图片直接被裁剪了长度,导致播放不完整

为了避免被裁剪,一般都采用将图片扔进仓库的策略,这样github就不会做代理了

编辑Label

大型项目中,issue与PR上的Label是很重要的

但是,初入github的同学可能找不到在哪里编辑Label,按如下两图就可以找到了:

公共wiki

github的wiki默认只能由有collaborators编辑,但是可以在仓库setting中给所有人都开放权限.

即使开放给所有人,github的门槛也足够过滤掉一大堆人了

README.MD

仓库中任何目录下的README.MD都会被github当做markdown来展示,README.MD不存在则展示README.TXT

这里的大小写十分有意思,例如,单独存在的readme.md或README.MD都会被展示,如果他们同时存在,则是只显示一个.

另外,github默认没法生成目录(Table Of Contents, 简写为TOC),优秀的文档请至少包含TOC

commit owner

未使用GPG KEY前,在任何仓库中都可以伪造其他人的commit.

这是因为,github会默认根据commit中owner的邮箱在github用户中寻找对应用户,如果找到了,这个commit就会算给这个用户.

两步验证

如果github已经在你的程序生涯中占了很大部分,那么请关注它的安全性.

开启两步验证是最好的选择,首先它开启简单,其次很多组织要求必须要有两步验证才能加入

未安装谷歌框架的安卓用户可以下载DUO MOBILE,其他可安装谷歌的Google Authenticator

使用HTTPS

使用HTTPS进行git操作时,git或对应的GUI软件可以记忆用户输入的密码.

如果使用SSH,那么git每次push都会让你输密码,即使是GUI,也要求在第一次启动时输入密码,非常繁琐.

更何况,gitlab等很多私有仓库使用方,根本就不会开放SSH端口

更安全地删库

删github的仓库时github会要求输入仓库名,此时加上用户或组织的前缀也可以通过验证,如下图

这至少会让你思考一下你删的库到底是fork的库还是源仓库

因为博主目睹了一次删库(仓库的库)的悲剧

显示组织图标

加入组织后,默认是不会把组织图标显示给其他人看的,而有些组织的图标还是挺好看的

需要自行在组织中将自己的类型从private改为public

rebase

github合并分支时,有一个非默认的rebase选项。这个选项其实全称为merge and rebase,它由如下两部分构成

  • merge
    • 会额外产生一个全新的merge commit,用以记录这个合并操作
  • rebase
    • 将合并进去的commit拿出来rebase掉,其中包含了上面的merge commit,最终产生全新hash的commit

merge产生的那多余的一个commit会出现在目标分支中,如果是一个大的项目,这种commit是完全没有必要存在的,严重影响commit记录的清晰程度

但是,这种rebase会导致用户提交PR的分支被废弃,会出现This branch is 18 commits ahead, 6 commits behind master.这种信息。这是因为,rebase合并进去的commit的hash已经改变了,原分支判断hash不同因此认定commit不同,即使它们的内容是完全一样的。

在这种情况下,请严格按照git工作流来做,即做一个功能就开一个新分支。

squash

同样,如果一个PR中的commit太多,但是合并之后并不需要该PR的多个commit的记录,那么可以使用squash and merge,它会在rebase and merge的基础上,将所有commit全部合并成一个,并且合并的操作者还可以编辑这个新commit的记录再合并

PR的commit的历史记录大部分只在代码审查时有用,合并后就不需要的。大型项目几乎全部都采用squash的形式合并PR,例如node仓库。

需要注意的是,最好不要在fork仓库的分支上进行rebase,否则代码审查记录会丢失,请尽量在github上使用squash and merge来进行合并

.gitattributes

由于本文第一段那个原因,导致经常有仓库中图片占了大头的情况,那么此时github就不会标记这个仓库为哪种语言。此时可以使用.gitattributes文件来指定标记规则,例如:

_screenshot/*.* linguist-language=JavaScript

.gitkeep

这个是纯粹的git问题,原因是,git无法添加空文件夹,只好加一个空文件让git先追踪起来,接着才好用gitignore来忽略这个文件夹里其他的内容。而空文件夹一般就叫.gitkeep了,改成其他名字都可以

本文链接:https://smallpath.me/post/github-notes

-- EOF --