BT

你的观点很重要! 快来参与InfoQ调研吧!

Scott Chacon谈Git和GitHub
录制于:

| 受访者 Scott Chacon 关注 0 他的粉丝 作者 Werner Schuster 关注 4 他的粉丝 发布于 2011年3月9日 | ArchSummit社交架构图谱:Facebook、Snapchat、Tumblr等背后的核心技术
25:53

个人简介 Scott Chacon是GitHub公司的Git传教士和Ruby开发者。他也是多个文献的作者,包括Apress出版的Pro Git,Git内部的Peepcode PDF文档。除此之外,他还经常参加各种会议和当地活动,并在全国范围内为企业提供Git培训。在http://github.com/schacon上可以找到他的很多项目。

之前大获成功的Scotland on Rails Conference更名为Scottish Ruby Conference,继续由举办过2008、2009年活动的原班人马负责,只是有了个更精确的名字和一个令人激动的新会址:位于爱丁堡市中心的皇家医学院。

   

1. Scott,能自我介绍一下吗?

好的,我是Scott Chacon,在GitHub.com工作,它是Git托管服务提供商,该平台是一个社交Git主机,我在那儿工作已经有两年了。基本上我的所有时间都花在Git和GitHub上:演讲、培训、介绍并引导人们使用Git。这就是我的全部。

   

2. 在GitHub.com都做些什么?有什么比较新鲜的东西么?

我们正在做不少事情。有一个叫GitHub:FI的,它可以安装在防火墙内部,是给那些不想把代码托管到GitHub上的大公司来用的。我们已经雇了些人来进一步完善该产品。过去几个月里(可能会延续到下一年),我的一个重大目标就是让GitHub能与其他版本控制系统一起工作。Git是个很棒的工具,由于它的存储机制很简单,所以应用非常广泛。

写一个拥有不同协议的服务器相对比较容易,比如Mercurial或Subversion协议。因为GitHub的目标是不强迫人们使用Git,而是帮助人们以社交方式来编写代码。如果人们想要用Subversion或 Mercurial,我会很遗憾,但是我理解他们。Mercurial确实是一个非常好的工具。我也理解使用Subversion的人们。我们举办了一些Ruby聚会和会议,GitHub正被Ruby社区广泛采用,但是我们想让所有社区都可以工作在一起,而这恰恰是GitHub的优势所在。GitHub的真正优势就是可以让人们找到你的项目,并能很容易贡献其力量。

如果你喜欢其他工具,而且你是一个聪明的开发者,我们希望你也能参与到其他人的项目中。我有一个项目叫做Hg-Git,它是一个Git Mercuial转换层,是个客户端插件,这样你就可以用Mercuial将代码放在Git库中。这是第一步,让Mercurial使用者也能参与到GitHub社区来。现在我们正在对Subversion协议及DAV协议桥(DAV Protocol Bridge)做类似的事情。

将来,你可以运行SVN检出SVN.GitHub.com,不管项目是否与其他项目拥有同一命名空间,都用SVN.GitHub.com来代替。这样,Subversion客户端就可以通过SVN DAV完成检出代码,修改增减内容,再提交补丁等等工作。最终,我想把Mercurial转换层也放到服务器中,这样你就可以hg clone(译注:Mercurail命令)一个GitHub库了。

在服务器上,所有东西都保存在Git里,这样我们管理和转换起来相对比较容易。如果想让尽可能多的人能够一起协同工作,不管他们喜欢的是什么工具,那么,我想在未来一段时间内保持GitHub的应用价值是件好事情。如果10年内有比Git更新更酷更热门的工具出现,我想我们能够很容易对其提供支持,并最终将使其早期使用者可以融入到其他社区。

   

3. 你提到GitHub:FI。它和基于服务的GitHub有何区别?它使用的底层架构是定制的还是与GitHub相同?

其底层架构基本一致。GitHub总的来说是个Ruby on Rails应用,我们还使用了一些Erlang部件,以及MySQL、Redis和Memcache,这些都是系统的重要组成部分。GitHub:FI非常棒,它给你安装好了一切。另外,它是运行在JRuby上的,因此它是个可安装的Java应用,也就是说,我们用JRuby打包了整个GitHub——基本上所有GitHub源代码,在JVM的JRuby上运行GitHub网站。

我们还打包了Memcache、MySQL以及每一样东西。如果你有GitHub:FI二进制文件,你可以把它安装到任何服务器上 ,运行起来几乎与GitHub.com一模一样。对任何公司来说,我们还是希望他们使用GitHub.com,因为更新起来更快更容易。用FI也可更新系统,但是我们必须确定新功能与安装程序及其他所有东西能一起正常工作,才会提供更新包。

我们希望人们成为社区的一部分,尽管可能需要花些时间。如果他们想开放源码,他们应该在GitHub上建立一个公共项目或者他们放上去的与供我们使用的是同一套代码, 而不是整两套独立的代码。但是如果他们是政府或机构,不能把私有代码放在别的服务器上;或者他们是大公司,有政策反对这么做,那么我们希望给他们提供一个能让Git易于使用的工具。

   

4. 使用GitHub:FI时,需要安装像Erlang和MySQL这些东西吧?你是否考虑使用虚拟化技术,向用户提供一个虚拟机镜像?

是的,我们考虑过,但是我们希望它能运行在现有硬件上。如果用户已经有一个跑着别的东西的服务器,我们希望用户能重用(reuse)这个服务器。提供VM给用户,他们还需要自己搭建和运行许多基础设施。比方说,如果他们跑的是Xen而我们给的是VMWare image,或反之,他们不得不再建立另一套虚拟机基础设施,这是件痛苦的事情。

我们已经在考虑提供一个预安装好的服务器,但只提供给购买了GitHub:FI的组织,而且每台机器的license都是需要付费的,所以比较贵。但是,对于不能将代码放在GitHub.com上,但又有此需求的组织,这些组织一般都比较大且有自己的公司政策,他们想获得比控制VM更多的控制力,因此我们还是建议它们走自安装路线。

   

5. 你提到使用Erlang,它用来做什么?

细想一下,我们不认为Erlang是FI的一部分,即便他们在一台机器上。我们将Erlang用在后台。我们有一个联邦数据存储,所有的Git代码库分布在几个不同的文件系统上,而Erlang担任二进制传输器的角色,作为运行Rails的前端与实际拥有Git代码库的后端之间的RPC机制。

当Rails进程需要数据、log列表、树型列表或者其他什么内容,我们使用Grit(https://github.com/mojombo/grit)类库并将前台的东西分离出来,前台调用后台的方法,后台执行fork/exec调用,将此作为RPC机制的补充。RPC机制是基于Erlang二进制格式的,Tom Preston-Werner对其进行了扩展,因而我们能够使用比Erlang原始二进制格式更多的特性。我们能够使用各种各样有趣的东西,比如数组(array)等类似的东西。这就是RPC机制。

它发送一个RPC回调给后台,并进行路由,指出特定项目运行在什么后台上面,将数据包传递过去。后台实际运行命令并发送回数据,这些工作大部分是由Erlang中完成的,并用到了BERT。还有一个Ruby组件,通过它Erlang可以调用后台的Ruby方法,然后转换调用结果并返回。但是所有RPC机制都是由Erlang完成的,Erlang特适合做这方面的事情,实际上也是如此。

   

6. 你提到使用了Redis,怎么用的?

我们将Redis用于异常处理和队列。我们尝试了多种基于Ruby的队列机制。Chris针对这些队列机制写了个抽象层。我们曾使用过BJ、DJ,更早些时候我们还尝试过Amazon SQS及其他多种队列机制,都顶不住我们施加其上的高强度的通讯量,最终我们转向了Chris建立的一个Redis项目,叫做Resque。

它是开源的,可以从GitHub上得到,有些其他公司也用到了Redis,但用的是Redis包。我们用的是Redis list和工作队列这类东西,它非常稳定。如果你正在使用DJ或其他什么东西,而且用得不怎么好的话,那么你就可以试试Rescue。

   

7. 最近你们迁移了服务器,现在正运行在专用机器上,为什么要迁移?为什么从虚拟服务转向了专用机器?

虚拟服务器是在服务器托管提供商那里,他们只提供虚拟服务器,却解决不了我们两个方面的问题。通过迁移,我们同时解决了这两个不相关的问题。一是我们获得了更强大的性能,尤其是在文件系统方面,因为虚拟磁盘的IO比原始磁盘访问要慢得多。这为后台带来了巨大变化,因为Git是极端IO密集型的应用。

如果愿意,我们可以继续在服务器上运行未打补丁的Git,但我们无法就我们的特定需求来真正优化Git。迁移到实机上之后,我们在IO吞吐量方面获得了质的提升。这可能是最大的变化了。在其他的托管服务器提供商那,我们实际上使用的是GFS(全局文件系统),实际上无法应付我们所施加的IO量及所具有的共享系统的数量。

结合基于Erlang的BERT系统,并采用实机运行,大大提升了性能。文件系统力不从心是我们迁移至实机系统的动因。

   

8. 你做Git多年了,不烦么?Git到底有多好?

我还没有厌倦。Git的好处是它非常通用。其背后的存储机制非常通用。实际上我学习Git就是由此开始的。我的前面一项工作就是用它作为一个分布式系统的分布式内容,而我实际上是用Perforce在做源代码控制。我把它作为一个分布式快照系统来学习的,在该系统中我们将为所有客户端所需的内容创建自定义快照,然后通过善于此道的Git机制来了分发他们,该机制只会发送变化的内容和增量更新,因此非常高效。

我就是这么学习它、不断思考它的。你还可以用Git做很多事情,不仅仅是版本控制。我从来没有厌倦过。它非常类似于基于POSIX的文件系统模型。任何普通文件能干的事你都可以用Git来做,不但如此,你还获得了分布式特性、版本标定、以及其他一堆东西。

可以想象得到,有许多有意思的项目在使用Git。它的另一个好处是在其内部是一个键/值存储。你可以用任何键/值存储重新实现Git后台。也可以用Redis来了重新实现Git后台。我就用Cassandra做了一个比较完整的Git。摆弄这些玩意挺有意思的。

通常,做一个像Subversion前端这样的东西就够用了,然而,给Mercurial后台数据库做一个Subversion的前端、一个Mercurial前端或Git前端就比较复杂了。因为它是基于文件的增量系统,与Git的抽象并不相同。你可以用它做很多好玩的东西。

   

9. 你提到了用Git作为存储格式。你知道还有其他项目这么用么?

有许多基于备份的系统都在用,如Apple的Time Machine。因为它非常类似于TimeMachine看待数据的方式,它将数据看作是到内容相同的文件和目录的硬连接。我不知道怎么去描述它,但有个叫做BUP的项目在用,该项目实际是在做相对高效的虚拟机备份工具。有几个基于备份的系统都是基于Git的,挺有意思。这些项目都很酷。我就做了这么一个系统叫做Ticket,用来保持标签数据的。

因为你的项目可以有多个不相关的分支,因此Git没有一个公共的base,因此你可以有几个毫不相干的分支。你可以有个标签分支用来保存项目的标签信息,但它并不是你的项目的子目录,而是与项目目录同级。这样做的好处是它不会搞乱你真正的项目。你可以用很多东西。

你还可以有一个文档(documentation)分支,这只是一个文档而不是文档子目录。提交增加新文档并不会弄乱项目的历史。在GitHub里,有趣之处是如果你在Git库里创建了一个特殊名字的分支——DH-pages,并把它推送给我们,那么你就会有一个静态HTML,我们将把其作为你的站点,做为你项目的文档或web站点。

许多人在GitHub上将该分支用做其项目的主页,给随便用个静态页面并将其放在单独的分支里,这不会对你的主项目历史有任何影响。这非常酷。由于Git的这种泛化特性,你可以做很多奇妙的事情。

   

10. 如今有哪些工具支持Git?Git主要基于C,还是有其它实现?

大多是基于C的二进制程序,不过有两种不同的实现。有很多GUI是构建于C二进制程序之上的,比如Git扩展,或者Tortoise Git for Windows,又或者Git X。它们会调用(fork/exec)二进制程序并处理git数据。Git的好处是拥有很多管道命令,你可以运行更多底层命令而不是仅仅执行一个“add”或“commit”。这样,前端通过调用这些管道命令从而可以做很多底层的东西、机器可懂的非常具体的东西。这是一类。另一类是相当完整的Java实现,比如Google的Shawn Pearce所实现的JGit。JGit项目被融入了许多基于Java的IDE,所有功能都是用Java跑的。还有一个叫Smart Git的项目,它是用Java写的一个非常好的跨平台Git客户端,你可以在任何地方运行它,其表现一致且非常完整,这是一个非常不错的工具。

另外还有与IDE的集成。Eclipse.org开始向Git迁移,把Git作为其所有产品的主要库格式,他们正在全力做这件事,Shawn也正在集中精力做EGIT项目,这是一个Eclipse插件,现在已经相当稳定了。所有基于Java的IDE要么使用EGit工具,要么利用JGit实现来编写自己的插件。

   

11. Git在Windows上应用的如何?

有很多人是在Windows上使用Git的,等我咨询过这些朋友之后再告诉你吧。我在Windows上使用过Git,都是在我做公司演示或者只有Windows机器可用的情况下。在Windows上,它是可以运行的,而且在我演示或教学过程中它工作得很好。只是有些时候比较慢,因为Git利用了很多POSIX特有的东西来加快速度。

要在Windows上运行Git,必须得有POSIX模拟层,但在Windows上运行肯定是可行的。现在有很多在Windows上跑Git的人,特别是那些使用Eclipse集成工具或JGit工具的人,可以是使用基于Java的东西,它们跑得也很快。这是一两年前的事,现在已经比较好了,明年会更好。

   

12. 我记得你写过一本关于Git的书,叫什么?

是的,它叫做《Pro Git》,由Apress出版。

   

13. 每个人都应该看么?

每个人都应该看一下。这本书有个好处,Apress允许我采用Creative Commons License。你可以在线阅读,所有内容可以在progit.org站点看得到,上面还有我写的blog,那是对内容所作的更新。这本书本身是Markdown格式的。你可以从GitHub.com/progit下载所有该书的例子,这本书的Markdown文件则放在另一个库里。

关于这本书还有很多故事。GigHub公司是一个伟大的公司,他们完全支持这本书成为一本开放的书籍,因此这本书被翻译成了各种语言。现在已经有了中文、日文、德文、荷兰文的全译版。人们正在把它翻译成阿拉伯文、西班牙文以及其他语言,他们的工作非常出色。我负责将全译版纳入进来并发布。

如果你访问progit.org就可以看到该书的各种译文版。在页面的最下面有所有这些译文版的链接。当新的译文版完成之后这些链接会随之更新。这是一件很酷的事情,所有这些译文都采用Creative Commons License,一切都可免费阅读。你可以下载它并将它制作成pdf文件或其他格式。这是个非常棒的项目,另外,我还会在博客中介绍新特性以及书中没有覆盖的方面。

这本书是八月份出版的,已经有7、8个月了。该书由浅至深,触及到了一些高级的东西,但不涉及那些底层的、容易让人混淆的东西。对于这些,我已经贴了一些博文来讲解。如果你想了解新版Git的一些东西,或者一些深奥难懂的东西,也会有系列博文予以说明。

我写这本书是用来作为我培训内容的补充,如果你想要公司级的培训,可以联系GitHub,我可以出来做培训。培训不好的一点是时间比较短,只有一两天时间,我可以涵盖很多内容,但并不能让每个人都成为Git专家。不过,其好处是培训的内容众多,人们能知道它能做什么,然后可以链接到“Pro Git”的相应章节以做进一步学习。

该书是在线免费的,因此大家可以更加深入地阅读。这也是我之所以写这本书的原因,我可以做一个1小时的讲座或8小的培训,之后可以对大家说:“我所讲的就这么多了,如果你们想更加深入的学习Git,可以到网站上读到所有东西。”我觉得这样蛮好,不至于觉得自己就那么抛弃了每个人。

   

14. 你提到了Markdown。你的另一个项目就是用Markdown来做幻灯片演示的,是什么来着?

ShowOff,它也在GitHub.com上,schacon是我的用户名,ShowOff是项目的名称。这个工具非常简单,就是一个基于Markdown的幻灯片播放器,类似于Keynote。我的讲座和演讲数量相当多,而Keynote对于程序员来说有不少这样或那样的问题。我想试着把它扩展一下,在命令行里做许多内容展示和变化来看输出结果,或者高亮展示源代码。

所有这些需求在Keynote里要么不可行,要么很难做到。我费了很多时间来做这件事,并一直保持更新。这个东西是什么呢?其实就是Markdown文件。我用Markdown来写幻灯片,你可以把很多幻灯片放在一个Markdown文件里,也可以将每一步部分放在不同的子目录里,如此各部分在项目之间的移动就变得非常容易。它完全基于文本,你可以在Git里做所有事情,我喜欢这种方式。

你可以fork出一个讲稿并做少许修改,做出一个自己的讲稿。也可以从别人的讲稿中偷、借、拿、拷其中的部分内容来形成自己的讲稿,如果你认为这部分对于你的讲解非常有用的话。用Heroku来上传讲稿非常简单,5分钟即可搞定。所有这些都节省了我大量时间。

有了这些,我可以不亲自处理资料就写出个又长又好的讲稿,非常简单。没有什么图形界面,你只需用TextMate或者VI或者其他任何编辑器来了编辑讲稿,然后由Sinatra服务器来展示Markdown,它是完全基于JS的。

   

15. 我猜我可以把讲稿转换成PowerPoint版本的。

在ShowOff甚至Keynot出现之前,这都是没有问题的。我也是从PowerPoint用起,然后是Keynote,再然后是ShowOff。当然还有其他基于HTML、基于Java script的幻灯片工具也很不错,比如Slidy、S5及其他东西,但是我还是喜欢ShowOff,因为它是全文本的,而且整个是一个项目。你只需要在ShowOff目录下运行showoff服务,然后在浏览器中访问该服务端口并全屏显示就可以了。

实际上前几天我的一个讲稿曾经包含有错误的幻灯片,我所要做的是切换到文本编辑器,找到这个幻灯片,删除它,重新装载,一起就Ok了。这在Keynote里是很难做到的,尤其是语法高亮显示的代码,那会是一张图片,查找起来比较困难。这就是我喜欢ShowOff的原因。

   

17. 在你的帐户下么?

是的。Schacon/ShowOff。我有许多基于Git的项目和讲稿都放在这里。在“Read me”里,我尽量把不同人群用到的例子都归并到examples。实际上我对开发者接受速度感到惊讶,也很高兴。因为开发者喜欢修修补补,喜欢用文本文件及尽量简单的东西。ShowOff是面向开发者的,它对的命令行、语法高亮源代码处理得都很好,这些特性正是开发者想要的,但并不是商务人士所需的。

不过它也可以做到PowerPoints的所有常见变换,我有个列表,罗列了所有已经完成的使用ShowOff项目。我喜欢ShowOff的另一个原因是,它可以装载你项目中的任何JavaScript和CSS文件。因为其大部分是基于JavaScript的,你能很容易理解。它不是系统插件什么的,而只是你放入的一个.js文件,其内容是任何你想用JS做的事情,你装载并运行它既可。我不需要把它并入到ShowOff中,你可以在你自己的项目中使用它。

还有不少小插件或提供辅助功能的东西不一定是通用的。我这里有一个好例子,有一种讲稿格式,大约有20各部分,每部分有20个幻灯片,我忘了叫什么(编者注:Pecha Kucha)。有人写了个JS文件来做这件事,其中一个button中有一个额外的键绑定功能,用来自动为你处理幻灯片转换。

用Keynote或其他什么来做定时是非常痛苦的。如果有JS文件,而且下你知道有这样的讲稿,你只需复制一份就会有定时功能。这一点非常不错,我喜欢。

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT