Having a repository with a collection of all your dotfiles is the best way to keep your environments synced on multiple machines (i.e. home and work). Having one of these bad boys allows you to set up a new machine in a matter of seconds, installing for you all your settings, alias and even programs.

But What is exactly a dotfile?

Quoting Captain Hindsight, a dotfile is a file which filename starts with a ..
A file starting with a . means that is not a normal file, they don't have an extension, and in Unix file systems they are hidden. Dotfiles are files usually stored in your ~ and they contain a bunch of settings and configurations. For example, .gitconfig can contain a series of shortcuts you usually use in git, .bashrc can containing a bunch of alias or programs automatically executed once you open your terminal.

One to rule them all

It has been a while since I started messing around with all my dotfiles. My first approach was copying them manually or using Dropbox and symlinks to move and link them across different machines. It was working but it wasn't the best solution possible, even because I was just copying around some setting, I wanted to have just a command to run and, here we go, everything ready.
One day, one of the lazy ones, I didn't want to lose my mind trying to reproduce my favourite environment in the nth new machine. I started googling a bit looking for a better approach and I found my eldorado https://dotfiles.github.io/, an entire page of Github dedicated to exactly this annoying procedure.
Following the approach of "copy from the best" I created a small repo containing my basic set up.

The magic box

This is the structure of the ring repo:

├── Brewfile
├── Makefile
├── README.md
├── git
│   ├── gitconfig
│   └── gitignore
└── zsh
    ├── aliases
    └── zshrc
Brewfile

It's where all the programs/apps are installed from git to flux and some Finder improvements.

Makefile

It's the engine and were the magic happens. It contains a bunch of symlinks that copy the bash and git setting into the root directory of the user:

symlinks:
	@ln -sf $(DIR)/git/gitconfig ~/.gitconfig
	@ln -sf $(DIR)/git/gitignore ~/.gitignore
	@ln -sf $(DIR)/zsh/zshrc ~/.zshrc

There is a part also dedicated to the installation and the upgrade of the programs via brew:


brew:
	brew update
	brew upgrade
	brew tap Homebrew/bundle
	brew tap caskroom/versions
	brew bundle
	brew cleanup
git/

ça va sans dire, it contains all the settings related to git.

zsh

See above, all the settings related to the CLI.

Up and running

There are just a couple of pre-requisites, that I the future I want to automate as well:

  • zsh instead of the normal bash I use oh-my-zsh.
  • brew a package manager for osX Homebrew.

Once that these two are installed you are ready to rock.
First of all download the git repository:

git clone https://github.com/sirLisko/dotfiles.git
cd dotfiles

And the install them:

make

That's it.

To infinity and beyond

Unfortunately, I didn't have much time to work on improve and expand them. There are definitely a bunch of things I'd like to optimise, for example, removing the pre-requisites. A draft of future implementation includes:

  • automate the installation of zsh
  • automate the installation of brew
  • osX settings
  • NPM global packages
  • ATM and Atom configuration

For the moment I am already pretty satisfied enough of the work I've done around them.
I suggest to play with your dotfiles, it's a good exercise and well spent time, you will definitely learn a lot of new things and the next time you have to set up a new machine you will fill like a magician.