<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/atom10full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en-US">
  <id>tag:github.com,2008:/blog</id>
  <link type="text/html" rel="alternate" href="http://github.com/blog" />
  
  <title>The GitHub Blog</title>
  <updated>2008-07-24T14:45:45-07:00</updated>
  <link rel="self" href="http://feeds.feedburner.com/github" type="application/atom+xml" /><feedburner:browserFriendly></feedburner:browserFriendly><entry>
    <id>tag:github.com,2008:Post/123</id>
    <published>2008-07-24T14:42:27-07:00</published>
    <updated>2008-07-24T14:45:45-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/123-revamping-the-guides" />
    <title>Revamping the Guides</title>
    <content type="html">&lt;p&gt;In an effort to make everyone&amp;#8217;s Git and GitHub experience a little easier, we&amp;#8217;re currently working on overhauling our guides. The first step was to replace the existing guides homepage that just listed all of the guides to a page with much more organization. Thanks goes out to &lt;a href="http://github.com/tekkub"&gt;Tekkub&lt;/a&gt; for spearheading the effort.&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20080724-cmw9r143ek9h2uu7acng75sip6.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;Stay tuned as we&amp;#8217;re currently working on a much larger Git resource site that should ease the pain of beginners and advanced Git folk alike.&lt;/p&gt;</content>
    <author>
      <name>pjhyett</name>
      <email>pjhyett@gmail.com</email>
    </author>
  </entry>
  <entry>
    <id>tag:github.com,2008:Post/122</id>
    <published>2008-07-24T00:22:50-07:00</published>
    <updated>2008-07-24T00:41:33-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/122-embedded-gists" />
    <title>Embedded Gists</title>
    <content type="html">&lt;p&gt;Okay, this is obvious: you can now embed gists directly into your website, blog, project overview, myspace page, whatever.&lt;/p&gt;


&lt;script src="http://gist.github.com/2059.js"&gt;&lt;/script&gt;

	&lt;p&gt;I&amp;#8217;ve personally wanted this for a long time.  May your code forever outlive your blog.&lt;/p&gt;</content>
    <author>
      <name>defunkt</name>
      <email>chris@ozmm.org</email>
    </author>
  </entry>
  <entry>
    <id>tag:github.com,2008:Post/121</id>
    <published>2008-07-22T22:17:56-07:00</published>
    <updated>2008-07-22T22:31:31-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/121-improved-ssh-key-organization" />
    <title>Improved SSH Key Organization</title>
    <content type="html">&lt;p&gt;The original ssh public key interface left a lot to be desired. It&amp;#8217;s was bulky, unintuitive, and altogether a pain to manage if you had lots of public keys.&lt;/p&gt;


	&lt;p&gt;With any luck, we&amp;#8217;ve solved all of those issues with our new interface:&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20080723-jgapjsptjjbx5ukn5tgxyhnqhh.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;You&amp;#8217;re now able to assign a name to your keys as well as very quickly add, edit, and delete them. All without having to deal with a bunch of textareas littering the page. We hope you like it!&lt;/p&gt;</content>
    <author>
      <name>pjhyett</name>
      <email>pjhyett@gmail.com</email>
    </author>
  </entry>
  <entry>
    <id>tag:github.com,2008:Post/120</id>
    <published>2008-07-22T15:21:15-07:00</published>
    <updated>2008-07-23T08:00:04-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/120-new-to-git" />
    <title>New to Git?</title>
    <content type="html">&lt;p&gt;Know someone new to Git?  Here are some awesome resources to start with:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.spheredev.org/wiki/Git_for_the_lazy"&gt;Git for the lazy&lt;/a&gt; &amp;#8211; A great guide for beginners&lt;/li&gt;
	&lt;/ul&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://hoth.entp.com/output/git_for_designers.html"&gt;Git for designers&lt;/a&gt; &amp;#8211; No knowledge of &lt;span class="caps"&gt;SCM&lt;/span&gt;?  No problem.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://gitcasts.com/"&gt;GitCasts&lt;/a&gt; &amp;#8211; Short and sweet screencasts on a variety of Git topics&lt;/li&gt;
	&lt;/ul&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://zrusin.blogspot.com/2007/09/git-cheat-sheet.html"&gt;Visual Git Cheat Sheet&lt;/a&gt; &amp;#8211; Everyone loves to cheat&lt;/li&gt;
	&lt;/ul&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="https://37s.backpackit.com/pub/1465067"&gt;37signals&amp;#8217; Git Resources&lt;/a&gt; &amp;#8211; Great lightweight reference to keep handy&lt;/li&gt;
	&lt;/ul&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://eagain.net/articles/git-for-computer-scientists/"&gt;Git for Computer Scientists&lt;/a&gt; &amp;#8211; For the hardcore&lt;/li&gt;
	&lt;/ul&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www-cs-students.stanford.edu/~blynn/gitmagic/"&gt;Git Magic&lt;/a&gt; &amp;#8211; In-depth and hosted &lt;a href="http://github.com/blynn/gitmagic"&gt;right here on GitHub&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://github.com/guides"&gt;The GitHub Guides&lt;/a&gt; &amp;#8211; Guides on a bunch of Git and GitHub related issues&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: Added &amp;#8216;Git for designers.&amp;#8217;&lt;/p&gt;</content>
    <author>
      <name>defunkt</name>
      <email>chris@ozmm.org</email>
    </author>
  </entry>
  <entry>
    <id>tag:github.com,2008:Post/119</id>
    <published>2008-07-21T13:44:32-07:00</published>
    <updated>2008-07-21T13:44:42-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/119-intro-to-gist-video" />
    <title>Intro to Gist Video</title>
    <content type="html">&lt;p&gt;&lt;a href="http://github.com/bryanl"&gt;bryanl&lt;/a&gt; has posted a video explaining &lt;a href="http://gist.github.com/"&gt;Gist&lt;/a&gt;.  Check it out!&lt;/p&gt;


&lt;object width="400" height="302"&gt;    &lt;param name="allowfullscreen" value="true" /&gt;    &lt;param name="allowscriptaccess" value="always" /&gt;    &lt;param name="movie" value="http://www.vimeo.com/moogaloop.swf?clip_id=1381658&amp;amp;server=www.vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;    &lt;embed src="http://www.vimeo.com/moogaloop.swf?clip_id=1381658&amp;amp;server=www.vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="302"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://www.vimeo.com/1381658?pg=embed&amp;#38;sec=1381658"&gt;BryanL demos Gist: A Super Hot Pastebin&lt;/a&gt; from &lt;a href="http://www.vimeo.com/user472736?pg=embed&amp;#38;sec=1381658"&gt;Bryan Liles&lt;/a&gt; on &lt;a href="http://vimeo.com?pg=embed&amp;#38;sec=1381658"&gt;Vimeo&lt;/a&gt;.</content>
    <author>
      <name>defunkt</name>
      <email>chris@ozmm.org</email>
    </author>
  </entry>
  <entry>
    <id>tag:github.com,2008:Post/118</id>
    <published>2008-07-21T13:17:19-07:00</published>
    <updated>2008-07-21T13:19:32-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/118-here-s-the-gist-of-it" />
    <title>Here's the Gist of it</title>
    <content type="html">&lt;p&gt;Pasting has become a huge part of our workflow.  We use it daily, but find most paste tools slightly wanting.  We&amp;#8217;d love versioning.  We&amp;#8217;d love &lt;span class="caps"&gt;SSL&lt;/span&gt; on our private pastes.  We&amp;#8217;d love to fork existing pastes.  And you know what, we&amp;#8217;d love to push and pull our pastes using Git.&lt;/p&gt;


	&lt;p&gt;Well, say hello to Gist.&lt;/p&gt;


&lt;div align="center"&gt;
&lt;a href="http://gist.github.com"&gt;
&lt;img src="http://img.skitch.com/20080721-b6h7wphghhcjrj5g2su7p8d6w5.png"/&gt;
&lt;/a&gt;
&lt;/div&gt;

	&lt;p&gt;It&amp;#8217;s all those things and will soon be more.  We&amp;#8217;ve been working hard on it and hope you like.&lt;/p&gt;</content>
    <author>
      <name>defunkt</name>
      <email>chris@ozmm.org</email>
    </author>
  </entry>
  <entry>
    <id>tag:github.com,2008:Post/117</id>
    <published>2008-07-17T13:18:22-07:00</published>
    <updated>2008-07-17T16:23:52-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/117-scaling-lesson-23742" />
    <title>Scaling Lesson #23742</title>
    <content type="html">&lt;p&gt;GitHub was created as a side project, but it seems to have struck a nerve and gained traction quickly. As such, a lot of the infrastructure decisions were made not figuring on this sort of growth:&lt;/p&gt;


	&lt;p&gt;&lt;img src="http://img.skitch.com/20080717-x9keg72dbypkfbiu3sjc373y1w.jpg" alt="" /&gt;&lt;/p&gt;


	&lt;p&gt;One of the major pieces of the infrastructure is how we store the repositories. The way it was originally setup worked great for a while, but it wasn&amp;#8217;t sustainable.&lt;/p&gt;


	&lt;p&gt;As an example, lets take my &lt;a href="http://github.com/pjhyett/github-services"&gt;github-services&lt;/a&gt; repository. Here&amp;#8217;s where it was stored prior to yesterday:&lt;/p&gt;


&lt;pre&gt;
/our-shared-drive/pjhyett/github-services.git
&lt;/pre&gt;

	&lt;p&gt;Straight forward and simple, as well as having the added benefit of the repo being easily locatable in the file system if we needed to debug an issue.&lt;/p&gt;


	&lt;p&gt;That works well unless you have thousands of folders sitting in the same directory. &lt;a href="http://en.wikipedia.org/wiki/Global_File_System"&gt;&lt;span class="caps"&gt;GFS&lt;/span&gt;&lt;/a&gt; tried as best as it could, but with the amount of IO we do at GitHub writing to and reading from the file system, a change had to be made quickly.&lt;/p&gt;


	&lt;p&gt;After migrating last night, taking the same repository, this is where it&amp;#8217;s currently stored:&lt;/p&gt;


&lt;pre&gt;
/our-shared-drive/5/52/af/b5/pjhyett/github-services.git
&lt;/pre&gt;

	&lt;p&gt;Instead of every user sitting in one directory, we&amp;#8217;ve sharded the repositories based on an &lt;span class="caps"&gt;MD5&lt;/span&gt; of the username. A large change to be sure, but with some number crunching by our very own Tom Preston-Werner, he told me everyone on the planet can sign up twice and we still won&amp;#8217;t have to change the way we shard our repositories after this.&lt;/p&gt;


	&lt;p&gt;Another interesting point worth mentioning is the first directory, &amp;#8216;5&amp;#8217;, was setup specifically so we could add multiple &lt;span class="caps"&gt;GFS&lt;/span&gt; mounts (we currently use just one) using a simple numbering system to help scale the data when we start bumping up against that wall again.&lt;/p&gt;


	&lt;p&gt;Now, the question you may all be asking is why we didn&amp;#8217;t do this from the beginning. The simple answer is it would have taken more time and prevented us from launching when we did. We could have spent a couple of extra weeks in the beginning figuring out and preventing bottlenecks, but the site may not have taken off and then we would have built a scalable site that three people use.&lt;/p&gt;


	&lt;p&gt;Truth be told, it&amp;#8217;s a great problem to have, and the site is humming along smoothly now. Now we can get back to doing fun things like building new features for you guys and gals. Keep an eye out for the big one we&amp;#8217;re launching next week!&lt;/p&gt;</content>
    <author>
      <name>pjhyett</name>
      <email>pjhyett@gmail.com</email>
    </author>
  </entry>
  <entry>
    <id>tag:github.com,2008:Post/116</id>
    <published>2008-07-15T09:36:25-07:00</published>
    <updated>2008-07-15T09:36:37-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/116-easy-peezy-capistrano-deployment" />
    <title>Easy Peezy Capistrano Deployment</title>
    <content type="html">&lt;p&gt;The guys over at &lt;a href="http://github.com/edgecase"&gt;EdgeCase&lt;/a&gt; have written up a guide on &lt;a href="http://blog.theedgecase.com/2008/7/15/easier-capistrano-deployments-from-github"&gt;Easier Capistrano Deployments from GitHub&lt;/a&gt;.  It explains how to setup and use the &lt;code&gt;:forward_agent&lt;/code&gt; option when you deploy.  Nice!&lt;/p&gt;</content>
    <author>
      <name>defunkt</name>
      <email>chris@ozmm.org</email>
    </author>
  </entry>
  <entry>
    <id>tag:github.com,2008:Post/115</id>
    <published>2008-07-14T20:06:32-07:00</published>
    <updated>2008-07-14T20:06:59-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/115-formatted-files" />
    <title>Formatted Files</title>
    <content type="html">&lt;p&gt;Files in your repository are now formatted same as the &lt;span class="caps"&gt;README&lt;/span&gt;.  This means if you have a file with a &lt;code&gt;.markdown&lt;/code&gt; extension, for example, it&amp;#8217;ll show up all pretty-like.&lt;/p&gt;


&lt;div align="center"&gt;
&lt;a href="http://github.com/paltman/django-aws/tree/master/docs/tags.markdown"&gt;
&lt;img src="http://img.skitch.com/20080715-ftakr1an6w5nc6tg46x44ww3g2.png"/&gt;
&lt;/a&gt;
&lt;/div&gt;

	&lt;p&gt;Enjoy.  (Our Git-powered wiki is coming soon&amp;#8230;)&lt;/p&gt;</content>
    <author>
      <name>defunkt</name>
      <email>chris@ozmm.org</email>
    </author>
  </entry>
  <entry>
    <id>tag:github.com,2008:Post/114</id>
    <published>2008-07-14T19:30:24-07:00</published>
    <updated>2008-07-14T19:30:30-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/114-dashboard-widget" />
    <title>Dashboard Widget</title>
    <content type="html">&lt;p&gt;The stand up fellas over at New Leaders have created a &lt;a href="http://newleaders.com/discussions/223-new-git-hub-widget"&gt;GitHub Dashboard Widget&lt;/a&gt; for &lt;span class="caps"&gt;OS X&lt;/span&gt;.  Check it out &amp;#8211; very slick!&lt;/p&gt;


&lt;div align="center"&gt;

	&lt;p&gt;&lt;a href="http://newleaders.com/discussions/223-new-git-hub-widget"&gt;
&lt;img src="http://img.skitch.com/20080715-t6fwn6rgybxu5q2c5m5im23wxi.png"/&gt;
&lt;/a&gt;
&lt;/div&gt;&lt;/p&gt;</content>
    <author>
      <name>defunkt</name>
      <email>chris@ozmm.org</email>
    </author>
  </entry>
  <entry>
    <id>tag:github.com,2008:Post/113</id>
    <published>2008-07-14T01:49:00-07:00</published>
    <updated>2008-07-14T01:50:42-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/113-fork-you-sighting-2" />
    <title>Fork You Sighting #2</title>
    <content type="html">&lt;div align="center"&gt;
&lt;img src="http://img.skitch.com/20080714-1m8jah1usu58qmptxu546jq9x7.jpg"/&gt;
&lt;/div&gt;

	&lt;p&gt;(Thanks &lt;a href="http://github.com/mathie"&gt;mathie&lt;/a&gt;!)&lt;/p&gt;</content>
    <author>
      <name>defunkt</name>
      <email>chris@ozmm.org</email>
    </author>
  </entry>
  <entry>
    <id>tag:github.com,2008:Post/112</id>
    <published>2008-07-13T22:51:17-07:00</published>
    <updated>2008-07-13T22:51:59-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/112-supercharged-git-daemon" />
    <title>Supercharged git-daemon</title>
    <content type="html">&lt;p&gt;Over the past several weeks I&amp;#8217;ve been working on a secret Erlang project that will allow us to grow GitHub in new and novel ways. The project is called egitd and is a replacement for the stock git-daemon that ships with git. If you&amp;#8217;re not familiar, git-daemon is what has, until today, served all anonymous requests for git repositories. Any time you used a command like &lt;code&gt;git clone git://github.com/user/repo.git&lt;/code&gt; you were being served those files by git-daemon.&lt;/p&gt;


	&lt;p&gt;The reason we need egitd is for flexibility and power. We need the flexibility to map the repo name that you specify on the command line to any disk location we choose. git-daemon is very strict about the file system mappings that you are allowed to do. We also need it so that we can distinguish and log first-time clones of repos. Keep an eye out (down the road) for statistics that show you exactly how many times your public repo has been cloned!&lt;/p&gt;


	&lt;p&gt;Another benefit of coding our own git server is enhanced error messages. I can&amp;#8217;t even begin to tell you how many people have come to us complaining about the following error which is caused by trying to &lt;strong&gt;push&lt;/strong&gt; to the public clone address:&lt;/p&gt;


&lt;pre&gt;fatal: The remote end hung up unexpectedly &lt;/pre&gt;

	&lt;p&gt;With egitd we can inject reasonable error responses into the response instead of just closing the connection and leaving the user bewildered. Behold!&lt;/p&gt;


&lt;pre&gt;fatal: protocol error: expected sha/ref, got '
*********'

You can't push to git://github.com/user/repo.git
Use git@github.com:user/repo.git

*********'&lt;/pre&gt;

	&lt;p&gt;Still a little crufty, but until we can get something useful into core git, it&amp;#8217;s the best we can do and should help many people as they learn git and get over some of the confusing aspects.&lt;/p&gt;</content>
    <author>
      <name>mojombo</name>
      <email>tom@mojombo.com</email>
    </author>
  </entry>
  <entry>
    <id>tag:github.com,2008:Post/111</id>
    <published>2008-07-13T22:34:51-07:00</published>
    <updated>2008-07-13T22:45:22-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/111-supercharged-diff-one-liners" />
    <title>Supercharged Diff One-Liners</title>
    <content type="html">&lt;p&gt;I&amp;#8217;ve just added a small diff enhancement that will help you determine what changed in one line diff sections. By highlighting the specific changes, you can now see at a glance what those little changes were in otherwise very similar lines of code.&lt;/p&gt;


&lt;div align="center"&gt;
&lt;img src="http://img.skitch.com/20080714-rgnbptfkncnnfjyygg183htqmu.png"/&gt;
&lt;/div&gt;</content>
    <author>
      <name>mojombo</name>
      <email>tom@mojombo.com</email>
    </author>
  </entry>
  <entry>
    <id>tag:github.com,2008:Post/110</id>
    <published>2008-07-10T13:51:10-07:00</published>
    <updated>2008-07-10T13:51:26-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/110-supercharged-vim-theme" />
    <title>Supercharged Vim Theme</title>
    <content type="html">&lt;p&gt;You TextMate users already have a &lt;a href="http://github.com/blog/73-github-textmate-theme"&gt;GitHub theme&lt;/a&gt;, but now us Vimiacs can join the fun.&lt;/p&gt;


&lt;div align="center"&gt;
&lt;a href="http://blog.menfin.info/post/2008/05/30/Github-theme-for-Vim"&gt;
&lt;img src="http://blog.menfin.info/public/.Github_theme_for_vim_m.jpg"/&gt;
&lt;/a&gt;
&lt;/div&gt;

	&lt;p&gt;Grab the theme &lt;a href="http://github.com/nono/github_vim_theme"&gt;right here&lt;/a&gt;.  Thanks &lt;a href="http://github.com/nono"&gt;Bruno&lt;/a&gt;!&lt;/p&gt;</content>
    <author>
      <name>defunkt</name>
      <email>chris@ozmm.org</email>
    </author>
  </entry>
  <entry>
    <id>tag:github.com,2008:Post/109</id>
    <published>2008-07-09T14:50:29-07:00</published>
    <updated>2008-07-09T14:52:32-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/109-supercharged-commits-on-your-site" />
    <title>Supercharged Commits (on your site)</title>
    <content type="html">&lt;p&gt;&lt;a href="http://github.com/auser"&gt;Ari Lerner&lt;/a&gt; has a &lt;a href="http://blog.citrusbyte.com/2008/6/27/keep-your-site-as-fresh-as-your-code"&gt;blog post&lt;/a&gt; about keeping your site as fresh as your code.  How?  By showing off recent commits.&lt;/p&gt;


	&lt;p&gt;See it in action on the &lt;a href="http://github.com/auser/poolparty"&gt;poolparty&lt;/a&gt; website:&lt;/p&gt;


&lt;div align="center"&gt;
  &lt;a href="http://poolpartyrb.com/"&gt;
    &lt;img src="http://img.skitch.com/20080709-gcxgpsgn82fnwryguafeucknwa.png"/&gt;
  &lt;/a&gt;
&lt;/div&gt;

	&lt;p&gt;Nice.  Anyone have a JavaScript version?&lt;/p&gt;</content>
    <author>
      <name>defunkt</name>
      <email>chris@ozmm.org</email>
    </author>
  </entry>
  <entry>
    <id>tag:github.com,2008:Post/107</id>
    <published>2008-07-08T17:54:22-07:00</published>
    <updated>2008-07-08T18:57:37-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/107-supercharged-ruby-git" />
    <title>Supercharged Ruby-Git</title>
    <content type="html">&lt;p&gt;One of the slowest things you can do in Ruby is shell out to the operating system.  As a contrived example, let&amp;#8217;s open an empty file 1,000 times:&lt;/p&gt;


&lt;pre&gt;
&amp;gt;&amp;gt; require 'benchmark'
&amp;gt;&amp;gt; `touch foo`
&amp;gt;&amp;gt; Benchmark.measure { 1000.times { `cat foo` } }.total
=&amp;gt; 4.51
&amp;gt;&amp;gt; Benchmark.measure { 1000.times { File.read('foo') } }.total
=&amp;gt; 0.04
&lt;/pre&gt;

	&lt;p&gt;The difference is clear &amp;#8211; the very act of shelling out is expensive.  And while 1,000 may seem high, we have plenty of content on GitHub with 30+ shell calls per page.  It starts to add up.&lt;/p&gt;


	&lt;h3&gt;The Problem with Grit&lt;/h3&gt;


	&lt;p&gt;Our Grit library was written as an &lt;span class="caps"&gt;API&lt;/span&gt; to the &lt;code&gt;git&lt;/code&gt; binary using, you guessed it, shell calls.  In the past few weeks, as the site became slower and less stable, we knew we had to begin rewriting parts of our infrastructure.  Response times and memory usage were both spiking.  We began seeing weird out of memory errors and &lt;code&gt;git&lt;/code&gt; segfaults.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://github.com/schacon"&gt;Scott Chacon&lt;/a&gt; had been working on a pure Ruby implementation of Git for some time, which we&amp;#8217;d been watching with interest.  Instead of shelling out and asking the &lt;code&gt;git&lt;/code&gt; binary for information, Scott&amp;#8217;s library understands the layout of &lt;code&gt;.git&lt;/code&gt; directories and uses methods like &lt;code&gt;File.read&lt;/code&gt; to procure the requested information&lt;/p&gt;


	&lt;p&gt;Over the past few weeks we&amp;#8217;ve been working with Scott to integrate his library into GitHub while he adds features and improves performance.  Last night we rolled out a near-finished version of Scott&amp;#8217;s library.&lt;/p&gt;


	&lt;p&gt;The result?  Sweet, sweet speed.&lt;/p&gt;


&lt;div align="center"&gt;
  &lt;img src="http://img.skitch.com/20080709-bcjfn64exkepbt44q2huq316ap.png"/&gt;
&lt;/div&gt;

	&lt;p&gt;Yep, we cut our average response time in half.  (Lower numbers are better.)&lt;/p&gt;


	&lt;h3&gt;Open Source&lt;/h3&gt;


	&lt;p&gt;Scott will soon be merging the changes he made for us into his &lt;a href="http://github.com/schacon/grit"&gt;Grit fork&lt;/a&gt;.  As a result, expect to see other Ruby-based Git hosting sites speed up in the next few weeks as they integrate the code we wrote.&lt;/p&gt;


	&lt;p&gt;We&amp;#8217;re interested in funding the development of other Git related open source projects.  If you&amp;#8217;re working on something awesome that will drive Git adoption, please send us an email.&lt;/p&gt;


	&lt;h3&gt;Future Enhancements&lt;/h3&gt;


	&lt;p&gt;We&amp;#8217;re still working to improve our architecture.  As we roll out more changes, you&amp;#8217;ll see them here.  Everyone loves scaling.&lt;/p&gt;</content>
    <author>
      <name>pjhyett</name>
      <email>pjhyett@gmail.com</email>
    </author>
  </entry>
  <entry>
    <id>tag:github.com,2008:Post/106</id>
    <published>2008-07-07T16:52:29-07:00</published>
    <updated>2008-07-07T16:56:20-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/106-supercharged-downloads" />
    <title>Supercharged Downloads</title>
    <content type="html">&lt;p&gt;The Download button is now supercharged.  It gives you the option to download a Zip version of the repository and suggests other downloads &amp;#8211; recent tags, basically &amp;#8211; giving people have a chance to download your version&amp;#8217;d releases.&lt;/p&gt;


&lt;div align="center"&gt;
&lt;img src="http://img.skitch.com/20080707-dyig6eb7rhmbgi9pb9gbhqtjt5.png"/&gt;
&lt;/div&gt;</content>
    <author>
      <name>defunkt</name>
      <email>chris@ozmm.org</email>
    </author>
  </entry>
  <entry>
    <id>tag:github.com,2008:Post/105</id>
    <published>2008-06-28T19:19:27-07:00</published>
    <updated>2008-06-28T19:24:59-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/105-services-galore" />
    <title>Services Galore</title>
    <content type="html">&lt;p&gt;After &lt;a href="http://github.com/blog/53-github-services-ipo"&gt;open sourcing&lt;/a&gt; the GitHub services code, we&amp;#8217;ve been just floored with the number of pull requests for adding tons of functionality.&lt;/p&gt;


	&lt;p&gt;We launched the service hooks with just Campfire and Lighthouse and now we support Basecamp, Campfire, &lt;span class="caps"&gt;CIA&lt;/span&gt;.vc, Irc, Email, FogBugz, Jabber, Lighthouse and Twitter!&lt;/p&gt;


	&lt;p&gt;You can setup these services up by clicking &amp;#8216;Service Hooks&amp;#8217; under the &amp;#8216;Admin&amp;#8217; tab for the repositories you own.&lt;/p&gt;


Thanks again to the following people (if I&amp;#8217;ve forgotten you, please let me know)
	&lt;ul&gt;
	&lt;li&gt;Blake Mizerany&lt;/li&gt;
		&lt;li&gt;Brandon Keepers&lt;/li&gt;
		&lt;li&gt;Christian Neukirchen&lt;/li&gt;
		&lt;li&gt;El Draper&lt;/li&gt;
		&lt;li&gt;Florian Frank&lt;/li&gt;
		&lt;li&gt;John Nunemaker&lt;/li&gt;
		&lt;li&gt;John Reilly&lt;/li&gt;
		&lt;li&gt;Jorge Bernal&lt;/li&gt;
		&lt;li&gt;Luke Redpath&lt;/li&gt;
		&lt;li&gt;Noah (ngage)&lt;/li&gt;
		&lt;li&gt;Sean O&amp;#8217;Brien&lt;/li&gt;
		&lt;li&gt;Tekkub Stoutwrithe&lt;/li&gt;
		&lt;li&gt;W. Andrew Loe &lt;span class="caps"&gt;III&lt;/span&gt;&lt;/li&gt;
	&lt;/ul&gt;</content>
    <author>
      <name>pjhyett</name>
      <email>pjhyett@gmail.com</email>
    </author>
  </entry>
  <entry>
    <id>tag:github.com,2008:Post/104</id>
    <published>2008-06-26T18:19:40-07:00</published>
    <updated>2008-06-26T18:19:49-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/104-visual-cheat-sheet" />
    <title>Visual Cheat Sheet</title>
    <content type="html">&lt;p&gt;Even if you&amp;#8217;re a Git master, Zack Rusin&amp;#8217;s &lt;a href="http://zrusin.blogspot.com/2007/09/git-cheat-sheet.html"&gt;Git Cheat Sheet&lt;/a&gt; may prove useful.  It&amp;#8217;s got a whole lotta commands ready for cheatin&amp;#8217;.&lt;/p&gt;


&lt;div align="center"&gt;
&lt;a href="http://zrusin.blogspot.com/2007/09/git-cheat-sheet.html"&gt;
&lt;img src="http://ktown.kde.org/%7Ezrusin/git/git-cheet-sheet-small.png"/&gt;
&lt;/a&gt;
&lt;/div&gt;

	&lt;p&gt;Thanks Zack!&lt;/p&gt;</content>
    <author>
      <name>defunkt</name>
      <email>chris@ozmm.org</email>
    </author>
  </entry>
  <entry>
    <id>tag:github.com,2008:Post/103</id>
    <published>2008-06-26T17:22:27-07:00</published>
    <updated>2008-06-26T17:29:46-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/103-new-homepage" />
    <title>New Homepage</title>
    <content type="html">&lt;p&gt;We just rolled out our new and improved homepage.  Here&amp;#8217;s a taste.&lt;/p&gt;


&lt;div align="center"&gt;
&lt;a href="http://github.com/home"&gt;
&lt;img src="http://img.skitch.com/20080627-r14subqdx2ye3w13qefbx974gc.png"/&gt;
&lt;/a&gt;
&lt;/div&gt;

	&lt;p&gt;Logged in users can hit &lt;a href="http://github.com/home"&gt;http://github.com/home&lt;/a&gt; to view it in all its glory.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Added http://github.com/home links.&lt;/p&gt;</content>
    <author>
      <name>defunkt</name>
      <email>chris@ozmm.org</email>
    </author>
  </entry>
  <entry>
    <id>tag:github.com,2008:Post/102</id>
    <published>2008-06-24T21:21:06-07:00</published>
    <updated>2008-06-24T21:21:38-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/102-commit-comment-preview" />
    <title>Commit Comment Preview</title>
    <content type="html">&lt;p&gt;It&amp;#8217;s here for the faceboxes &amp;#8211; I&amp;#8217;m so sick of seeing people guess wrong about the formatting.  Really, it makes me sad.&lt;/p&gt;


&lt;div align="center"&gt;
&lt;img src="http://img.skitch.com/20080625-8krtqfrk2fedsb7n19kmm1n25w.png"/&gt;
&lt;/div&gt;

	&lt;p&gt;Coming soon everywhere else.&lt;/p&gt;</content>
    <author>
      <name>defunkt</name>
      <email>chris@ozmm.org</email>
    </author>
  </entry>
  <entry>
    <id>tag:github.com,2008:Post/101</id>
    <published>2008-06-24T18:17:46-07:00</published>
    <updated>2008-06-24T18:32:24-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/101-rubygem-info" />
    <title>RubyGem Info</title>
    <content type="html">&lt;p&gt;Now that it&amp;#8217;s &lt;a href="http://github.com/blog/97-github-loves-rubygems-1-2"&gt;so easy to install gems&lt;/a&gt;, we figured that you should know when a repository offers a gem install.&lt;/p&gt;


	&lt;p&gt;So, that&amp;#8217;s what we did:&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://github.com/defunkt/github-gem"&gt;&lt;img src="http://img.skitch.com/20080625-n4ieuptx8i58cxxw4u6sywcmn1.jpg" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;If you see a ruby icon sitting in a repository&amp;#8217;s detail box, it means they&amp;#8217;ve checked the &amp;#8220;RubyGem&amp;#8221; option, and when you click on it, it&amp;#8217;ll pop open a box telling you how to install it.&lt;/p&gt;</content>
    <author>
      <name>pjhyett</name>
      <email>pjhyett@gmail.com</email>
    </author>
  </entry>
  <entry>
    <id>tag:github.com,2008:Post/100</id>
    <published>2008-06-24T15:44:12-07:00</published>
    <updated>2008-06-24T15:44:20-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/100-gitsplosion-in-itunes" />
    <title>Gitsplosion! in iTunes</title>
    <content type="html">&lt;p&gt;As &lt;a href="http://github.com/damon"&gt;damon&lt;/a&gt; points out, Gitsplosion! is now on the iTunes store.  You can get to it via &lt;a href="http://tinyurl.com/6gj3ma"&gt;this link&lt;/a&gt; or by searching for &amp;#8216;GitHub&amp;#8217; in the iTunes store.&lt;/p&gt;


&lt;div align="center"&gt;
&lt;a href="http://tinyurl.com/6gj3ma"&gt;
&lt;img src="http://img.skitch.com/20080624-q6yugisp1eefndw5u3grpyx9tg.png"/&gt;
&lt;/a&gt;
&lt;/div&gt;

	&lt;p&gt;Sweet.&lt;/p&gt;</content>
    <author>
      <name>defunkt</name>
      <email>chris@ozmm.org</email>
    </author>
  </entry>
  <entry>
    <id>tag:github.com,2008:Post/99</id>
    <published>2008-06-24T12:21:21-07:00</published>
    <updated>2008-06-24T12:23:46-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/99-popular-languages" />
    <title>Popular Languages</title>
    <content type="html">&lt;p&gt;We&amp;#8217;re working on some awesome new visualizations and statistics here at GitHub.  While they&amp;#8217;re not quite ready to roll out, there is one chart I wanted to share.&lt;/p&gt;


&lt;div align="center"&gt;
&lt;img src="http://img.skitch.com/20080624-c4erhrfxf1s183netmma3292bf.png"/&gt;
&lt;/div&gt;

	&lt;p&gt;These are the top 10 languages stored on GitHub, based on some simple heuristics.  Forks are not counted &amp;#8211; only unique code.&lt;/p&gt;</content>
    <author>
      <name>defunkt</name>
      <email>chris@ozmm.org</email>
    </author>
  </entry>
  <entry>
    <id>tag:github.com,2008:Post/98</id>
    <published>2008-06-23T11:45:05-07:00</published>
    <updated>2008-06-23T11:45:40-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/98-git-remote-branch" />
    <title>git-remote-branch</title>
    <content type="html">&lt;p&gt;If you aren&amp;#8217;t using the &lt;a href="http://github.com/defunkt/github-gem"&gt;GitHub gem&lt;/a&gt;, then perhaps &lt;a href="webmat"&gt;webmat&amp;#8217;s&lt;/a&gt; &lt;a href="http://github.com/webmat/git_remote_branch"&gt;git_remote_branch&lt;/a&gt; may interest you.  The aim of the micro-project can best be summed up with a quote:&lt;/p&gt;


&lt;blockquote&gt;
I believe the commands for the simple scenario can be simpler.
&lt;/blockquote&gt;

	&lt;p&gt;Check out the &lt;a href="http://programblings.com/2008/06/23/git-remote-branches/"&gt;blog post&lt;/a&gt; for more information on what git_remote_branch does and how it can help.&lt;/p&gt;</content>
    <author>
      <name>defunkt</name>
      <email>chris@ozmm.org</email>
    </author>
  </entry>
  <entry>
    <id>tag:github.com,2008:Post/97</id>
    <published>2008-06-22T09:18:10-07:00</published>
    <updated>2008-06-22T12:43:03-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/97-github-loves-rubygems-1-2" />
    <title>GitHub Loves RubyGems 1.2</title>
    <content type="html">&lt;p&gt;For the folks trying to install a RubyGem via GitHub prior to yesterday&amp;#8217;s release, you&amp;#8217;d get the all too familiar &amp;#8220;Updating metadata for 563 gems&amp;#8230;&amp;#8221; every time.&lt;/p&gt;


	&lt;p&gt;Well no more, thanks to a massive effort by Eric Hodel. Not only are the issues with adding multiple sources fixed, but the indexing has been fixed such that gem installs are basically instantaneous now.&lt;/p&gt;


	&lt;p&gt;Do yourself a favor and run the following commands if you&amp;#8217;re a Ruby guy/gal.&lt;/p&gt;


&lt;pre&gt;
$ sudo gem update --system
$ gem sources -a http://gems.github.com
&lt;/pre&gt;

	&lt;p&gt;You&amp;#8217;re now able to install gems from GitHub directly without specifying the source, just like you would if you were installing them from RubyForge.&lt;/p&gt;


&lt;pre&gt;
$ sudo gem install defunkt-github
&lt;/pre&gt;

	&lt;p&gt;That&amp;#8217;s all there is to it, thanks Eric!&lt;/p&gt;</content>
    <author>
      <name>pjhyett</name>
      <email>pjhyett@gmail.com</email>
    </author>
  </entry>
  <entry>
    <id>tag:github.com,2008:Post/96</id>
    <published>2008-06-20T17:26:40-07:00</published>
    <updated>2008-06-20T17:28:27-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/96-gitsplosion-itunes-feed" />
    <title>Gitsplosion! iTunes Feed</title>
    <content type="html">&lt;p&gt;We&amp;#8217;ve now got an iTunes Podcast feed for Gitsplosion!  Here&amp;#8217;s how to hook it up:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Open iTunes&lt;/li&gt;
		&lt;li&gt;Go to &amp;#8216;Advanced&amp;#8217;&lt;/li&gt;
		&lt;li&gt;Click &amp;#8216;Subscribe to Podcast&amp;#8217;&lt;/li&gt;
		&lt;li&gt;Enter in this &lt;span class="caps"&gt;URL&lt;/span&gt;: http://github.com/gitsplosion/podcast.xml&lt;/li&gt;
	&lt;/ul&gt;


&lt;div align="center"&gt;
&lt;img src="http://github.com/gitsplosion/gitsplosion.jpg" /&gt;
&lt;/div&gt;

	&lt;p&gt;We&amp;#8217;ve submitted the podcast to iTunes &amp;#8211; it should show up in the store shortly.  We&amp;#8217;ll update this post when that happens.&lt;/p&gt;</content>
    <author>
      <name>defunkt</name>
      <email>chris@ozmm.org</email>
    </author>
  </entry>
  <entry>
    <id>tag:github.com,2008:Post/95</id>
    <published>2008-06-20T16:44:34-07:00</published>
    <updated>2008-06-20T17:28:23-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/95-gitsplosion-2" />
    <title>Gitsplosion! #2</title>
    <content type="html">&lt;p&gt;This week we talk about Sproutcore, our zodiac signs, Powerset, cheating at trivia, upside down AI helicopters, spilling coffee on laptops, and in the process manage to pronounce everyone&amp;#8217;s name wrong.&lt;/p&gt;


&lt;div align="center"&gt;
&lt;a href="http://is.gd/CyG"&gt;
&lt;img src="http://img.skitch.com/20080620-bwkwhgb7sf7mw316cf9hak17qh.png"/&gt;
&lt;/a&gt;
&lt;/div&gt;

	&lt;p&gt;We&amp;#8217;ve got real microphones in the mail &amp;#8211; expect a dramatic improvement in sound (and editing) quality for next week&amp;#8217;s &amp;#8216;cast.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://is.gd/CyG"&gt;Download it here&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;If you want to subscribe to this podcast, we now have a feed.  &lt;a href="http://github.com/blog/96-gitsplosion-itunes-feed"&gt;Instructions are here&lt;/a&gt;.  (It&amp;#8217;ll show up in the iTunes Store shortly).&lt;/p&gt;</content>
    <author>
      <name>defunkt</name>
      <email>chris@ozmm.org</email>
    </author>
  </entry>
  <entry>
    <id>tag:github.com,2008:Post/94</id>
    <published>2008-06-20T15:26:13-07:00</published>
    <updated>2008-06-20T15:26:58-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/94-cheat-git-chit" />
    <title>Cheat + Git = Chit</title>
    <content type="html">&lt;p&gt;You&amp;#8217;ve problem seen &lt;a href="http://cheat.errtheblog.com/"&gt;Cheat&lt;/a&gt; by way of the &lt;a href="http://cheat.errtheblog.com/s/git/"&gt;Git cheat sheet&lt;/a&gt;.  Yeah, it rocks.  Well guess what &amp;#8211; the industrious &lt;a href="http://github.com/robin"&gt;Robin&lt;/a&gt; took it a step forward and wrote a Git-backed version of Cheat called &lt;a href="http://github.com/robin/chit"&gt;Chit&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Want to get started?  Grab the &lt;a href="http://github.com/robin/chitsheet"&gt;Chitsheet&lt;/a&gt; repo (a snapshot of Cheat&amp;#8217;s content) and have at.&lt;/p&gt;


	&lt;p&gt;Some commands to play with:&lt;/p&gt;


&lt;pre&gt;
chit strftime
chit strftime --edit
chit anything --add
&lt;/pre&gt;

	&lt;p&gt;Chit goes one step further, too: &amp;#8220;You can also have a private repository for non-shareable cheat sheet. Put a prefix &amp;#8217;@&amp;#8217; before the sheet name and everything is in private mode.&amp;#8221;&lt;/p&gt;


	&lt;p&gt;Thanks Robin!&lt;/p&gt;</content>
    <author>
      <name>defunkt</name>
      <email>chris@ozmm.org</email>
    </author>
  </entry>
  <entry>
    <id>tag:github.com,2008:Post/93</id>
    <published>2008-06-19T17:45:27-07:00</published>
    <updated>2008-06-19T17:46:47-07:00</updated>
    <link type="text/html" rel="alternate" href="http://github.com/blog/93-fork-sighting" />
    <title>Fork Sighting</title>
    <content type="html">&lt;div align="center"&gt;
&lt;a href="http://brightkite.com/objects/044803c00e90e0427353182a2e9d0bb9f8172f8b"&gt;
&lt;img src="http://brightkite.com/images/photo_object/photos/3/0/300944/Forku-feed.jpg?1213848651"/&gt;
&lt;/a&gt;
&lt;p style="margin-top: -.75em; color: #666;"&gt;&lt;a href="http://github.com/slant"&gt;Slant&lt;/a&gt; caught forking some food.&lt;/p&gt;
&lt;/div&gt;

	&lt;p&gt;Got any &amp;#8216;Fork You&amp;#8217; spottings?  &lt;a href="mailto:chris@logicalawesome.com"&gt;Hit me&lt;/a&gt;.&lt;/p&gt;</content>
    <author>
      <name>defunkt</name>
      <email>chris@ozmm.org</email>
    </author>
  </entry>
</feed>
