Github | 如何贡献Android开源项目和提交补丁
-- 作者 谢恩铭 转载请注明出处
之前写了文章 Android开源项目学习 | QKSMS短信App 和 Git,Github和Gitlab简介和基本使用, 今天偶然发现了一个QKSMS的问题(Bug)。
我解决了问题, 并在QKSMS的Github页面上提交了补丁。
正好借此来聊聊如何在Github上为开源项目做贡献, 让你的Github成为你的补充简历, 从此升职加薪, 当上总经理, 出任CEO, 迎娶白富美, 走向人生巅峰, 指(zi)日可待啊~
好了, 开个玩笑。还是踏踏实实做人, 好好学习, 天天向上吧!
前提
首先, 你要会用Git和Github。还不了解的, 去看我上面那篇关于Git和Github的文章。
Github的页面语言是英语, 所以需要英语水平还可以, 不然看不懂, 写不了。
如果你英语还不好, 或者正在入门, 请看: 对于程序员, 为什么英语比数学更重要? 如何学习
实作
首先, 一个Github上的开源项目, 是有作者的, 有的是个人(例如QKSMS), 有的是团队(例如Google的Sample的Github页面: https://github.com/googlesamples) 。
QKSMS的作者是Moez Bhatti, 他活跃度很高:
QKSMS的页面是:
https://github.com/moezbhatti/qksms
创建错误报告
发现一个Github的开源项目的问题(issue)之后, 我们可以在项目页面点击Issues那个标签栏, 去到Issues页面:
点击New Issue(新问题)的绿色按钮来创建一个新的issue:
编辑你的issue, 点击Submit new issue(提交新问题)来提交你的issue。
我创建的issue:
https://github.com/moezbhatti/qksms/issues/585
如下:
可以看到, issue的文本里, 有几个区块, 以后如果用Redmine, Bugzilla这类的Bug合作平台, 也可以遵照下面的格式来描述一个bug:
- DESCRIPTION : 描述。issue的简单描述。我写的是"当在设置的Activity中旋转屏幕, 之后再按回退键, QKSMS奔溃。这个问题同时存在于Google Play上下载的版本和从Github上下载编译的版本。这个问题只发生在进入设置的子类型设置(例如: 外观, 通用, 通知, MMS, QK Reply, 等等)中时"。
- STEPS : 重现issue的步骤。依顺序写下如何重现问题的步骤。
- EXPECTED : 期待的表现。也就是你期待的正确表现是什么。
- OBSERVATIONS : 实际的表现。也就是你观察到的错误表现。
我还附上了Android Studio中复制过来的Logcat的奔溃报告。在Logcat from Android Studio那个区块。
提交补丁
你在代码中做了修改, 测试你的修改没问题了之后, 就可以向Github提交你的补丁啦~
在Git中如何制作补丁呢?
非常简单。用
git format-patch
命令即可。
首先你在Git中提交你的修改
git add QKSMS/src/main/java/com/moez/QKSMS/ui/settings/SettingsActivity.java
git commit -m "Fix crash when backPress from SettingsActivity after Orientation changed"
然后, 用git log来查看你刚提交的commit和之前的一个commit:
git log
可以看到, 我们刚才提交的commit, 其hash值是c0c949a4a0812e27f1102e566e8c11fe82b29dc5, 而前一个commit的hash值是d50befdf6377ff42d2307ddd59628f0490c3eb86
根据
man git-format-patch
显示的文档所说, git format-patch 后接你的改动从哪里开始的那个commit的hash值, 因为我们的改动是基于前一个commit(hash值为d50befdf6377ff42d2307ddd59628f0490c3eb86), 因此, 要生成patch补丁, 只需:
git format-patch d50befdf6377ff42d2307ddd59628f0490c3eb86
可以看到, 它为我们生成了补丁文件:
0001-Fix-crash-when-backPress-from-SettingsActivity-after.patch
就在当前目录里:
补丁的改动如下:
可以用
git show
来查看
补丁在这里
直接在错误报告里提交补丁
如果你对代码的改动很少, 那么可以考虑制作patch(补丁)文件, 然后直接用评论附件形式上传到你刚才创建的错误报告中:
在下面所示的方框中(Leave a comment)编辑你的comment(评论), 你随时可以预览你的评论, 点击Preview(预览)即可, 要回到编辑模式, 点击Write(写)。
然后看到有一段文字: Attach files by dragging & dropping or select them.
意思是: 你可以拖动文件到这个编辑框来附上你的文件, 或者也可以点击"select them"来手动选择文件。
不管你用哪种方式, 把文件附上之后(我这里的补丁文件名是0001-Fix-crash-when-backPress-from-SettingsActivity-after.patch.txt ), 点击绿色的Comment按钮, 评论就被提交了, 文件如下图中红框所示。
我在评论里说: "我创建了一个补丁, 修正了这个问题, 而且也同时修正了一个小问题, 就是在设置页面的子类型页面中, 如果旋转屏幕, 会自动回到设置页面的主页面。不过您也许会想到更好的解决方案。"
PS: 因为Github不能提交patch结尾的文件, 所以我把补丁文件改成了以.txt结尾, 但并不妨碍打补丁。
在Git中如何打补丁呢?
非常简单:
- cd到项目根目录下
- 用git apply命令, 后接补丁文件的路径
- git add 修改的文件
- git commit
- git push
实际操作:
cd ~/qksms
git apply ~/Desktop/0001-Fix-crash-when-backPress-from-SettingsActivity-after.patch.txt
git add QKSMS/src/main/java/com/moez/QKSMS/ui/settings/SettingsActivity.java
git commit -m "随便你写什么"
git push origin master # 或者提交到其他分支
创建新的分支来提交补丁
如果你的改动比较多, 你就不能在错误报告的评论里附上一个小小补丁文件就了事了, 最好用创建分支的方式来提交你的pull request(提交请求)。
如果你是Github的开源项目的作者本人或者是被作者指定的贡献者, 你可以直接git push你的branch到项目代码仓库, 然后可以直接创建pull request。
点击Pull requests标签, 进入Pull requests页面:
点击上图中 New pull request
然后选择你提交的分支和你要合并的目标分支。
但是, 一般我们都是游客, 没有权限git push到开源项目的代码仓库。
所以需要用另一种方式来提交补丁, 可以称之为 pull request by comparing across forks (通过对比交叉复刻来提交请求)。
首先, 我们需要fork(复刻)这个开源项目, 点击下图中的fork按钮:
稍等片刻, 开源项目就被复刻到你的个人Github目录了, 如下:
可以看到, 现在我自己的Github仓库已经有了这个开源项目的代码, 不过标明了 "forked from moezbhatti/qksms", 就是说这个仓库不是我自己的, 是从moezbhatti/qksms项目复刻过来的。
接着, 你用git clone来把复刻的项目拉取到本地:
首先, 点击上图中 Clone or download按钮, 复制那个链接: https://github.com/frogoscar/qksms.git
然后在终端里输入:
mkdir github
cd github
git clone https://github.com/frogoscar/qksms.git
cd qksms
你可以先git checkout -b来基于master分支创建一个你自己的分支(名字随便取), 直接改动代码, 然后修改代码, 假如你的补丁, 再git add, git commit, git push。
git checkout -b enmingxie/Fix_crash_when_backPress_from_SettingsActivity_after_Orientation_changed
因为我之前已经从其他地方创建了补丁, 因此, 我就不手动改代码了, 直接用git apply来打补丁。
git apply ~/Desktop/0001-Fix-crash-when-backPress-from-SettingsActivity-after.patch
通过git status命令(上图中看到的git st是我自己配置的alias), 我们可以看到QKSMS/src/main/java/com/moez/QKSMS/ui/settings/SettingsActivity.java文件被改变了,还没有git add, 因此:
git add QKSMS/src/main/java/com/moez/QKSMS/ui/settings/SettingsActivity.java
git commit -m "Fix crash when backPress from SettingsActivity after Orientation changed"
git push origin enmingxie/Fix_crash_when_backPress_from_SettingsActivity_after_Orientation_changed
输入你的github用户名和密码(如果你配置了SSH, 则不必输入)。
再到Github的项目页面, 点击F5刷新, 可以看到刚push的enmingxie/Fix_crash_when_backPress_from_SettingsActivity_after_Orientation_changed这个branch(分支)已经有了。
此时, 再去开源项目页面, 首先:
- base fork那里, moezbhatti/qksms是QKSMS的代码仓库。
- base那里, master表示是QKSMS的master分支(主分支)。
选择对应分支:
- head fork那里, frogoscar/qksms是我的Github上的复刻的QKSMS的代码仓库。
- compare那里, enmingxie/Fix_crash_when_backPress_from_SettingsActivity_after_Orientation_changed是我刚push的分支。
可以看到我的分支与开源项目(QKSMS)主分支(master)的(diff)改动了:
然后点击 Create pull request (生成提交请求), 编辑提交请求的文本, 再点击Submit pull request, 就完工啦!
这样, 作者审核你的分支之后, 就可以决定是否使用你的补丁啦!
恭喜你! 第一个递交的Github补丁! 加油~
Github | 如何贡献Android开源项目和提交补丁相关推荐
- GitHub优秀的Android开源项目
原文地址为http://www.trinea.cn/android/android-open-source-projects-view/,作者Trinea 主要介绍那些不错个性化的View,包括Lis ...
- GitHub 优秀的 Android 开源项目 淘宝技术牛p博客整理开发中最常用的GitHub上 优秀的 Android 开源项目整理(精品)...
原文地址为http://www.trinea.cn/android/android-open-source-projects-view/,作者Trinea 主要介绍那些不错个性化的View,包括Lis ...
- GitHub 优秀的 Android 开源项目 转自http://blog.csdn.net/shulianghan/article/details/18046021
原文地址为http://www.trinea.cn/android/android-open-source-projects-view/,作者Trinea 主要介绍那些不错个性化的View,包括Lis ...
- GitHub 优秀的 Android 开源项目(值得研究)
转自:http://blog.csdn.net/shulianghan/article/details/18046021 主要介绍那些不错个性化的View,包括ListView.ActionBar.M ...
- 【转】GitHub 优秀的 Android 开源项目
转自:http://blog.csdn.net/shulianghan/article/details/18046021 主要介绍那些不错个性化的View,包括ListView.ActionBar.M ...
- GitHub 优秀的 Android 开源项目——转自多篇网络文章
GitHub 优秀的 Android 开源项目 转自:http://blog.csdn.net/shulianghan/article/details/18046021 主要介绍那些不错个性化的Vie ...
- GitHub 优秀的 Android 开源项目 - 让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) - 博客频道 - CSDN.NET
原文地址为http://www.trinea.cn/android/android-open-source-projects-view/,作者Trinea http://www.cnblogs.com ...
- 回顾 | 在 GitHub 上贡献到开源项目
点击蓝字 关注我们 精彩回顾 GitHub 是世界上最大的开源社区,拥有数百万个开源项目.GitHub 的优势之一是在项目上进行协作非常容易.在本研讨会中,我们将介绍在 GitHub 上找到开源项目并 ...
- 2016年GitHub上史上最全的Android开源项目分类汇总
以下内容为转载 版主原网址 http://itindex.net/detail/51896-github-android-开源 GitHub上史上最全的Android开源项目分类汇总 今天在看博客的时 ...
最新文章
- fork()会拷贝子线程吗?
- python中实现多线程的几种方式
- 入职必备两小时入门SVN(二)
- 友益文书类似软件_网易有道词典笔,让你的英文书也有实时翻译功能
- json、js数组真心不是想得那么简单
- 算法之【大整数乘法】
- Spring 核心控制器DispatcherServlet(二)
- 亚马逊表示并未放弃WP平台:正在打造新应用
- matlab模糊数学隶属问题,模糊数学模型matlab
- 汉字编码计算机,计算机汉字编码,computerbased Chinese codings,音标,读音,翻译,英文例句,英语词典...
- 京东面试Java后台--2018年9月16号(星期日)
- mac下玩英雄联盟LoL国服的新办法
- JavaScript:100以内质数1000以内的质数显示和统计
- 重拾Java基础知识:IO流
- laydate点击输入框闪一下不见了_ps文字工具打字不显示,应该如何解决?
- [机器学习] 深入理解 目标函数,损失函数和代价函数
- 15岁极客王逸翛:希望大家都有“开源精神”
- 一款用autoit3写的小游戏,大家娱乐下
- Beta冲刺-第四天
- 520男生送什么礼物特别、2022特别礼物合集