GitHub was my first choice, but my some of my work is not supposed to be available to the public, and I didn't think premium account was worth it. Setting up my own server seemed like too much work. My search for something simple, free, yet fast and reliable pointed me to Dropbox.
Dropbox has always been my favorite way to sync files and passwords between my devices. Here's how to turn it into a perfect remote Git repository.
First, we need a local Git repository with our work in it. If you don't already have one create one:
git init /path/to/new-project
It's good to have a README file, so let's make one:
cd /path/to/new-project touch README
Now, let's stage and commit our changes:
git add . git commit -m "Initial Commit"
Next, we create an empty "remote" repository in our Dropbox folder:
git init --bare ~/Dropbox/git/new-project.git
Technically, it's still stored locally on the same machine, but because it's inside our Dropbox folder, it will be automagically synced to the cloud and other linked devices.
We still need to "add" our remote repository to the local one:
git remote add dropbox ~/Dropbox/git/new-project.git
I'm naming my remote repository "dropbox" instead of traditional "origin". This could be handy if you have multiple remote repositories.
Then, push local master branch to remote:
git push -u dropbox master
I am also telling git to track remote master branch as upstream with -u flag.
Now I can work in my local repository, make changes and commits, and periodically updating remote repository with:
git push
If I need to work on my home computer, I can simply clone my project from remote repository inside my Dropbox with:
git clone -o dropbox ~/Dropbox/git/new-project.git
If local repository already exists on my home computer, but doesn't have the latest changes, we can fetch and merge them from remote with:
git pull
Now we have a distributed VCS with a central server, which is fast, reliable, super easy to setup, doesn't require maintenance, private and is free of charge. It might not be suitable for collaboration between multiple developers, but it's ideal for the needs of one.