github 跟踪上游更新

我司一直使用SDWebImage作为网络图片的异步加载控件,之前一直没有什么问题,最近一个版本更新时发现有个CollectView在iOS 5系统下快速滑动(即快速加载大量图片)时,会有很大机率碰到app不响应的情况,并且xCode完全没有错误定位。

做开发的都知道这种问题是最烦人的,我接手问题后折腾了几个小时也没有结果,后来翻阅SDWebImage的commit历史,才发现早在三个月前就有issue讨论过这个问题,并且原作者已经基本解决这个bug。(但并不完美,因为他们基本上并不愿意在iOS 5这种前两代的系统上花太多时间)。

这个故事告诉我们,不重复开发车轮是好的,使用开源的控件是好事,但不断有人会给源代码做贡献,所有作为使用者,应该经常关注自己使用工具的最新情况。

在github上,由于需要对代码做一些私人定制,我通常会fork要使用的控件,比如laihj/SDWebImage就fork自rs/SDWebImage,那么自我fork那天之后,rs/SDWebImage有了新的commit,我如何更新呢?我发现这个页面上并没有直接提供类似于update from source之类的功能。

github确实不提供这样的功能,我估计是因为代码更新会涉及到冲突和解决冲突这样需要手工参与的操作。所以进行“上游代码的更新”这样的操作需要用本地库作跳板。

简单地说,更新上游代码分三步。

  1. 将上游代码拉到本地
  2. 在本地本并代码,解决冲突
  3. 将本地代码更新到自己fork的库上

基本操作如下:

# 进入本地库
$ cd Spoon-Knife
# 将上游库加为一个remote
$ git remote add upstream https://github.com/octocat/Spoon-Knife.git
# fetch上游库的commit到本地
$ git fetch upstream
# 合并代码
$ git merge upstram/master

这里使用fetch & merge而不使用pull是因为fetch只是取代码下来,并不对你的本地库造成任何影响,而pull使自动合并代码到当前的branch中,如果你想merge之前先review一个什么的,就呵呵了。

顺带一说,很多年不更新的ASIHTTPRequest在iOS 7下有内存泄露的问题,不想完全更换到AFNetWork的开发者可以关注一下OpenFibers的fork