Fork me on GitHub

briefcase

briefcase is a tool to facilitate keeping dotfiles in git, including those with private information (such as .gitconfig).

By keeping your configuration files in a git public git repository, you can share your settings with others. Any secret information is kept in a single file outside the repository (it’s up to you to backup and transport this file).

Getting started

$ gem install briefcase
$ briefcase import ~/.bashrc

You don't appear to have a git repository at /Users/jim/.dotfiles. Do you want
to create one now?
?  (create or abort) c
Creating git repository at /Users/jim/.dotfiles

At this point, a git repository will have been created at ~/.dotfiles, and bashrc will have been moved there and added to the git index. You can verify this using briefcase git, which passes everything through to the git executable (assuming it is installed and on your path).

$ briefcase git status

# On branch master
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
# new file:   bashrc

You’ll probably want to check the bashrc file into your new git repo. Which can be done using the git command again.

$ briefcase git ci -m "Added bashrc"

Great. You’ve successfully added the first file to your new dotfiles repo. I recommend creating a repo on Github or another Git hosting service, adding it as a remote, and pushing your dotfiles there for safekeeping.

$ briefcase git remote add origin git@github.com:jim/dotfiles.git
$ briefcase git push origin master

Commands

import

Imports a dotfile into the dotfiles directory, moving it to the dotfiles directory and replacing it with a symlink to its new location.

$ briefcase import ~/.vimrc

Importing /Users/jim/.vimrc into /Users/jim/.dotfiles
Moving /Users/jim/.vimrc to /Users/jim/.dotfiles/vimrc
Symlinking /Users/jim/.vimrc -> /Users/jim/.dotfiles/vimrc
Done.

redact

Imports a dotfile that contains sensitive information.

$ briefcase redact ~/.config_with_secrets

Importing /Users/jim/.config_with_secrets into /Users/jim/.dotfiles
Moving /Users/jim/.config_with_secrets to /Users/jim/.dotfiles/config_with_secrets
Symlinking /Users/jim/.config_with_secrets -> /Users/jim/.dotfiles/config_with_secrets
Creating redacted version at /Users/jim/.dotfiles/config_with_secrets.redacted

The user is presented with an editor (either vim or the value of the environment variable BRIEFCASE_EDITOR), where sensitive information like this:

password: superSecretPassword

can be replaced with what appears to be a commented out call to a briefcase function:

password: # briefcase(password)

When the file is saved and closed, Briefcase will detect this change and save superSecretPassword to the sercets file using the key password.

The edited file is then saved with a .redacted extension, and the original file is added to ~/.dotfiles/.gitignore so it will not be added to the repository.

Storing secret value for key: password
Adding /Users/jim/.dotfiles/config_with_secrets.redacted to /Users/jim/.dotfiles/.gitignore
Done.

sync

Creates a symlink in the user’s home directory for each dotfile in the dotfiles directory.

$ briefcase sync

Synchronizing dotfiles between /Users/jimb/.dotfiles and /Users/jimb
Symlink verified: /Users/jimb/.ackrc -> /Users/jimb/.dotfiles/ackrc
Symlink verified: /Users/jimb/.autotest -> /Users/jimb/.dotfiles/autotest
Symlink verified: /Users/jimb/.gitconfig -> /Users/jimb/.dotfiles/gitconfig
Symlink verified: /Users/jimb/.gvimrc -> /Users/jimb/.dotfiles/gvimrc
Symlink verified: /Users/jimb/.irbrc -> /Users/jimb/.dotfiles/irbrc
Symlink verified: /Users/jimb/.vim -> /Users/jimb/.dotfiles/vim
Symlink verified: /Users/jimb/.vimrc -> /Users/jimb/.dotfiles/vimrc
Symlink verified: /Users/jimb/.zshenv -> /Users/jimb/.dotfiles/zshenv
Symlink verified: /Users/jimb/.zshrc -> /Users/jimb/.dotfiles/zshrc
Done.

generate

Creates local versions of all redacted dotfiles, using information found in the secrets file to fill in any values that were removed.

$ briefcase generate

Generating redacted dotfiles in /Users/jim/.dotfiles
Generating /Users/jim/.dotfiles/gitconfig
Loading existing secrets from /Users/jim/.briefcase_secrets
Restoring secret value for key: git_user
Restoring secret value for key: git_email
Restoring secret value for key: github_user
Restoring secret value for key: github_token
Done.

git

The git command passes all commands through to the git executable, assuming it is installed on your path. All commands are executed in your dotfiles directory.

$ briefcase git status

# On branch master
nothing to commit (working directory clean)

Filesystem layout

With briefcase, dotfiles are stored in a centralized location (by default ~/.dotfiles), and symlinks are created for these files in the user’s home directory. Here is a basic setup for a .gitconfig file:

+-~/                      Home directory
| +-.briefcase_secrets    Secrets file
| +-.gitconfig            Symlink to ~/.dotfiles/gitconfig
| +-.dotfiles/            Dotfiles directory
| | +-gitconfig           Standard Dotfile
| | +-gitconfig.redacted  Redacted dotfile

Home directory

Where the action happens. Dotfiles that normally exist here are replaced by symlinks to files in the dotfiles directory.

Default location: ~ Override by setting BRIEFCASE_HOME_PATH in your environment.

Dotfiles directory

Where dotfiles are stored.

Default location: ~/.dotfiles Override by setting BRIEFCASE_DOTFILES_PATH in your environment.

There are two types of dotfiles.

Standard dotfiles

A basic config file that would normally live in a user’s home directory.

Redacted dotfiles

A config file that contains some secret information. The file is stored, sans secret info, with a ‘.redacted’ extension in the repo. The dotfile that is symlinked to the user’s home directory is then generated from this file.

Secrets file

This file contains the information removed from dotfiles imported using the redact command.

Default location: ~/.briefcase_secrets Override by setting BRIEFCASE_SECRETS_PATH in your environment.

Copyright (c) 2012 Jim Benton. See LICENSE for details.