<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

    <channel>
    
    <title>Experience Internet Blog</title>
    <link>http://www.experienceinternet.co.uk/blog/</link>
    <description>Non-technical client guides to common web technologies, ExpressionEngine extensions and plugins, and the latest news and opinion from Experience Internet.</description>
    <dc:language>en</dc:language>
    <dc:rights>Copyright 2009</dc:rights>
    <dc:date>2009-10-12T09:30:06+00:00</dc:date>
    <admin:generatorAgent rdf:resource="http://expressionengine.com/" />
    

    <geo:lat>53.763073</geo:lat><geo:long>-0.363491</geo:long><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/experience-internet-blog" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
      <title>Using Git to Manage an ExpressionEngine Website : A Typical Git Workflow</title>
      <link>http://feedproxy.google.com/~r/experience-internet-blog/~3/T4xjsjKibSo/</link>
			<author>Stephen Lewis</author>
      <guid isPermaLink="false">http://www.experienceinternet.co.uk/blog/archive/using-git-with-expressionengine-part-4/#When:09:30:06Z</guid>
      <description>&lt;p class="warning"&gt;This is the last in a series of posts about using git to manage an ExpressionEngine website. If you&amp;#8217;re new here, you may want to &lt;a href="http://www.experienceinternet.co.uk/blog/archive/using-git-with-expressionengine-part-1/" title="Read the introduction to using git to manage an ExpressionEngine site"&gt;start at the beginning&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Summer has turned to Autumn, that duplicitous charlatan &lt;a href="http://devot-ee.com/articles/item/version-control-for-expressionengine-using-git-part-1/" title="Do not trust this man with your wife"&gt;Masuga has attempted to steal my thunder&lt;/a&gt;, and yet somehow we&amp;#8217;ve managed to stumble our way to the final installment in this series.&lt;/p&gt;

&lt;p&gt;This is the point at which all your hard work and inexhaustible patience pays off.&lt;/p&gt;

&lt;p&gt;The previous post concluded with a brief overview of a typical Git workflow, and the promise of a more detailed description of the day-to-day usage of Git in the next installment. Ever a man of my word, that&amp;#8217;s exactly what this article is all about.&lt;/p&gt;

&lt;h2&gt;The scenario&lt;/h2&gt;

&lt;p&gt;Your client is the proud owner of a fairly large, busy website, requiring lots of minor ongoing updates and improvements. He also plans to launch a big new product (the Widget-o-matic) a few months hence, an event which requires a number of significant changes to the site.&lt;/p&gt;

&lt;p&gt;The prospect of building a major new website feature, whilst simultaneously making regular updates to the existing site, would terrify a lesser man. But not you dear reader, for you have Git at your elbow, and such things no longer hold any fear.&lt;/p&gt;

&lt;h2&gt;The solution&lt;/h2&gt;

&lt;p&gt;Something that Git does very well &amp;#8212; indeed continually brags about &amp;#8212; is branches. A branch is a separate line of development that shares a common ancestor with the other branches within your project.&lt;/p&gt;

&lt;p&gt;In this case, your default branch (&lt;code&gt;master&lt;/code&gt;) will be used to manage the current (live) website, and a new &lt;code&gt;widget&lt;/code&gt; branch will be used to manage the development work for the new Widget-o-matic section.&lt;/p&gt;

&lt;h2&gt;The workflow&lt;/h2&gt;

&lt;p&gt;Working with Git is very simple, and really only involves a handful of commands. Here&amp;#8217;s how the above solution translates into Gitspeak.&lt;/p&gt;

&lt;h3&gt;Create the &lt;code&gt;widget&lt;/code&gt; branch&lt;/h3&gt;

&lt;p&gt;First up, create the new &lt;code&gt;widget&lt;/code&gt; branch in your local repository.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; git checkout -b widget
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This simultaneously creates a new branch named &lt;code&gt;widget&lt;/code&gt;, and makes the &lt;code&gt;widget&lt;/code&gt; branch active. If you prefer to do things one at a time, you can &lt;em&gt;instead&lt;/em&gt; enter.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; git branch widget
$&amp;gt; git checkout widget
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Let&amp;#8217;s see what we&amp;#8217;ve got so far.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; git branch -a
  master
* widget
  origin/HEAD
  origin/master
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In an attempt to keep this post a manageable length, I&amp;#8217;m not going to get into a discussion of the &lt;code&gt;origin/HEAD&lt;/code&gt; and &lt;code&gt;origin/master&lt;/code&gt; branches right now. Suffice to say that you should never attempt to work with them directly; they are &lt;em&gt;tracking&lt;/em&gt; branches, whose sole purpose is to track the branches in your remote repository.&lt;/p&gt;

&lt;p&gt;Which leads us neatly into the next step: creating the remote repository &lt;code&gt;widget&lt;/code&gt; branch. The simplest way to do this is as follows.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; git push origin widget
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Git is smart enough to realise that the &lt;code&gt;widget&lt;/code&gt; branch doesn&amp;#8217;t currently exist in your remote repository, and creates it for you. You can confirm that everything is hunky-dory by listing all of your branches again.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; git branch -a
  master
* widget
  origin/HEAD
  origin/master
  origin/widget
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You could get on with building the Widget-o-matic right now, but ideally you&amp;#8217;d be able to &lt;code&gt;push&lt;/code&gt; and &lt;code&gt;pull&lt;/code&gt; from both the &lt;code&gt;master&lt;/code&gt; and &lt;code&gt;widget&lt;/code&gt; branches without the need to specify the remote repository branch every time.&lt;/p&gt;

&lt;p&gt;Running the &lt;code&gt;git remote show origin&lt;/code&gt; command displays lots of useful information about your remote repository.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; git remote show origin
* remote origin
  URL: ssh://shell_username@account_name.dreamhosters.com:git-repos/example_website
  Remote branch merged with 'git pull' while on branch master
    master
  Tracked remote branches
    master
    widget
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As you can see, there&amp;#8217;s no mention of what happens when you do a &lt;code&gt;git pull&lt;/code&gt; whilst on the &lt;code&gt;widget&lt;/code&gt; branch. You can rectify this by updating the &lt;code&gt;.git/config&lt;/code&gt; file, either manually (through a text editor), or via the command line.&lt;/p&gt;

&lt;p&gt;Before you do that, let&amp;#8217;s take a look at what your &lt;code&gt;config&lt;/code&gt; file looks like now.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; cat .git/config
# Some information removed for clarity
[remote "origin"]
  url = ssh://shell_username@account_name.dreamhosters.com:git-repos/example_website
  fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
  remote = origin
  merge = refs/heads/master
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The first block (in the above example, you&amp;#8217;ll likely have some other information at the top of your &lt;code&gt;config&lt;/code&gt; file) defines the remote repository that you&amp;#8217;re tracking.&lt;/p&gt;

&lt;p&gt;It gives it the short name &lt;code&gt;origin&lt;/code&gt;, and then specifies the URL that should be associated with this short name. This saves you typing it in every time you want to perform a &lt;code&gt;push&lt;/code&gt; or &lt;code&gt;pull&lt;/code&gt;. I&amp;#8217;ll skip over the &lt;code&gt;fetch&lt;/code&gt; line in the interests of brevity.&lt;/p&gt;

&lt;p&gt;The second block includes some important information about the &lt;code&gt;master&lt;/code&gt; branch. Firstly, that it&amp;#8217;s tracking the remote repository with the short name &lt;code&gt;origin&lt;/code&gt;. Secondly, that performing a &lt;code&gt;git pull&lt;/code&gt; whilst on the local &lt;code&gt;master&lt;/code&gt; branch will merge the remote &lt;code&gt;master&lt;/code&gt; branch (identified by &lt;code&gt;refs/heads/master&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Again, we&amp;#8217;re at risk delving deep into the bowels of Git here, which is not the intention with this series. The important point is that you need to create an information block in your &lt;code&gt;.git/config&lt;/code&gt; file for the &lt;code&gt;widget&lt;/code&gt; branch.&lt;/p&gt;

&lt;p&gt;There are two ways of doing this: via the command line, and editing the &lt;code&gt;config&lt;/code&gt; file manually. I&amp;#8217;ll run through the former, and then show you the resultant changes to your &lt;code&gt;config&lt;/code&gt; file.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; git config branch.widget.remote 'origin'
$&amp;gt; git config branch.widget.merge 'refs/heads/widget'
$&amp;gt; cat .git/config
# Some information removed for clarity
[remote "origin"]
  url = ssh://shell_username@account_name.dreamhosters.com:git-repos/example_website
  fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
  remote = origin
  merge = refs/heads/master
[branch "widget"]
  remote = origin
  merge = refs/heads/widget
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;All being well, your &lt;code&gt;config&lt;/code&gt; file will contain a new configuration block for the &lt;code&gt;widget&lt;/code&gt; branch. Running &lt;code&gt;git remote show origin&lt;/code&gt; again will confirm that your local &lt;code&gt;widget&lt;/code&gt; branch is now tracking your remote &lt;code&gt;widget&lt;/code&gt; branch.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; git remote show origin
* remote origin
  URL: ssh://shell_username@account_name.dreamhosters.com:git-repos/example_website
  Remote branch merged with 'git pull' while on branch master
    master
  Remote branch merged with 'git pull' while on branch widget
    widget
  Tracked remote branches
    master
    widget
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;All is right in the world. Onwards!&lt;/p&gt;

&lt;h3&gt;Build the Widget-o-matic&lt;/h3&gt;

&lt;p&gt;Before you can work on the Widget-o-matic, you need to ensure that you&amp;#8217;re working on the &lt;code&gt;widget&lt;/code&gt; branch.&lt;/p&gt;

&lt;p&gt;When you ran the &lt;code&gt;git branch&lt;/code&gt; command a few moments ago, you may have noticed an asterisk next to the &lt;code&gt;widget&lt;/code&gt; branch. This asterisk tells you which branch you&amp;#8217;re currently working on. To work on a different branch, simply run &lt;code&gt;git checkout&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; git checkout master
$&amp;gt; git checkout widget
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now that you have your ducks in a row, it&amp;#8217;s time to crack on with creating the Widget-o-matic. Create a readme file, with a description of exciting new feature, and add it to your local repository.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; echo The Widget-o-matic is an automatic widget. &amp;gt;&amp;gt; widget_readme.txt
$&amp;gt; git add widget_readme.txt
$&amp;gt; git commit -m "Added widget readme file."
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Running &lt;code&gt;git status&lt;/code&gt; will inform you that you&amp;#8217;re one commit ahead of &lt;code&gt;origin/widget&lt;/code&gt;, so go ahead and &lt;code&gt;push&lt;/code&gt; your changes to the remote repository.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; git push
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Thanks to your earlier &lt;code&gt;config&lt;/code&gt; fiddling, you don&amp;#8217;t need to specify the local or remote branches. Nice.&lt;/p&gt;

&lt;p&gt;Finally, confirm that your new file is present in your working directory.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; ls
example_file.txt    # Created in the previous installment
widget_readme.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now for the exciting part. No, really.&lt;/p&gt;

&lt;h3&gt;Update the live site&lt;/h3&gt;

&lt;p&gt;Your hypothetical client now wants you to make a few changes to the live site. Not a problem. First, &lt;code&gt;checkout&lt;/code&gt; the &lt;code&gt;master&lt;/code&gt; branch.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; git checkout master
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Before continuing, list the files in the current directory again, and notice that &lt;code&gt;widget_readme.txt&lt;/code&gt; has disappeared.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; ls
example_file.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Git automatically updates the files and directory structure of your working copy, to reflect the currently-active branch. Told you it was exciting.&lt;/p&gt;

&lt;p&gt;Create a new file in the &lt;code&gt;master&lt;/code&gt; branch, and commit it as before.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; echo Coming soon, the Widget-o-matic! &amp;gt;&amp;gt; latest_news.txt
$&amp;gt; git add latest_news.txt
$&amp;gt; git commit -m "Created latest news file."
$&amp;gt; git push
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Once again, you&amp;#8217;ll notice that &lt;code&gt;git push&lt;/code&gt; automatically sends your updates to the appropriate remote repository branch.&lt;/p&gt;

&lt;p&gt;The only problem is, the news on your &lt;code&gt;widget&lt;/code&gt; branch is now out-of-date. Again, Git has the answer.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; git rebase master widget
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This writes any outstanding &lt;code&gt;master&lt;/code&gt; commits to the &lt;code&gt;widget&lt;/code&gt; branch, bringing it up to date with any changes made to the live site. It also switches you to the &lt;code&gt;widget&lt;/code&gt; branch, so run a quick &lt;code&gt;ls&lt;/code&gt; to confirm that &lt;code&gt;latest_news.txt&lt;/code&gt; is present.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; ls
example_file.txt
latest_news.txt
widget_readme.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Perfect.&lt;/p&gt;

&lt;h3&gt;Launch the Widget-o-matic&lt;/h3&gt;

&lt;p&gt;The time has come to launch the Widget-o-matic. To do so, you need to &lt;code&gt;merge&lt;/code&gt; the changes on the &lt;code&gt;widget&lt;/code&gt; branch into the &lt;code&gt;master&lt;/code&gt; branch, and &lt;code&gt;push&lt;/code&gt; them to the remote repository.&lt;/p&gt;

&lt;p&gt;Before doing that, confirm that you don&amp;#8217;t have any uncommitted changes in either the &lt;code&gt;widget&lt;/code&gt; or &lt;code&gt;master&lt;/code&gt; branches (&lt;code&gt;git status&lt;/code&gt; will tell you what you need to know).&lt;/p&gt;

&lt;p&gt;Once everything is current, you can proceed with the &lt;code&gt;merge&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; git checkout master
$&amp;gt; git merge widget
$&amp;gt; ls
example_file.txt
latest_news.txt
widget_readme.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Awesomeness. &lt;code&gt;git push&lt;/code&gt; your changes to the remote repository, and you&amp;#8217;re done.&lt;/p&gt;

&lt;h3&gt;Housekeeping&lt;/h3&gt;

&lt;p&gt;Now that the Widget-o-matic is launched, and part of the &lt;code&gt;master&lt;/code&gt; branch, it makes sense to delete the obsolete &lt;code&gt;widget&lt;/code&gt; branch. The simplest way to do this is by first deleting the remote branch, as follows.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; git push origin :widget
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Perhaps a little counter-intuitive at face value, but it has the desired effect. You can confirm that the remote branch has been deleted by running &lt;code&gt;git branch -a&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; git branch -a
* master
  widget
  origin/HEAD
  origin/master
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now that the remote branch has been deleted, you can delete your local &lt;code&gt;widget&lt;/code&gt; branch.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; git branch -d widget
$&amp;gt; git branch -a
* master
  origin/HEAD
  origin/master
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Doing so also cleans up your &lt;code&gt;config&lt;/code&gt; file.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; cat .git/config
# Some information removed for clarity
[remote "origin"]
  url = ssh://shell_username@account_name.dreamhosters.com:git-repos/example_website
  fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
  remote = origin
  merge = refs/heads/master
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Neat.&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Those of you that skipped to the end, I understand completely, but your ingratitude makes me weep. Those of you that read this far, well done, and seek help.&lt;/p&gt;

&lt;p&gt;The conscientious amongst you should now have a reasonable understanding of &lt;a href="http://www.experienceinternet.co.uk/blog/archive/using-git-with-expressionengine-part-2/" title="How to setup your Git and ExpressionEngine working environment"&gt;how to setup your Git working environment&lt;/a&gt;, &lt;a href="http://www.experienceinternet.co.uk/blog/archive/using-git-with-expressionengine-part-3/" title="How to create your local and remote Git repositories"&gt;how to create your local and remote Git repositories&lt;/a&gt;, and how to work with Git on a day-to-day basis.&lt;/p&gt;

&lt;p&gt;There&amp;#8217;s an awful lot to Git that I&amp;#8217;ve deliberately shied away from covering in this series. If you have any questions or comments, I encourage you to &lt;a href="http://expressionengine.com/forums/viewthread/118990/" title="Join the Git and ExpressionEngine conversation on the EE Forums"&gt;join the discussion on the ExpressionEngine forums&lt;/a&gt;. Hopefully we can all learn something from each other.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/experience-internet-blog/~4/T4xjsjKibSo" height="1" width="1"/&gt;</description>
      <dc:date>2009-10-12T09:30:06+00:00</dc:date>
    <feedburner:origLink>http://www.experienceinternet.co.uk/blog/archive/using-git-with-expressionengine-part-4/#When:09:30:06Z</feedburner:origLink></item>

    <item>
      <title>Using Git to Manage an ExpressionEngine website : Creating Your Website</title>
      <link>http://feedproxy.google.com/~r/experience-internet-blog/~3/0uaRlRKKDuc/</link>
			<author>Stephen Lewis</author>
      <guid isPermaLink="false">http://www.experienceinternet.co.uk/blog/archive/using-git-with-expressionengine-part-3/#When:21:27:10Z</guid>
      <description>&lt;p class="warning"&gt;This is the third in a series of posts about using Git to manage an ExpressionEngine website. If you&amp;#8217;re new here, you may want to &lt;a href="http://www.experienceinternet.co.uk/blog/archive/using-git-with-expressionengine-part-1/" title="Read the introduction to using Git to manage an ExpressionEngine site"&gt;start at the beginning&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;ve been following along with parts &lt;a href="http://www.experienceinternet.co.uk/blog/archive/using-git-with-expressionengine-part-1/ "Read the first part of" title="Using Git with ExpressionEngine"&gt;one&lt;/a&gt; and &lt;a href="http://www.experienceinternet.co.uk/blog/archive/using-git-with-expressionengine-part-2/ "Read the second part of" title="Using Git with ExpressionEngine"&gt;two&lt;/a&gt;, you&amp;#8217;ll now have Git installed on your local machine, a remote &amp;#8220;repository&amp;#8221; server (hosted by DreamHost, in the example provided), and a remote &amp;#8220;live&amp;#8221; server (hosted by MediaTemple, in the example provided).&lt;/p&gt;

&lt;p&gt;This installment details the process of setting up your ExpressionEngine site as a Git repository. Note that in the following examples &lt;code&gt;$&amp;gt;&lt;/code&gt; denotes the bash prompt, and should not be entered.&lt;/p&gt;

&lt;h2&gt;Step 1. Create your local Git repository&lt;/h2&gt;

&lt;p&gt;Open the Terminal, navigate to the directory where you&amp;#8217;d like to create your new website, and enter the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; mkdir example_website
$&amp;gt; cd example_website
$&amp;gt; git init
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The creation of the new directory could just as easily have been accomplished via the Finder, it&amp;#8217;s the last command that interests us. With that line you&amp;#8217;ve created a new Git repository for your website.&lt;/p&gt;

&lt;p&gt;Let&amp;#8217;s have a quick nose around to see what just happened:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; ls -a
.    ..    .git
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Unlike Subversion, Git won&amp;#8217;t pollute every directory on your website with hidden folders. Instead, everything is housed within a single &lt;code&gt;.git&lt;/code&gt; directory, in the root of your working directory.&lt;/p&gt;

&lt;p&gt;One of the many advantages to this arrangement is that it makes the process of updating EE a whole lot easier; no more accidentally deleting a bunch of hidden &lt;code&gt;.svn&lt;/code&gt; folders, and screwing up your site&amp;#8217;s version control.&lt;/p&gt;

&lt;h2&gt;Step 2. Ignore unwanted files&lt;/h2&gt;

&lt;p&gt;By default, Git will track every file or directory that finds its way into your working directory. You can control this behaviour by setting up &amp;#8220;ignore&amp;#8221; rules.&lt;/p&gt;

&lt;p&gt;There are &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/gitignore.html" title="Learn more about gitignore"&gt;a number of different ways of setting up ignore rules&lt;/a&gt;, and the most appropriate choice typically depends on whether you &lt;em&gt;always&lt;/em&gt; want to ignore particular files, or only wish to ignore them for a specific project.&lt;/p&gt;

&lt;p&gt;For the purposes of this walkthrough, we&amp;#8217;ll just use a simple &lt;code&gt;.gitignore&lt;/code&gt; file, with a single rule telling Git to ignore &lt;code&gt;.DS_Store&lt;/code&gt; files:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; echo '.DS_Store' &amp;gt; .gitignore
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Step 3. Create your remote Git repository&lt;/h2&gt;

&lt;p&gt;Open a new Terminal tab, and &lt;code&gt;ssh&lt;/code&gt; into your DreamHost repository (the following command assumes you set up shell shortcuts, as described at the end of &lt;a href="http://www.experienceinternet.co.uk/blog/archive/using-git-with-expressionengine-part-2/" title="Read part 2 of the 'Using Git with ExpressionEngine' series"&gt;part two&lt;/a&gt;):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; ssh dh
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I keep all my Git repositories in a general &lt;code&gt;git-repos&lt;/code&gt; directory, so let&amp;#8217;s set that up:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; mkdir git-repos
$&amp;gt; cd git-repos
$&amp;gt; mkdir example_website
$&amp;gt; cd example_website
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You now have an &lt;code&gt;example_website&lt;/code&gt; directory, ready to accommodate your new remote Git repository. This time though, you need to initialise a &amp;#8220;bare&amp;#8221; repository.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; git --bare init
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Git typically assumes you&amp;#8217;ll be using a repository as your working directory. As such, a standard repository contains all of your project files, along with the aforementioned &lt;code&gt;.git&lt;/code&gt; directory, which contains the bare repository files.&lt;/p&gt;

&lt;p&gt;A remote repository isn&amp;#8217;t interested in your working files, it just needs to know what&amp;#8217;s changed, in order to keep track of everything. This is what &amp;#8220;bare&amp;#8221; means to Git &amp;#8212; just the repository itself.&lt;/p&gt;

&lt;h2&gt;Step 4. Link your local repository to the remote repository&lt;/h2&gt;

&lt;p&gt;Switch back to your local repository Terminal tab, and enter the following (assuming you&amp;#8217;re using DreamHost for you remote repository):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; git remote add origin ssh://shell_username@account_name.dreamhosters.com/~/git-repos/example_website
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This automatically adds some code to your local &lt;code&gt;.git/config&lt;/code&gt; file, linking your local repository to your remote repository.&lt;/p&gt;

&lt;h2&gt;Step 5. Create your &amp;#8220;live&amp;#8221; Git repository&lt;/h2&gt;

&lt;p&gt;The &amp;#8220;live&amp;#8221; site should be a working copy of your remote Git repository. The file paths in the following instructions are specific to MediaTemple&amp;#8217;s (dv) server &amp;#8212; adapt them as required for your preferred host.&lt;/p&gt;

&lt;p&gt;Open another tab in the Terminal, &lt;code&gt;ssh&lt;/code&gt; into your live server, and navigate to the main website directory (&lt;em&gt;not&lt;/em&gt; the HTTP documents directory):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; ssh mt
$&amp;gt; cd /var/www/vhosts/example_website/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Clone your remote repository:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; git clone ssh://shell_username@account_name.dreamhosters.com/~/git-repos/example_website
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This creates a new directory, &lt;code&gt;example_website&lt;/code&gt;, which become the main &lt;code&gt;httpdocs&lt;/code&gt; directory for your website:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; mv httpdocs httpdocs_old
$&amp;gt; mv example_website httpdocs
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Step 6. Get your feet wet&lt;/h2&gt;

&lt;p&gt;The next installment will contain a more detail description of my Git / EE workflow. In the meantime, here&amp;#8217;s something to whet your appetite.&lt;/p&gt;

&lt;p&gt;The commands below perform the following actions, which will be typical of your day-to-day workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a new file in your local working directory.&lt;/li&gt;
&lt;li&gt;Add the file to your local Git repository.&lt;/li&gt;
&lt;li&gt;Commit the file to your local Git repository, with a brief description of the work carried out.&lt;/li&gt;
&lt;li&gt;Push the changes to the remote Git repository.&lt;/li&gt;
&lt;li&gt;Pull the changes from the remote Git repository to the live site.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In your &amp;#8220;local&amp;#8221; tab, enter the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; touch 'example_file.txt'
$&amp;gt; git status
# Untracked files:
.gitignore
example_file.txt
$&amp;gt; git commit -a -m "Created .gitignore file, and example_file.txt"
$&amp;gt; git push
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Switch to your &amp;#8220;live&amp;#8221; tab, and pull the changes from the remote repository, to your live server:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$&amp;gt; git pull
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Next time&lt;/h2&gt;

&lt;p&gt;Next time out I&amp;#8217;ll be providing a proper explanation of the above workflow, with some more detailed examples of the everyday practicalities of using Git.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/experience-internet-blog/~4/0uaRlRKKDuc" height="1" width="1"/&gt;</description>
      <dc:date>2009-07-17T21:27:10+00:00</dc:date>
    <feedburner:origLink>http://www.experienceinternet.co.uk/blog/archive/using-git-with-expressionengine-part-3/#When:21:27:10Z</feedburner:origLink></item>

    <item>
      <title>Iconic Interiors Shortlisted for “Top 10 Sites of 2008” Interactive Media Award</title>
      <link>http://feedproxy.google.com/~r/experience-internet-blog/~3/Lp8okYGAEnE/</link>
			<author>Stephen Lewis</author>
      <guid isPermaLink="false">http://www.experienceinternet.co.uk/blog/archive/iconic-interiors-top-10-sites-2008-ima-shortlist/#When:11:59:43Z</guid>
      <description>&lt;p&gt;A few months back, IconicInteriors.com &amp;#8212; a site &lt;a href="http://www.experienceinternet.co.uk/work/detail/iconic-interiors/" title="Read more about the Iconic Interiors project"&gt;we designed and built&lt;/a&gt; &amp;#8212; received a &amp;#8220;Best in Class&amp;#8221; Interactive Media Award. You may remember me &lt;a href="http://www.experienceinternet.co.uk/blog/archive/interactive-media-award-winner/" title="Read more about our Interactive Media Award for IconicInteriors.com"&gt;bragging shamelessly&lt;/a&gt; about it.&lt;/p&gt;

&lt;p&gt;Well, it turns out that the IMA judges liked the Iconic site so much that it&amp;#8217;s on their &lt;a href="http://www.interactivemediaawards.com/winners/2008/top10sites.asp" title="The 36 shortlisted sites"&gt;&amp;#8220;Top 10 sites of 2008&amp;#8221; shortlist&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now if we can just beat BMW, Porsche, Maserati (twice), Volkwagen, Amnesty International, the Worldwide Fund for Nature, the Smithsonian, and MSN, it&amp;#8217;s in the bag.&lt;/p&gt;

&lt;p&gt;Ah.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/experience-internet-blog/~4/Lp8okYGAEnE" height="1" width="1"/&gt;</description>
      <dc:date>2009-06-11T11:59:43+00:00</dc:date>
    <feedburner:origLink>http://www.experienceinternet.co.uk/blog/archive/iconic-interiors-top-10-sites-2008-ima-shortlist/#When:11:59:43Z</feedburner:origLink></item>

    <item>
      <title>Using Git to Manage an ExpressionEngine website : Setting Everything Up</title>
      <link>http://feedproxy.google.com/~r/experience-internet-blog/~3/gRI0zf3ozfw/</link>
			<author>Stephen Lewis</author>
      <guid isPermaLink="false">http://www.experienceinternet.co.uk/blog/archive/using-git-with-expressionengine-part-2/#When:17:52:38Z</guid>
      <description>&lt;p class="warning"&gt;This is the second in a series of posts about using Git to manage an ExpressionEngine website. If you&amp;#8217;re new here, you may want to &lt;a href="http://www.experienceinternet.co.uk/blog/archive/using-git-with-expressionengine-part-1/" title="Read the introduction to using Git to manage an ExpressionEngine site"&gt;start at the beginning&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://www.experienceinternet.co.uk/blog/archive/using-git-with-expressionengine-part-1/" title="Read the first installment"&gt;first installment in this series&lt;/a&gt; was little more than an introduction. Now it&amp;#8217;s time to get your hands dirty, setting up Git, and laying the groundwork for your day-to-day development tasks.&lt;/p&gt;

&lt;p&gt;Before you get to the nitty-gritty, it&amp;#8217;s worth taking a moment to review what exactly you&amp;#8217;re working towards.&lt;/p&gt;

&lt;h2&gt;What you&amp;#8217;re working towards&lt;/h2&gt;

&lt;p&gt;The setup described below is pretty simple, but can be easily expanded to accommodate more developers, or more &amp;#8220;staging&amp;#8221; servers.&lt;/p&gt;

&lt;p&gt;Dealing, as it does, with the ins-and-outs of setting up your development environment, this will be the most implementation-specific article in this series. If you&amp;#8217;re using a different operating system, or a different hosting company, you&amp;#8217;ll most likely need to adapt a few of the step-by-step instructions accordingly.&lt;/p&gt;

&lt;p&gt;At this stage, it&amp;#8217;s also worth stating the obvious; that these instructions are presented as-is, without warranty or guarantee. We&amp;#8217;re all grown-up boys and girls, and whilst these instructions worked (and continue to work) just fine for me, if you accidentally delete the internet whilst following them, it&amp;#8217;s not my fault.&lt;/p&gt;

&lt;p&gt;Caveats dispensed with, here&amp;#8217;s what you&amp;#8217;ll be setting up:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The &lt;strong&gt;local development environment&lt;/strong&gt; is where all of the work gets done on a day-to-day basis. Each developer has his own local Git repository, enabling him to commit changes into source control quickly and easily, even when he&amp;#8217;s offline. He can then periodically &lt;code&gt;push&lt;/code&gt; whatever local changes he&amp;#8217;s made to the &amp;#8220;origin&amp;#8221; repository.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;&amp;#8220;origin&amp;#8221; repository&lt;/strong&gt; lives on a remote (DreamHost) server. Every other Git repository pushes and pulls to and from this repository.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;live site&lt;/strong&gt; (and / or staging site) is another Git repository, living on a MediaTemple (dv) server. Updating the live site is simply a case of SSHing into the server, and pulling the latest code from the origin repository. A more seamless alternative would be to &lt;a href="http://hivelogic.com/articles/view/deploying-expressionengine-github-capistrano" title="Read Dan Benjamin's guide to using Capistrano"&gt;use Capistrano&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Laying the foundations&lt;/h2&gt;

&lt;p&gt;Before you can start pushing and pulling your code about the place, you need to get everything set up.&lt;/p&gt;

&lt;h3&gt;Step 1. Install Git on your local development machine&lt;/h3&gt;

&lt;p&gt;Provided you&amp;#8217;re on a Mac, the first step is easy &amp;#8212; you can either install Git via &lt;a href="http://www.macports.org/install.php" title="The MacPorts home page"&gt;MacPorts&lt;/a&gt;, or &lt;a href="http://code.google.com/p/git-osx-installer/" title="Find out more about the Git OS X installer"&gt;download the Git OS X installer&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re feeling particularly adventurous, there&amp;#8217;s always the option to &lt;a href="http://github.com/guides/compiling-and-installing-git-on-mac-os-x" title="GitHub's guide to compiling and installing Git on Mac OS X"&gt;compile and install Git manually&lt;/a&gt;, but unless you have very specific requirements, it&amp;#8217;s probably not worth the effort.&lt;/p&gt;

&lt;p&gt;Windows users may &lt;a href="http://code.google.com/p/msysgit/" title="Git on Windows"&gt;find this useful&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Step 2. Install Git on DreamHost&lt;/h3&gt;

&lt;p&gt;In a piece of tremendous good fortune, it appears that &lt;abbr title="DreamHost"&gt;DH&lt;/abbr&gt; now installs Git as standard on new hosting accounts. To confirm that you&amp;#8217;re all set up and ready to go, SSH into your DH account, and run the following commands:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[server]$ which git
/usr/bin/git
[server]$ git --version
git version 1.5.6.5
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you&amp;#8217;re one of the unlucky few not to have Git installed, the official DreamHost Wiki has &lt;a href="http://wiki.dreamhost.com/Git" title="If you're unlucky enough not to have Git pre-installed"&gt;detailed instructions for installing Git&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Step 3. Install Git on MediaTemple&lt;/h3&gt;

&lt;p&gt;After the effortless ease with which you glided through steps 1 and 2, you may be thinking now is a good time to kick back with a self-congratulatory cup of tea.&lt;/p&gt;

&lt;p&gt;Not so fast.&lt;/p&gt;

&lt;p&gt;Installing Git on a MediaTemple (dv) server actually requires a (little) bit of effort, and whilst the &lt;abbr title="MediaTemple"&gt;MT&lt;/abbr&gt; &lt;a href="http://kb.mediatemple.net/questions/820/Installing+Git+on+a+dv+3.5+server" title="The MediaTemple guide to installing Git on a (dv) server"&gt;knowledgebase article&lt;/a&gt; is a good starter for 10, it doesn&amp;#8217;t work quite as advertised.&lt;/p&gt;

&lt;p&gt;MediaTemple recommends using Yum to manage the installation of software on your (dv) server, but unfortunately the &lt;a href="http://kb.mediatemple.net/questions/1564/Installing+the+yum+package+manager" title="MediaTemple's incomplete knowledgebase guide to installing Yum"&gt;knowledgebase guide to installing Yum&lt;/a&gt; falls a bit short, neglecting to mention a number of Yum&amp;#8217;s dependencies.&lt;/p&gt;

&lt;p&gt;This leads to lots of errors message, typically followed by loud and sustained cursing. Not to worry, you can benefit from my bitter experience by following the Yum installation instructions below:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="http://kb.mediatemple.net/questions/1672/Install+the+Developer+Tools" title="MT knowledgebase guide to installing developer tools on a (dv) server"&gt;Install the developer tools&lt;/a&gt; via your AccountCenter.&lt;/li&gt;
&lt;li&gt;Log into your (dv) server using SSH:&lt;br&gt;&lt;code&gt;ssh root@mydomain.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Install Yum&amp;#8217;s dependency files:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rpm -Uvh http://mirror.centos.org/centos/5.2/os/i386/CentOS/python-iniparse-0.2.3-4.el5.noarch.rpm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rpm -Uvh http://mirror.centos.org/centos/5.2/os/i386/CentOS/yum-metadata-parser-1.1.2-2.el5.i386.rpm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rpm -Uvh http://mirror.centos.org/centos/5.2/os/i386/CentOS/python-elementtree-1.2.6-5.i386.rpm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rpm -Uvh http://mirror.centos.org/centos/5.2/os/i386/CentOS/python-sqlite-1.1.7-1.2.1.i386.rpm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rpm -Uvh http://mirror.centos.org/centos/5.2/os/i386/CentOS/rpm-python-4.4.2-48.el5.i386.rpm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rpm -Uvh http://mirror.centos.org/centos/5.2/os/i386/CentOS/m2crypto-0.16-6.el5.2.i386.rpm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rpm -Uvh http://mirror.centos.org/centos/5.2/os/i386/CentOS/python-urlgrabber-3.1.0-2.noarch.rpm&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Install Yum:&lt;br&gt;&lt;code&gt;rpm -Uvh http://mirror.centos.org/centos/5.2/os/i386/CentOS/yum-3.2.8-9.el5.centos.1.noarch.rpm&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once that&amp;#8217;s done, you can return to MT&amp;#8217;s standard Git installation instructions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install &lt;a href="http://fedoraproject.org/wiki/EPEL" title="More about EPEL"&gt;EPEL&lt;/a&gt;:&lt;br&gt;&lt;code&gt;rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-2.noarch.rpm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;And finally, install Git:&lt;br&gt;&lt;code&gt;yum install git&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Making life easy for yourself&lt;/h2&gt;

&lt;p&gt;At this point, you should have everything setup and ready to go. If you&amp;#8217;ve had enough for one day, feel free to go and have that cup of tea now.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re still bursting with Terminal energy, there are a couple of additional things you can do that will make your life at the command line at lot simpler.&lt;/p&gt;

&lt;h3&gt;Easier SSH&lt;/h3&gt;

&lt;p&gt;As you&amp;#8217;re going to be doing a lot of SSHing between servers, it&amp;#8217;s worth spending a few minutes setting up some SSH keys. Otherwise you&amp;#8217;ll spend your life mistyping passwords in the Terminal.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s how to setup an SSH key on your local development machine. Do this for each remote server that you want to access via SSH (DreamHost and MediaTemple, in this setup).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the Terminal. At the prompt, type:&lt;br&gt;&lt;code&gt;ssh-keygen&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Specify the file as &lt;code&gt;~/.ssh/key_name&lt;/code&gt;, where &lt;code&gt;key_name&lt;/code&gt; is the name you wish to assign to this SSH key.&lt;/li&gt;
&lt;li&gt;Enter a passphrase.&lt;/li&gt;
&lt;li&gt;Copy the public key to your remote server:&lt;br&gt;&lt;code&gt;scp ~/.ssh/key_name.pub username@remoteserver.com:./key_name.pub&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Secure shell into the remote server using &lt;code&gt;ssh username@remoteserver.com&lt;/code&gt;. You&amp;#8217;ll still need to enter your password at this point.&lt;/li&gt;
&lt;li&gt;At the prompt, type &lt;code&gt;ls -l&lt;/code&gt;, to list all the files and directories in the current folder. If the &lt;code&gt;.ssh&lt;/code&gt; directory already exists, &lt;code&gt;cd .ssh&lt;/code&gt; into it, and skip to step 12.&lt;/li&gt;
&lt;li&gt;Create the &lt;code&gt;.ssh&lt;/code&gt; directory:&lt;br&gt;&lt;code&gt;mkdir .ssh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Change the directory properties:&lt;br&gt;&lt;code&gt;chmod 700 .ssh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Move to the &lt;code&gt;.ssh&lt;/code&gt; directory:&lt;br&gt;&lt;code&gt;cd .ssh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Create a new file:&lt;br&gt;&lt;code&gt;touch authorized_keys&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Change the file permissions:&lt;br&gt;&lt;code&gt;chmod 600 authorized_keys&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Add your public SSH key to the &amp;#8220;authorized keys&amp;#8221; file:&lt;br&gt;&lt;code&gt;cat ../key_name.pub &amp;gt;&amp;gt; authorized_keys&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Remove your public SSH key file:&lt;br&gt;&lt;code&gt;rm ../key_name.pub&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Exit the remote server:&lt;br&gt;&lt;code&gt;exit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;On your local machine enter:&lt;br&gt;&lt;code&gt;ssh-add ~/.ssh/key_name&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With that out the way, you can now log into your DreamHost or MediaTemple server using &lt;code&gt;ssh username@remoteserver.com&lt;/code&gt;, without entering a password.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s also worth taking the time to set up an SSH key on MediaTemple, so you can easily log into your DreamHost server &lt;em&gt;from&lt;/em&gt; your MediaTemple server. Here&amp;#8217;s how to do that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Log into your MediaTemple server as root:&lt;br&gt;&lt;code&gt;ssh root@remoteserver.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Follow the instructions above, substituting the file path in step 3 with:&lt;br&gt;&lt;code&gt;/root/.ssh/key_name&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Add the code from &lt;a href="http://kb.mediatemple.net/questions/1624/Preventing+multiple+password+prompts+when+using+svn+subversion" title="Read the MediaTemple KB article"&gt;this MediaTemple knowledgebase article&lt;/a&gt; to your &lt;code&gt;~/.bash_profile&lt;/code&gt; file.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;Even easier SSH&lt;/h3&gt;

&lt;p&gt;You can shave even more keystrokes off your day by adding SSH &amp;#8220;aliases&amp;#8221; to your &lt;code&gt;config&lt;/code&gt; file. You can then log into your remote server by typing (for example) &lt;code&gt;ssh dh&lt;/code&gt;, instead of the much less catchy &lt;code&gt;ssh username@remoteserver.dreamhosters.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To achieve this state of keyboard Zen, add the following block of code to your &lt;code&gt;~/.ssh/config&lt;/code&gt; file, for each server you&amp;#8217;re connecting to.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Host shortname
User username
HostName remoteserver.com
# You probably won't need to specify the port, so just omit the following line
Port 2222
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Next time&lt;/h2&gt;

&lt;p&gt;After a suitable recovery period, the next installment will deal with the task of setting up your ExpressionEngine site as a Git repository. In the meantime, please &lt;a href="http://expressionengine.com/forums/viewthread/118990/" title="Share your thoughts on the EE forums"&gt;join the discussion&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/experience-internet-blog/~4/gRI0zf3ozfw" height="1" width="1"/&gt;</description>
      <dc:date>2009-06-09T17:52:38+00:00</dc:date>
    <feedburner:origLink>http://www.experienceinternet.co.uk/blog/archive/using-git-with-expressionengine-part-2/#When:17:52:38Z</feedburner:origLink></item>

    <item>
      <title>Using Git to Manage an ExpressionEngine website : Starting the Conversation</title>
      <link>http://feedproxy.google.com/~r/experience-internet-blog/~3/Vbs-wlDuwYY/</link>
			<author>Stephen Lewis</author>
      <guid isPermaLink="false">http://www.experienceinternet.co.uk/blog/archive/using-git-with-expressionengine-part-1/#When:17:03:48Z</guid>
      <description>&lt;p&gt;Git has rapidly established itself as the version-control system of choice for &lt;a href="http://github.com/search?type=Repositories&amp;amp;language=&amp;amp;q=ee_addon&amp;amp;repo=&amp;amp;langOverride=&amp;amp;x=20&amp;amp;y=13&amp;amp;start_value=1" title="ExpressionEngine add-ons hosted on GitHub"&gt;ExpressionEngine add-on developers&lt;/a&gt;, and various EE developers (myself included) have also Tweeted about using Git to manage entire ExpressionEngine sites.&lt;/p&gt;

&lt;p&gt;However, there&amp;#8217;s only so much you can say in 140 characters, and I&amp;#8217;ve yet to see a proper discussion about best practises for managing an ExpressionEngine site with Git.&lt;/p&gt;

&lt;p&gt;This series of posts is my attempt to fill that gap, by documenting how I use Git to manage ExpressionEngine websites. My goal is to start a conversation on this topic, from which we can all (myself included) benefit.&lt;/p&gt;

&lt;p&gt;With this in mind, I&amp;#8217;ve started &lt;a href="http://expressionengine.com/forums/viewthread/118990/" title="Join in the discussion on the EE forums"&gt;a thread on the ExpressionEngine forums&lt;/a&gt;, rather than opening comments for this (and subsequent) posts. This will hopefully encourage greater participation in the conversation, and will also serve as a useful resource for EE developers in the future.&lt;/p&gt;

&lt;h2&gt;What to expect&lt;/h2&gt;

&lt;p&gt;The information contained in the upcoming posts will be very specific to my current setup.&lt;/p&gt;

&lt;p&gt;It will discuss how to install and use Git with the services I use (DreamHost to host the Git repository, and MediaTemple&amp;#8217;s DV service for the live site), my standard workflow for setting up a new site in Git, and how I manage day-to-day site updates.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re looking for &lt;a href="http://www.youtube.com/watch?v=4XpnKHJAok8" title="Linus Torvalds introduces Git to the developers at Google"&gt;a more general discussion about what Git is&lt;/a&gt;, or advice on how to install it on hosting company X&amp;#8217;s servers, you won&amp;#8217;t find it in the posts. You may, however, find the information you need in the ensuing conversations on the EE forums, so please don&amp;#8217;t hesitate to ask the question.&lt;/p&gt;

&lt;h2&gt;In conclusion&lt;/h2&gt;

&lt;p&gt;It&amp;#8217;s worth restating that my primary reason for writing these posts is to get the EE community talking, and sharing their knowledge. I freely admit to not knowing everything there is to know about Git, but I have &amp;#8212; largely through trial and error &amp;#8212; found something that works well for me and my business.&lt;/p&gt;

&lt;p&gt;My hope is that these posts will help the complete novice get started, whilst also filling in the gaps in my own knowledge.&lt;/p&gt;

&lt;p&gt;So please, head on over to the ExpressionEngine forums, and &lt;a href="http://expressionengine.com/forums/viewthread/118990/" title="Stop me talking to myself"&gt;help me get the conversation started&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/experience-internet-blog/~4/Vbs-wlDuwYY" height="1" width="1"/&gt;</description>
      <dc:date>2009-06-02T17:03:48+00:00</dc:date>
    <feedburner:origLink>http://www.experienceinternet.co.uk/blog/archive/using-git-with-expressionengine-part-1/#When:17:03:48Z</feedburner:origLink></item>

    <item>
      <title>Labgruppen.com Bags an “Outstanding Achievement” Interactive Media Award</title>
      <link>http://feedproxy.google.com/~r/experience-internet-blog/~3/NQUdEIQh_qA/</link>
			<author>Stephen Lewis</author>
      <guid isPermaLink="false">http://www.experienceinternet.co.uk/blog/archive/labgruppen-interactive-media-award/#When:13:12:34Z</guid>
      <description>&lt;div class="figure figure-a" style="position : relative;"&gt;
    &lt;p class="content"&gt;
        &lt;img src="http://www.experienceinternet.co.uk/images/uploads/blog/20090512-labgruppen.jpg" width="511" height="257" alt="Labgruppen.com Interactive Media Award" /&gt;
        &lt;img src="http://www.experienceinternet.co.uk/images/uploads/blog/20090512-ima.jpg" width="125" height="130" alt="IMA Award Winner" style="border-bottom : none; left : -10px; position : absolute; top : -15px;" /&gt;
    &lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;You can tell work is busy when you bag an Interactive Media Award, and don&amp;#8217;t get &amp;#8216;round to mentioning it to anyone for a month.&lt;/p&gt;

&lt;p&gt;Which is a roundabout way of announcing that &lt;a href="http://www.experienceinternet.co.uk/work/detail/labgruppen/" title="Read more about the Labgruppen.com project"&gt;Labgruppen.com&lt;/a&gt; &amp;#8212; a site we designed, built, and continue to maintain &amp;#8212; has received an &amp;#8220;Outstanding Achievement&amp;#8221; &lt;abbr title="Interactive Media Award"&gt;IMA&lt;/abbr&gt;.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s not our first IMA, but in many ways I&amp;#8217;m more chuffed with it than &lt;a href="http://www.experienceinternet.co.uk/blog/archive/interactive-media-award-winner/" title="Read about our Best in Class Interactive Media Award"&gt;the &amp;#8220;Best in Class&amp;#8221; award we got for IconicInteriors.com&lt;/a&gt;, at the end of last year.&lt;/p&gt;

&lt;p&gt;For a start, Iconic was only a few months old when it received the award, whereas the Lab.gruppen site had been live for nearly a year by the time the IMA judges paid a visit.&lt;/p&gt;

&lt;p&gt;As anyone who has developed a large content-managed website knows, a lot can go wrong in a year &amp;#8212; especially on a site with thousands of members, and multiple administrators. The fact that Labgruppen.com still scored 98% in the cross-browser compatibility category is a testament both to the ExpressionEngine CMS, and the content authors at Lab.gruppen.&lt;/p&gt;

&lt;p&gt;The other reason for being particularly pleased with this award is that Lab.gruppen is pretty much the perfect client.&lt;/p&gt;

&lt;p&gt;We work with them week-in, week-out to incrementally improve their sites, ironing out niggling problems, and responding to user feedback. The to-do list is never-ending, but that&amp;#8217;s OK; it means we&amp;#8217;re learning, evolving, and improving, based on &lt;em&gt;actual usage&lt;/em&gt;. That&amp;#8217;s pretty exciting, and very uncommon.&lt;/p&gt;

&lt;p&gt;An ongoing approach is the best (probably only) way to build a rich, usable site, with an enthusiastic user-base, and it&amp;#8217;s a genuine pleasure to be involved with a client who understands this.&lt;/p&gt;

&lt;p&gt;The other side-effect of this ongoing commitment is that you become strangely attached to the site in question.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://labgruppen.com/" title="Visit the main Lab.gruppen website"&gt;Labgruppen.com&lt;/a&gt; certainly isn&amp;#8217;t perfect, and I could rattle off a list of at least half-a-dozen things that bug me about it, or that I would do differently with the benefit of hindsight. It works well, though &amp;#8212; very well in fact &amp;#8212; and my fingerprints are all over every graphic, and every line of code.&lt;/p&gt;

&lt;p&gt;Despite the fact that customer feedback and site stats had long-ago shown Labgruppen.com to be a success, it&amp;#8217;s still nice to have it confirmed by a group of people with no involvement &amp;#8212; or indeed interest &amp;#8212; in the site.&lt;/p&gt;

&lt;p&gt;Call me shallow and needy, but a bit of validation is nice once in a while.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/experience-internet-blog/~4/NQUdEIQh_qA" height="1" width="1"/&gt;</description>
      <dc:date>2009-05-12T13:12:34+00:00</dc:date>
    <feedburner:origLink>http://www.experienceinternet.co.uk/blog/archive/labgruppen-interactive-media-award/#When:13:12:34Z</feedburner:origLink></item>

    <item>
      <title>The Lack of Enterprise Show</title>
      <link>http://feedproxy.google.com/~r/experience-internet-blog/~3/7Ufqi8bzS0Y/</link>
			<author>Stephen Lewis</author>
      <guid isPermaLink="false">http://www.experienceinternet.co.uk/blog/archive/the-lack-of-enterprise-show/#When:17:23:48Z</guid>
      <description>&lt;div class="figure figure-a"&gt;
  &lt;p class="content"&gt;&lt;img src="http://www.experienceinternet.co.uk/images/uploads/blog/20090507-enterprise.jpg" width="511" height="337" alt="The Enterprise Show"&gt;&lt;/p&gt;
  &lt;p class="caption"&gt;&lt;a href="http://www.theenterpriseshows.com/" title="Visit the official Enterprise Show website"&gt;The Enterprise Show&lt;/a&gt;&amp;#8217;s promotional literature.&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;A few weeks ago I wandered into &lt;a href="http://www.theenterpriseshows.com/" title="Visit the official Enterpise Show website"&gt;&lt;em&gt;The Enterprise Show&lt;/em&gt;&lt;/a&gt;, and local initiative to encourage more people to go into business for themselves.&lt;/p&gt;

&lt;p&gt;The advertising for this event was aimed squarely at the latent entrepreneur, with posters asking &amp;#8220;ever dreamed of starting your own business?&amp;#8221;, cartoon thought-bubble and all.&lt;/p&gt;

&lt;p&gt;The tone was deliberately inspiring, implying that &lt;em&gt;The Enterprise Show&lt;/em&gt; was the place to go for practical, hit-the-ground running advice.&lt;/p&gt;

&lt;p&gt;The reality was sadly different. After surrendering all my personal details, I was afforded access to a soul-destroying event focusing entirely on the tedious legal and accounting minutae involved in running a business.&lt;/p&gt;

&lt;p&gt;Granted, getting your legal and accounting ducks in a row is a necessary part of running a business, but it&amp;#8217;s hardly the inspirational fillip that the marketing promised.&lt;/p&gt;

&lt;h2&gt;Living on borrowed time&lt;/h2&gt;

&lt;p&gt;Within two minutes of entering, the helpful &amp;#8220;what is the health of your business&amp;#8221; questionnaire had informed me that my fledgling enterprise was doomed to failure, unless I took immediate steps to develop a comprehensive business plan, and contact my bank about overdraft facilities.&lt;/p&gt;

&lt;p&gt;Just for the record, I&amp;#8217;ve been running this business for 3 years, never borrowed a penny, and am busier now than I&amp;#8217;ve ever been.&lt;/p&gt;

&lt;h2&gt;Catering to the minority&lt;/h2&gt;

&lt;p&gt;The whole experience of attending &lt;em&gt;The Enterprise Show&lt;/em&gt; was very much in-line with my previous encounters with the local Business Link branch (&lt;a href="http://www.businesslink.gov.uk/" title="Visit the Business Link website"&gt;the Business Link website&lt;/a&gt;, on the other hand, is very useful).&lt;/p&gt;

&lt;p&gt;In the Humberside region, if your business operates in an arena thick with red-tape &amp;#8212; importing, exporting, or trading hazardous materials, for example &amp;#8212; there&amp;#8217;s a wealth of helpful information and advice available via Business Link.&lt;/p&gt;

&lt;p&gt;The problem is, most entrepreneurs in this area aren&amp;#8217;t international peddlers of kryptonite, they&amp;#8217;re people hoping to start a small local business, providing a simple but valuable service or product to their customers.&lt;/p&gt;

&lt;p&gt;Informing these budding CEOs that they can&amp;#8217;t possibly succeed without a 40-page business plan spilling-over with financial projections and market research isn&amp;#8217;t the best way to encourage fresh thinking, innovation, and growth in the local economy.&lt;/p&gt;

&lt;h2&gt;Keeping it simple&lt;/h2&gt;

&lt;p&gt;In the early days of my business, I wasted far too much time worrying about the legal and accounting side of things. With the benefit of hindsight, here&amp;#8217;s what I consider to be the necessary steps to starting a simple service-based business similar to mine:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Evaluate the validity of your idea. No need for a massive business plan or comprehensive market research, just be honest with yourself. We all know deep-down if our idea is crap, the important thing is to admit it to yourself before you waste too much time or money on it.&lt;/li&gt;
&lt;li&gt;Start small, so you can learn as you go (that&amp;#8217;s part of the fun anyway), and don&amp;#8217;t risk everything on an unproven idea (see point 1).&lt;/li&gt;
&lt;li&gt;Find a solicitor via &lt;a href="http://www.lawsociety.org.uk/" title="Find a local solicitor for your business"&gt;the Law Society website&lt;/a&gt;. Most will provide you with a free initial consultation, so take a couple of hours to meet with a few local firms, pick one that you feel comfortable working with, and give him some money to prepare your terms and conditions.&lt;/li&gt;
&lt;li&gt;Find an accountant via &lt;a href="http://www.icaew.com/" title="Find an accountant for your business"&gt;the Institute of Chartered Accountants website&lt;/a&gt;, and sort out the best legal structure for your business. Once again, initial consultations are typically free, so you can shop around a bit to find a firm you&amp;#8217;re happy doing business with.&lt;/li&gt;
&lt;li&gt;Start doing the things that you got into business to do, and hopefully start making some money.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If things go well, there may well come a time when you need to worry about the bigger stuff. That time is not now.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/experience-internet-blog/~4/7Ufqi8bzS0Y" height="1" width="1"/&gt;</description>
      <dc:date>2009-05-07T17:23:48+00:00</dc:date>
    <feedburner:origLink>http://www.experienceinternet.co.uk/blog/archive/the-lack-of-enterprise-show/#When:17:23:48Z</feedburner:origLink></item>

    <item>
      <title>Atebits’ Common-Sense Approach to Licensing</title>
      <link>http://feedproxy.google.com/~r/experience-internet-blog/~3/S0FQsDKjn30/</link>
			<author>Stephen Lewis</author>
      <guid isPermaLink="false">http://www.experienceinternet.co.uk/blog/archive/atebits-common-sense-approach-to-licensing/#When:00:04:13Z</guid>
      <description>&lt;p&gt;Along with what seems like the entire Mac Twitterverse, I&amp;#8217;ve just shelled out a few quid for &lt;a href="http://atebits.com/tweetie-mac/" title="See what all the fuss is about"&gt;Tweetie, the new Mac Twitter client from Atebits&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It would seem that Atebits&amp;#8217; talent for simplifying complex interactions extends way beyond the user interface, to the traditionally murky waters of software licenses.&lt;/p&gt;

&lt;p&gt;They take a refreshingly common-sense approach, as explained in the confirmation email:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The rules are simple, you can use that license key for all your Twitter accounts on as many computers as you (personally) own.
  Unless you own like 1,000 computers in which case that&amp;#8217;s just crazy.&lt;/p&gt;
  
  &lt;p&gt;If you &lt;em&gt;don&amp;#8217;t&lt;/em&gt; have a crazy number of computers, but you &lt;em&gt;do&lt;/em&gt; you have any questions or just want to say hi, send an email to support@atebits.com.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The language is friendly and mature, treating the recipient (who just &lt;em&gt;bought the app&lt;/em&gt;, let&amp;#8217;s not forget) like a reasonable human being, and makes a refreshing change to swathes of &amp;#8220;we know you&amp;#8217;re just itching to steal our software&amp;#8221; legalese.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/experience-internet-blog/~4/S0FQsDKjn30" height="1" width="1"/&gt;</description>
      <dc:date>2009-04-22T00:04:13+00:00</dc:date>
    <feedburner:origLink>http://www.experienceinternet.co.uk/blog/archive/atebits-common-sense-approach-to-licensing/#When:00:04:13Z</feedburner:origLink></item>

    <item>
      <title>An Alternative Approach to Password Confirmation</title>
      <link>http://feedproxy.google.com/~r/experience-internet-blog/~3/DNpPcKcht7E/</link>
			<author>Stephen Lewis</author>
      <guid isPermaLink="false">http://www.experienceinternet.co.uk/blog/archive/an-alternative-approach-to-password-confirmation/#When:12:00:03Z</guid>
      <description>&lt;p&gt;I read &lt;a href="http://www.viget.com/advance/password-fields-are-annoying/" title="Read the article that inspired this post"&gt;an interesting article over at the Viget Labs website&lt;/a&gt; this morning, about the annoyances associated with the traditional &amp;#8220;Password / Confirm Password&amp;#8221; fields on sign-up forms.&lt;/p&gt;

&lt;p&gt;The author, Kevin Vigneault, proposed several alternatives, one of which (the &amp;#8220;Show Password&amp;#8221; checkbox) is used in a number of Mac OS X applications. This got me thinking about a possible solution not mentioned by Kevin, which is the standard way the iPhone handles password input.&lt;/p&gt;

&lt;p&gt;For those of you not familiar with the idea, the iPhone displays the last character entered for a couple of seconds, before it reverts to being the standard password &amp;#8220;bullet&amp;#8221;.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve quickly knocked up a JavaScript-driven equivalent (below), using unobtrusive JavaScript to enhance a standard password / password confirm form. The password fields are hidden, and a standard text field is created on-the-fly, with a &amp;#8220;keyup&amp;#8221; event listener.&lt;/p&gt;

&lt;p&gt;I haven&amp;#8217;t tackled the task of writing the password back to the hidden fields, as this is more a proof of concept.&lt;/p&gt;

&lt;form id="test-form" method="post" style="background : #EEE; border : 1px solid #DDD; margin-bottom : 1.818em; padding: 0.909em 10px 0;"&gt;
&lt;div style="padding-bottom : 10px;"&gt;
&lt;label for="password"&gt;Password&lt;/label&gt;
&lt;input type="password" id="password" name="password" /&gt;
&lt;/div&gt;
    
&lt;div style="padding-bottom : 10px;"&gt;
&lt;label for="password-confirm"&gt;Confirm Password&lt;/label&gt;
&lt;input type="password" id="password-confirm" name="password-confirm" /&gt;
&lt;/div&gt;
&lt;/form&gt;

&lt;p&gt;In keeping with the original article, it&amp;#8217;s worth mentioning the pros and cons of this method:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Pros&lt;/em&gt;: visual confirmation of the information entered is provided, without displaying the full password.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cons&lt;/em&gt;: &amp;#8220;keyboard-starers&amp;#8221; may never see the visual feedback.&lt;/p&gt;

&lt;p&gt;If you have any comments or suggestions &lt;a href="http://www.experienceinternet.co.uk/contact/" title="Get in touch"&gt;I&amp;#8217;d love to hear them&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/experience-internet-blog/~4/DNpPcKcht7E" height="1" width="1"/&gt;</description>
      <dc:date>2009-04-16T12:00:03+00:00</dc:date>
    <feedburner:origLink>http://www.experienceinternet.co.uk/blog/archive/an-alternative-approach-to-password-confirmation/#When:12:00:03Z</feedburner:origLink></item>

    <item>
      <title>Kicking the Business Book Habit</title>
      <link>http://feedproxy.google.com/~r/experience-internet-blog/~3/Tea08qPoBWM/</link>
			<author>Stephen Lewis</author>
      <guid isPermaLink="false">http://www.experienceinternet.co.uk/blog/archive/kicking-the-business-book-habit/#When:20:29:47Z</guid>
      <description>&lt;div class="figure figure-a"&gt;
&lt;p class="content"&gt;&lt;img src="http://www.experienceinternet.co.uk/images/uploads/blog/20090411-books.jpg" width="511" height="237" alt="A bookshelf full of small business books" /&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Until fairly recently, I was an avid reader of small-business books. &lt;a href="http://www.amazon.co.uk/gp/product/0887307280?ie=UTF8&amp;amp;tag=experience-21" title="Buy the E-Myth Revisited from Amazon.co.uk"&gt;The E-Myth Revisited&lt;/a&gt;, &lt;a href="http://www.amazon.co.uk/gp/product/078522100X?ie=UTF8&amp;amp;tag=experience-21" title="Buy Duct Tape Marketing from Amazon.co.uk"&gt;Duct Tape Marketing&lt;/a&gt;, &lt;a href="http://www.amazon.co.uk/gp/product/0091923727?ie=UTF8&amp;amp;tag=experience-21" title="Buy The Four Hour Work Week from Amazon.co.uk"&gt;The Four Hour Work Week&lt;/a&gt;, you name it &amp;#8212; if it was about the process of running and growing a small business, it was required reading.&lt;/p&gt;

&lt;p&gt;Now, I actively avoid reading such books.&lt;/p&gt;

&lt;p&gt;It certainly wasn&amp;#8217;t that I ran out of reading material &amp;#8212; there&amp;#8217;s a ridiculous backlog of them sitting on my bookshelves, waiting for their chance to educate me how best to run my business. Rather, I came to realise that I was reading instead of doing.&lt;/p&gt;

&lt;p&gt;Reading about doing results in a very misplaced sense of progress. Reading 200 pages detailing exactly how to attract a never-ending stream of eager clients to your door can easily result in the assumption that this is pretty much a done-deal; all you have to do now is implement the recommendations, and you&amp;#8217;ll be sorted.&lt;/p&gt;

&lt;p&gt;For me at least, the &amp;#8220;this has worked for thousands of small businesses&amp;#8221; tone of most small-business books effectively trivialised the most important element &amp;#8212; the doing.&lt;/p&gt;

&lt;p&gt;By constantly devouring small-business books, I was forever postponing the implementation of the brilliant ideas contained within. I&amp;#8217;d start of course, but would inevitably get distracted by the next book offering its own recommendations, which had worked wonders for thousands of small businesses.&lt;/p&gt;

&lt;h2&gt;Going cold turkey&lt;/h2&gt;

&lt;p&gt;When I finally acknowledged the blindingly obvious fact that I was involved in an elaborate cycle of procrastination, I did something &amp;#8220;radical&amp;#8221;; I put all the small-business books away (with the exception of &lt;a href="http://gettingreal.37signals.com/" title="Find out more about Getting Real, by 37signals"&gt;37signals&amp;#8217; &amp;#8220;Getting Real&amp;#8221;&lt;/a&gt;), tried my best to stop worrying about the future of my business, and went back to just doing what I enjoy.&lt;/p&gt;

&lt;p&gt;No more attempts to create a predictable funnel of new business, no more educating my target market on the value of the services I offer. Just designing and coding for fun, because I&amp;#8217;m a geek and that&amp;#8217;s what I like doing.&lt;/p&gt;

&lt;p&gt;This was towards the tail end of last year, just as the economy was going through the floor, and anybody with any sense was ramping up their marketing efforts. Not surprisingly, we had a couple of &lt;em&gt;very&lt;/em&gt; quiet months.&lt;/p&gt;

&lt;h2&gt;Resisting temptation&lt;/h2&gt;

&lt;p&gt;Instead of rushing back to the books though, I continued doing what I love. I tidied up a few &lt;a href="http://www.experienceinternet.co.uk/resources/" title="See all of our ExpressionEngine add-ons"&gt;ExpressionEngine add-ons&lt;/a&gt; that I&amp;#8217;d developed for internal use, and released them to the community for free. I also became more involved in &lt;a href="http://expressionengine.com/forums/" title="Visit the ExpressionEngine forums"&gt;the ExpressionEngine forums&lt;/a&gt;, simply because I had a bit more time on my hands.&lt;/p&gt;

&lt;p&gt;This wasn&amp;#8217;t part of a big marketing plan. There was no attempt to establish my expertise within a particular niche, or build a marketing list by offering something of value for free. It was just the natural thing to do.&lt;/p&gt;

&lt;p&gt;And then something rather wonderful happened.&lt;/p&gt;

&lt;p&gt;Other ExpressionEngine developers started downloading and using the add-ons I&amp;#8217;d developed. They started leaving &lt;a href="http://expressionengine.com/forums/viewreply/557697/" title="Praise for the SL Developer Info module"&gt;nice comments&lt;/a&gt; on the EE forums and Tweeting about them. Some &lt;a href="http://ellislab.com/" title="Visit the EllisLab website"&gt;pretty&lt;/a&gt; &lt;a href="http://www.campaignmonitor.com/blog/post/2692/expressionengine-extension-now-available/" title="SL Freshview Subscribe gets some love from the CampaignMonitor team"&gt;big&lt;/a&gt; companies (in my little world) even started plugging them.&lt;/p&gt;

&lt;p&gt;I was, frankly, rather chuffed. There was still bugger all work coming in, but I didn&amp;#8217;t even care at that point. It was just nice to get some positive feedback from my peers, and feel like I was contributing something &amp;#8212; however small &amp;#8212; to a product and community that I genuinely like.&lt;/p&gt;

&lt;p&gt;And then, after a couple of months, something even more wonderful happened.&lt;/p&gt;

&lt;p&gt;People started contacting me directly, offering me ExpressionEngine-specific jobs &amp;#8212; everything from small custom add-ons, right through to full EE-driven websites &amp;#8212; all on the back of the free add-ons I&amp;#8217;d written and released for fun.&lt;/p&gt;

&lt;p&gt;A few months on, and the majority of new work coming through the door can still be traced back to those add-ons. The best part is that I&amp;#8217;m being paid to do something that I was doing for pleasure anyway.&lt;/p&gt;

&lt;p&gt;So those business books are staying on the shelf. I&amp;#8217;m going to continue doing what I enjoy, and see where it takes me, and my business. I recommend you do the same.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/experience-internet-blog/~4/Tea08qPoBWM" height="1" width="1"/&gt;</description>
      <dc:date>2009-04-11T20:29:47+00:00</dc:date>
    <feedburner:origLink>http://www.experienceinternet.co.uk/blog/archive/kicking-the-business-book-habit/#When:20:29:47Z</feedburner:origLink></item>

    
    </channel>
</rss>
