Intro to Git for DrupalOr: How I Learned To Stop Worrying and Love Version Control
What’s a version control system?• An application that allows you to record changes to your codebase in a structured and controlled fashion
Why do I need that?• makes it way easier to undo errors / roll back to earlier versions of code• makes it way easier to share a code base between developers without creating conﬂicts
• makes it waaaaay way easier to deploy changes from development to staging to production environments
Analogy:• Using Drupal without a version control system is like rock climbing without any safety gear
• You may be able to get away with it for awhile, but if you slip, you’re going to die.
Some popular version control systems• CVS - Concurrent Versions System• SVN - SubVersioN• Git• Mercurial• Bazaar• LibreSource
Drupal: From CVS to Git• drupal.org used to have all module and project code under CVS• Drupal’s use of CVS system began January 15, 2001 with check in of Drupal 3.0.0 by Dries Buytaert
• worked great for a few years• over time CVS development stagnated• other systems began to appear, newer and hotter• decision to switch from CVS to Git was made in 2010
• Drupal ofﬁcially switched from CVS to Git in 2011 on February 24 at 6:08 pm EST• excellent obituary for CVS by Larry Garﬁeld (Crell - http://drupal.org/user/ 26398) at http://www.garﬁeldtech.com/ blog/cvs-obituary• now entire Drupal project and all modules, distributions and themes use Git
So what’s Git?• initially created in 2005 by Linus Torvalds for Linux kernel development• written mostly in C• it’s a *distributed* version control system, which means...
• every Git working directory contains the complete repository and history and full revision tracking capabilities• you’re not dependent on a central server and you don’t have to be online• it’s rippingly fast - much faster than SVN, CVS, and other systems that have a lot of network latency• snapshot-based
What’s a repository?• it’s a directory that contains all of the data and metadata for your Git-controlled project• called .git/ and it resides in your Drupal site root directory
Git thee to a command line• there are some GUI applications for Git, but it’s essentially a command line tool• it’s by far the most fun to use it on the command line
• in the following example we’ll be using the OS X terminal to connect to a local Ubuntu 12.04 server running in VirtualBox
• we’re going to a) install Git on the server b) set up a new Drupal site c) put the site into a local Git repository (repo) d) create a remote on GitHub e) make a commit locally and push it to the remote GitHub repo
Now all of theﬁles except forthe onesin .gitignore havebeen staged -they’re not in therepo yet, butthey’re ready tobe put there.How do you putthem there?
git commit Actually you’ll want to type:git commit -m “Some text describing your commit”
All ﬁles have now been committed to therepository.If we type “git status” now, we get this:
Now what?• Use GitHub to make your repository available for private or public access
Do I have to use GitHub?• No, but it’s really cool and slightly easier than setting up your own Git server• So! - create an account if you don’t have one (it’s free)• login• set up your SSH keys
SSH keys?Entering your SSH keys establishes a trustedconnection between your GitHub accountand your development server(s), enablingyou to push and pull commits without havingto constantly enter your login information.
You can see a list of your repos on your proﬁle. Click theindicated button to add a new one.
Now all of theﬁles areshowing in thegithub repo.
Dev to GitHub• make a change on your local site and push the change to the GitHub repo• in this case we’re going to install ﬁve modules - ctools, features, panels, token, and views
If you check out the sites/all/modules folder in theGitHub repo, you’ll notice it only has a README ﬁle.
Locally, though, we’ve used Drush to download theﬁve modules, which are sitting in the local copy of thesites/all/modules folder.We want to make those modules show up on theGitHub repo.
Running “git status” shows us that the module foldersare untracked - we need to add them.We can get all of them at once by going to sites/all/and typing “git add modules”.
Commit ‘emNow we need to commit the changes. So wetype: git commit -a -m “Added ﬁve modules - views, panels, ctools, features, and token”And then we push it: git push
Now if we go back to GitHub and reload the page,the modules we pushed are all there.