My OS X / Ubuntu dotfiles.
I've been using bash on-and-off for a long time (since Slackware Linux was distributed on 1.44MB floppy disks). In all that time, every time I've set up a new Linux or OS X machine, I've copied over my .bashrc
file and my ~/bin
folder to each machine manually. And I've never done a very good job of actually maintaining these files. It's been a total mess.
I finally decided that I wanted to be able to execute a single command to "bootstrap" a new system to pull down all of my dotfiles and configs, as well as install all the tools I commonly use. In addition, I wanted to be able to re-execute that command at any time to synchronize anything that might have changed. Finally, I wanted to make it easy to re-integrate changes back in, so that other machines could be updated.
That command is dotfiles, and this is my "dotfiles" Git repo.
It's really not very complicated. When dotfiles is run, it does a few things:
- Git is installed if necessary, via APT or Homebrew (which is installed if necessary).
- This repo is cloned into the
~/.dotfiles
directory (or updated if it already exists). - Files in
init
are executed (in alphanumeric order, hence the "50_" names). - Files in
copy
are copied into~/
. - Files in
link
are linked into~/
.
Note:
- The
backups
folder only gets created when necessary. Any files in~/
that would have been overwritten bycopy
orlink
get backed up there. - Files in
bin
are executable shell scripts (Eg. ~/.dotfiles/bin is added into the path). - Files in
source
get sourced whenever a new shell is opened (in alphanumeric order, hence the "50_" names). - Files in
conf
just sit there. If a config file doesn't need to go in~/
, put it in there. - Files in
caches
are cached files, only used by some scripts. This folder will only be created if necessary.
- You need to be an administrator (for
sudo
). - You need to have installed XCode or, at the very minimum, the XCode Command Line Tools, which are available as a much smaller download thank XCode.
- You need to be an administrator (for
sudo
). - You might want to set up your ubuntu server like I do it, but then again, you might not.
- Either way, you should at least update/upgrade APT with
sudo apt-get -qq update && sudo apt-get -qq dist-upgrade
first.
bash -c "$(curl -fsSL https://bit.ly/cowboy-dotfiles)" && source ~/.bashrc
If, for some reason, bit.ly is down, you can use the canonical URL.
bash -c "$(curl -fsSL https://raw.github.com/ronaldocpontes/dotfiles/master/bin/dotfiles)" && source ~/.bashrc
A whole bunch of things will be installed, but only if they aren't already.
- Homebrew recipes
- git
- tree
- sl
- lesspipe
- id3tool
- nmap
- git-extras
- htop-osx
- man2html
- hub
- cowsay
- ssh-copy-id
- apple-gcc42 (via homebrew-dupes)
- APT packages
- build-essential
- libssl-dev
- git-core
- tree
- sl
- id3tool
- cowsay
- nmap
- telnet
- htop
- Nave
- node (latest stable)
- npm
- grunt-cli
- linken
- bower
- node-inspector
- yo
- node (latest stable)
- rbenv
- ruby 2.0.0-p247
- gems
- bundler
- awesome_print
- pry
- lolcat
Any file in the copy
subdirectory will be copied into ~/
. Any file that needs to be modified with personal information (like .gitconfig which contains an email address and private key) should be copied into ~/
. Because the file you'll be editing is no longer in ~/.dotfiles
, it's less likely to be accidentally committed into your public dotfiles repo.
Any file in the link
subdirectory gets symbolically linked with ln -s
into ~/
. Edit these, and you change the file in the repo. Don't link files containing sensitive data, or you might accidentally commit that data!
To keep things easy, the ~/.bashrc
and ~/.bash_profile
files are extremely simple, and should never need to be modified. Instead, add your aliases, functions, settings, etc into one of the files in the source
subdirectory, or add a new file. They're all automatically sourced when a new shell is opened. Take a look, I have a lot of aliases and functions. I even have a fancy prompt that shows the current directory, time and current git/svn repo status.
In addition to the aforementioned dotfiles script, there are a few other bash scripts. This includes ack, which is a git submodule.
- dotfiles - (re)initialize dotfiles. It might ask for your password (for
sudo
). - src - (re)source all files in
source
directory - Look through the bin subdirectory for a few more.
I think my bash prompt is awesome. It shows git and svn repo status, a timestamp, error exit codes, and even changes color depending on how you've logged in.
Git repos display as [branch:flags] where flags are:
? untracked files
! changed (but unstaged) files
+ staged files
SVN repos display as [rev1:rev2] where rev1 and rev2 are:
rev1 last changed revision
rev2 revision
Check it out:
https://github.com/gf3/dotfiles
https://github.com/mathiasbynens/dotfiles
(and 15+ years of accumulated crap)
Copyright (c) 2013 "Cowboy" Ben Alman
Licensed under the MIT license.
http://benalman.com/about/license/