Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

I use a Git repository to maintain my dotfiles (vimrc, zshrc, tmux.conf, etc.). As I've two different operating systems (OSX at home and Ubuntu at work) I've dedicated a branch for each system. This results in different versions of dotfiles as OSs are not used to use the same tools/libraries to do a job. This makes the maintenance of dotfiles hard for all the branches (diverged dotfiles). I was thinking if there could be a better strategy for this. Maybe to include system specific dotfiles in another file and include them in dotfiles.

In other words, I'm looking for a cross-platform strategy for maintaining dotfiles for computers with different OS.

Thanks in advance for any help

share|improve this question
add comment

3 Answers 3

up vote 1 down vote accepted

For shell scripts like .zshrc you can use an environment variable or the answer to some command like uname. But for non-shell dotfiles like .vimrc you should do the manual work of commiting patches from one branch to another (from one OS to another).

share|improve this answer
add comment

My solution is to have a separate repositories for each machine.

Since git doesn't follow symlinks (it just stores them), and hard links don't work either, I have written a script that contains a list of files that are the same on both machines. After I've made changes in one of the repositories, I run the script.

If it detects (my computing a checksum) that any of the shared files have changed in this repository, it copies them to the other repository. Then I change to that repository and commit the changes there are well.

share|improve this answer
add comment

In addition to Envite's answer: I use one common .zshrc file, where all ,,portable'' stuff (like shell function definitions etc.) is included. Additionally, I have an extra file .zshrc-MACHINE_A etc. for every computer where I'm using the shared config. Here I define e.g. the PATH, some alias reflecting the current installed programs and so on.

The last part of my common .zshrc file reads

# load $HOST specific setting

if [[ -f ~/.zshrc-$HOST ]]; then
   [[ ! -f ~/.zshrc-$HOST.zwc || ~/.zshrc-$HOST -nt ~/.zshrc-$HOST.zwc ]] && { zcompile ~/.zshrc-$HOST; print - compiled \~/.zshrc-$HOST. }
   source ~/.zshrc-$HOST

According to man zshparam the parameter $HOST contains the current host name, hence should be portable and saves an external program call. And every time the according .zshrc-$HOST file is changed it'll get compiled (via zcompile). The compilation serves the purpose of (I quote man zshbuiltins):

(...) faster autoloading of functions and execution of scripts by avoiding parsing of the text when the files are read.

Probably nowadays you won't notice any difference(?), but it won't hurt either. Btw. the compiles *.zwc files are architecture dependent and cannot be exchanges between different systems.

share|improve this answer
add comment

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.