life-sync
life-sync
is a CLI tool that makes it easier to synchronize dotfiles
repository with personal configs across multiple machines.
Motivation
You might have some configuration files with different settings for your system.
For example:
- Preferred settings for your editors (Spacemacs, Vim, etc.).
- Useful bash aliases and other miscellaneous shell settings.
- Git configuration.
And much more! But sometimes you start working from a new fresh machine without
having your settings within touch, like in these situations:
- You bought a new PC or laptop.
- You might reinstall your system on your working machine.
- You were given a new laptop at work.
Every time this happens, you need to walk through the tedious process of copying
your data again. It's a well-known practice to
store configs in dotfiles
GitHub repository.
And life-sync
makes it much easier to maintain this repository! With a single
command, your can copy every file and directory from dotfiles
repository to
your machine. Or update your remote dotfiles
repository after multiple local
changes to different files.
Installation
Installation process can be done with one simple command:
$ cabal install life-sync
or
$ stack install life-sync-1.0
You can turn on the bash auto-completion by running the following command:
$ source <(life --bash-completion-script `which life`)
Usage
NOTE: make sure you configured SSH for your Github. life-sync
assumes
that you have SSH configured.
After installing life-sync
you need to call command life
with specified options:
$ life --help
Usage: life COMMAND
life-sync synchronize your personal configs
Available options:
-h,--help Show this help text
Available commands:
init Initialize GitHub repository named 'dotfiles' if you
don't have one.
add Add file or directory to the life configuration.
remove Remove file or directory from the life configuration.
push Updates GitHub repository from local state and push
the latest version.
pull Updates local state of '.life' and 'dotfiles' from
GitHub repository.
`life init` usage: life init OWNER
OWNER Your github user name
`life add` usage: life add ((-f|--file FILE_PATH) | (-d|--dir DIRECTORY_PATH))
-f,--file FILE_PATH File to add
-d,--dir FILE_PATH Directory to add
`life remove` usage: life remove ((-f|--file FILE_PATH) | (-d|--dir DIRECTORY_PATH))
-f,--file FILE_PATH File to remove
-d,--dir FILE_PATH Directory to remote
`life push` usage: life push
`life pull` usage: life pull OWNER [-f|--no-file FILE_PATH] [-d|--no-dir FILE_PATH]
OWNER Your github user name
-f,--no-file FILE_PATH Excluding these specific files from copying
-d,--no-dir FILE_PATH Excluding these specific directories from copying
NOTE: If some command takes a path to a file or a directory as an
argument, the path should be specifed relative to the home directory.
life-sync
keeps the structure of your dotfiles
repository in its own file
called .life
which is stored in dotfiles
repository as well.
You can see an example of dotfiles
repository maintained by life-sync
here:
Examples
Create dotfiles
repository for the first time
$ life init MyGithubName
Track new file or directory
To track a file:
$ life add -f path/to/file/relative/from/home
To track a directory:
$ life add -d path/to/dir/relative/from/home
To stop tracking some file, use life remove
command instead.
Push all changes to remote repository
$ life push
Pull all changes from remote repository
To pull every file and directory:
$ life pull ChShersh
To pull everything except some files or some directories:
$ life pull ChShersh --no-file some/file --no-dir some/dir