#!/bin/sh # this script will install the dotfiles from the target git repository, and back up any conflicting files # credit for the basic outline of this script goes to https://www.atlassian.com/git/tutorials/dotfiles set -eu DOTFILES_REPO_DIR="$HOME/git/dotfiles" DOTFILES_REPO_URL="https://git.blake.ly/PowerUser/dotfiles" DOTFILES_BACKUP_DIR="$HOME/.dotfiles-backup_$(date +'%Y-%m-%d_%H:%m:%S')" printf "\n Installing dotfiles from %s\n\n" "$DOTFILES_REPO_URL" # check for the git command and exit if it doesn't exist if ! command -v git > /dev/null;then echo 'Error: git is not installed or could not be found in PATH. Please install git to proceed.' >&2 return 1 fi mkdir -p "$DOTFILES_REPO_DIR" git clone --bare "$DOTFILES_REPO_URL" "$DOTFILES_REPO_DIR" dot() { git --git-dir="$DOTFILES_REPO_DIR" --work-tree="$HOME" "$@" } # remove the '> /dev/null' part if things don't seem to work right if ! dot checkout > /dev/null 2>&1; then echo " Backing up pre-existing dotfiles." mkdir -p "$DOTFILES_BACKUP_DIR" # get the list of files that need to be backed up dot checkout 2>&1 \ | grep -Po '\t\K.*$' \ | while read -r LINE; do LINE_DIR="$(dirname "$LINE")" # No file mkdir -p "$DOTFILES_BACKUP_DIR/$LINE_DIR" mv "$HOME/$LINE" "$DOTFILES_BACKUP_DIR/$LINE_DIR" done # now that all the files are out of the way, we can do one final checkout dot checkout fi dot config status.showUntrackedFiles no printf "\n Installation complete!\n"