Dotfiles management
Storing and managing dotfiles
Use git to store and manage dotfiles like .vimrc
, .bashrc
and .tmux.conf
. Documents the
process outlined here with minor changes and
updates.
The basic idea is that we create a Git repository in the home folder. We won’t use the default
.git
folder in case of conflicts. I’ll use .dotfiles
. We also alias a command so we can update
the dotfiles repo as needed. I use the command dotfiles
as the alias
Create repository to store dotfiles
Create an EMPTY repository somewhere online e.g GitHub.
Add dotfiles to repository
# Create a new empty repo for our dotfiles
git clone --bare https://<dotfiles_repo_link>.git ${HOME}/.dotfiles
# Create an alias dotfiles for dotfiles git commands
alias dotfiles='/usr/bin/git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME'
dotfiles config --local status.showUntrackedFiles no
# Add dotfiles alias to bashrc
echo "alias dotfiles='/usr/bin/git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME'" >> $HOME/.bashrc
After this, you should be able to add dotfiles to the repo via something like
dotfiles add .tmux.conf
dotfiles add .vimrc
dotfiles add .bashrc
dotfiles commit -m "Add dotfiles"
dotfiles push -f origin master
Setup dotfiles in a new machine
To setup the stored dotfiles in a new machine
git clone --bare https://<dotfiles_repo_link>.git ${HOME}/.dotfiles
alias dotfiles='/usr/bin/git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME'
# This will give you errors if dotfiles already exist on the box so you need to remove them and
# rerun command as required
dotfiles checkout
dotfiles config status.showUntrackedFiles no
You can store these steps as a bash script in GitHub gists and just download and run the script when needed via something like
curl -Lks https://gist.githubusercontent.com/pkharel/436cdd5f0d367b8c0a5d122aa5b3ce07/raw | bash
Notes
It’s helpful to have auto download / auto install scripts in your .vimrc
and .tmux.conf
to make
the process smoother for those applications. For example
.vimrc
" Auto install Plug
let data_dir = has('nvim') ? stdpath('data') . '/site' : '~/.vim'
if empty(glob(data_dir . '/autoload/plug.vim'))
silent execute '!curl -fLo '.data_dir.'/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
endif
.tmux.conf
# Auto download and install tpm if necessary
if "test ! -d ~/.tmux/plugins/tpm" \
"run 'git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm && ~/.tmux/plugins/tpm/bin/install_plugins'"