MPL-2.0 licensed by Dmitrii Kovanikov, Veronika Romashkina
Maintained by Kowainik
This version can be pinned in stack with:life-sync-1.1.1.0@sha256:a7d15250fa0413230f441d8369c0ce8dfc0542521ab1dd69d02d022cc308744f,4307

life-sync

Hackage Build status MIT license Stackage LTS Stackage Nightly

life-sync is a CLI tool that makes it easier to synchronize a repository of personal config files across multiple machines.

Motivation

You might have some configuration files with different settings for your system. For example:

  1. Preferred settings for your editors (Spacemacs, Vim, etc.).
  2. Useful bash aliases and other miscellaneous shell settings.
  3. Git configuration.

And much more! But sometimes you start working from a fresh machine without having your settings within reach, as in these situations:

  1. You bought a new PC or laptop.
  2. You reinstalled the operating system on your machine.
  3. 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 a 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 your dotfiles repository to your machine. Or update your remote dotfiles repository after multiple local changes to different files.

Prerequisites

  • git
  • hub
  • SSH access to Github configured

Installation

There are several ways to install life on your machine. Here are detailed instructions on different approaches.

From Hackage/Stackage

Install with one simple command:

$ cabal install life-sync

or

$ stack install life-sync

Homebrew

If you are on MacOS, you can get life-sync using Homebrew Kowainik’s Tap.

You need to run the following commands for that:

$ brew tap kowainik/tap
$ brew install life-sync

Ubuntu

If you are on Ubuntu, you can get life-sync from Kowainik’s PPA.

You need to run the following commands for that:

$ sudo add-apt-repository ppa:kowainik/life-sync
$ sudo apt update
$ sudo apt install life-sync

Setup

You can turn on bash auto-completion by running the following command:

$ source <(life --bash-completion-script `which life`)

Usage

After installing life-sync you need to call the 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 a 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 also stored in your dotfiles repository.

You can see an example of a dotfiles repository maintained by life-sync here:

Examples

Create a dotfiles repository for the first time

$ life init MyGithubName

Track a 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 instead.

Push all changes to the remote repository

$ life push

Pull all changes from the 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

Changes

Changelog

life-sync uses PVP Versioning. The change log is available on GitHub.

1.1.1.0 — May 21, 2020

  • #101: Support GHC-8.10.1.
  • #98: Use relude-0.7.0.0.
  • #100: Use tomland-1.3.0.0.
  • #97: Use validation-selective-0.1.0.0.
  • #96: Use colourista-0.1.0.0.
  • Use path-0.7.0.

1.1.0.0 — Mar 25, 2020

  • #36: Get GitHub username from .gitconfig if applicable. (by @SanchayanMaity)
  • #48: Fix minor bug with broken life add -d. (by @nixorn)
  • #65:
    • Move to GHC-8.8.3.
    • Bump up relude to 0.6.0.0.
    • Bump up tomland to 1.2.1.0.
    • Bump up optparse-applicative to 0.15. (by @chshersh)
  • #68: Move to validation-selective. (by @chshersh)
  • #75: Move to colourista. (by @chshersh)
  • #70: Move to shellmet. (by @vrom911)
  • #77: Remove fmt dependency. (by @chshersh)
  • #79: Remove microlens-platform dependency. (by @vrom911)
  • #59: Bump to relude-0.4.0. Bump to GHC-8.4.4. (by @nixorn)

1.0.1

  • Switch to relude.

1.0

  • Initially created.