- Notifications
You must be signed in to change notification settings - Fork494
cowboy/dotfiles
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
My OSX / 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 isdotfiles, and this is my "dotfiles" Git repo.
Whendotfiles is run for the first time, it does a few things:
- In Ubuntu, Git is installed if necessary via APT (it's already there in OSX).
- This repo is cloned into your user directory, under
~/.dotfiles
. - Files in
/copy
are copied into~/
. (read more) - Files in
/link
are symlinked into~/
. (read more) - You are prompted to choose scripts in
/init
to be executed. The installer attempts to only select relevant scripts, based on the detected OS and the script filename. - Your chosen init scripts are executed (in alphanumeric order, hence the funky names). (read more)
On subsequent runs, step 1 is skipped, step 2 just updates the already-existing repo, and step 5 remembers what you selected the last time. The other steps are the same.
- The
/backups
directory gets created when necessary. Any files in~/
that would have been overwritten by files in/copy
or/link
get backed up there. - The
/bin
directory contains executable shell scripts (including thedotfiles script) and symlinks to executable shell scripts. This directory is added to the path. - The
/caches
directory contains cached files, used by some scripts or functions. - The
/conf
directory just exists. If a config file doesn'tneed to go in~/
, reference it from the/conf
directory. - The
/source
directory contains files that are sourced whenever a new shell is opened (in alphanumeric order, hence the funky names). - The
/test
directory contains unit tests for especially complicated bash functions. - The
/vendor
directory contains third-party libraries.
Any file in the/copy
subdirectory will be copied into~/
. Any file thatneeds to be modified with personal information (likecopy/.gitconfig which contains an email address and private key) should becopied 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 symlinked into~/
withln -s
. Edit one or the other, and you change the file in both places. Don't link files containing sensitive data, or you might accidentally commit that data! If you're linking a directory that might contain sensitive data (like~/.ssh
) add the sensitive files to your.gitignore file!
Scripts in the/init
subdirectory will be executed. A whole bunch of things will be installed, butonly if they aren't already.
- Minor XCode init via theinit/10_osx_xcode.sh script
- Homebrew via theinit/20_osx_homebrew.sh script
- Homebrew recipes via theinit/30_osx_homebrew_recipes.sh script
- Homebrew casks via theinit/30_osx_homebrew_casks.sh script
- Fonts via theinit/50_osx_fonts.sh script
- APT packages and git-extras via theinit/20_ubuntu_apt.sh script
- Node.js, npm and nave via theinit/50_node.sh script
- Ruby, gems and rbenv via theinit/50_ruby.sh script
- Vim plugins via theinit/50_vim.sh script
Because thedotfiles script is completely self-contained, you should be able to delete everything else from your dotfiles repo fork, and it will still work. The only thing it really cares about are the/copy
,/link
and/init
subdirectories, which will be ignored if they are empty or don't exist.
If you modify things and notice a bug or an improvement,file an issue ora pull request and let me know.
Also, before installing, be sure toread my gently-worded note.
You need to haveXCode or, at the very minimum, theXCode Command Line Tools, which are available as a much smaller download.
The easiest way to install the XCode Command Line Tools in OSX 10.9+ is to open up a terminal, typexcode-select --install
andfollow the prompts.
Tested in OSX 10.15
You might want to set up your ubuntu serverlike I do it, but then again, you might not.
Either way, you should at least update/upgrade APT withsudo apt-get -qq update && sudo apt-get -qq dist-upgrade
first.
Tested in Ubuntu 14.04 LTS
If you're not me, pleasedo not install dotfiles directly from this repo!
Why? Because I often completely break this repo while updating. Which means that if I do that and you run thedotfiles
command, your home directory will burst into flames, and you'll have to go buy a new computer. No, not really, but it will be very messy.
- Read my gently-worded note
- Fork this repo
- Open a terminal/shell and do this (change
cowboy
andmaster
as appropriate):
export DOTFILES_GH_USER=cowboyexport DOTFILES_GH_BRANCH=masterbash -c"$(wget -qO- https://raw.github.com/$DOTFILES_GH_USER/dotfiles/$DOTFILES_GH_BRANCH/bin/dotfiles)"&&source~/.bashrc
export DOTFILES_GH_USER=cowboyexport DOTFILES_GH_BRANCH=masterbash -c"$(curl -fsSL https://raw.github.com/$DOTFILES_GH_USER/dotfiles/$DOTFILES_GH_BRANCH/bin/dotfiles)"&&source~/.bashrc
Since you'll be using thedotfiles command on subsequent runs, you'll only have to set theDOTFILES_GH_USER
variable for the initial install, but if you have a custom branch, youwill need to exportDOTFILES_GH_BRANCH
for subsequent runs.
There's a lot of stuff that requires admin access viasudo
, so be warned that you might need to enter your password here or there.
bash -c"$(wget -qO- https://bit.ly/cowboy-dotfiles)"&&source~/.bashrc
bash -c"$(curl -fsSL https://bit.ly/cowboy-dotfiles)"&&source~/.bashrc
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 thesource
subdirectory, or add a new file. They're all automatically sourced when a new shell is opened. Take a look, I havea lot of aliases and functions. I even have afancy prompt that shows the current directory, time and current git/svn repo status.
In addition to the aforementioneddotfiles script, there are a few otherbin scripts. This includesnave, which is agit submodule.
- dotfiles - (re)initialize dotfiles. It might ask for your password (for
sudo
). - src - (re)source all files in
/source
directory - Look through thebin subdirectory for a few more.
I thinkmy 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) 2014 "Cowboy" Ben Alman
Licensed under the MIT license.
http://benalman.com/about/license/