Got Git?
While adding the contact link to the bottom of every page the other week, I managed to accidentally upload the new changes and an out-of-date stylesheet, and so messed up the view of the whole website. Live. After testing the changes first. And I learnt two things:
- Backup
* Fortunately I have my month of daily backups, so restoring wasn't too painful.
- Version Control (as recommended by @recumbent)
* Even better than backing up, version control would have meant I could rewind the changes immediately.
Enter Git
This isn’t the first time I’ve come across version control, I used git when rewriting TweetUpdater and the WordPress extensions system uses SVN. Git definately made the most sense to me, and I understand the idea of commits and branching and remote repositories (the TweetUpdater code is also hosted on GitHub) and it’s really straight forward to get started with.
From the git-scm quickstart:
<code class="block">cd (project-directory)
git init
(add some files)
git add .
git commit -m 'Initial commit'
</code>
While there are plenty of great guides about online (I’ve been particularly using Pro Git and gitmagic) I also picked up the very handy Version Control with Git as a reference.
Creating Remote Repositories
The one thing that did take me a while to figure out was how to take the initial local repository and create a bare remote on another computer.
It’s not possible just specify a remote and then git push
unless that remote has been initialised; and initialising a bare repository on the other computer is out, apparently the git version I’m using doesn’t allow git init --bare
. Also, it’s not possible to use git clone
with a remote target (like git clone --bare project ssh://remote/path/to/project.git
) that just gets you a local repository with the remote path as the folder name!
The best method I could come up with was to: Clone a bare repository locally,
`git clone --bare project project.git`
then copy the bare repository to the remote location,
`scp -r project.git remote:path/to/project.git`
then add the remote,
`git remote add remote_name remote:path/to/project.git`
and clean up the local bare repo,
`rm -r project.git`
scp Notation for Git Remotes
I was quite pleased when I found out that, as I am using Host definitions in my $HOME/.ssh/config
file, I can use those to simplify the git remote paths:
`git remote add remote1 remote1:path/to/repo.git`
This is especially handy when the remote computer only accepts ssh connections on a non-standard port number.