You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
Go to file
Kevin Zhuang f8f577f24a docs(changelog): update changelog and version number 4 years ago
.github/workflows adjust CI shellcheck 4 years ago
helper docs(changelog): update changelog and version number 4 years ago
scripts test(funtrack): update funtrack test 4 years ago
tests fix(test): fix test faile 4 years ago
.gitignore feat: ignore all files in scripts except scripts being used for dotbare 4 years ago
CHANGELOG.md docs(changelog): update changelog and version number 4 years ago
Dockerfile chore(docker): update docker file to include completion 4 years ago
LICENSE Create LICENSE 4 years ago
README.md docs: update changelog and readme 4 years ago
buildspec.yml adjust CI shellcheck 4 years ago
dotbare refactor(main): remove the /usr/bin/git invoke, directly use git 4 years ago
dotbare.plugin.bash fix(completion): fix bash completion due to new changes 4 years ago
dotbare.plugin.zsh Create zsh plugin 4 years ago

README.md

dotbare

CI Status AWSCodeBuild Platform License

Introduction

dotbare is a command line utility to help manage dotfiles. It wraps around git bare repository and heavily utilises fzf for an interactive experience. It is inspired by forgit, a git wrapper using fzf. dotbare uses a different implementation approach and focuses on managing and interacting with system dotfiles. Don't worry about migration if you have a symlink/GNU stow setup, you can easily integrate dotbare with them.

Pros:

  • No symlink
  • Simple setup/remove
  • Customizable
  • Easy migration
  • Flat learning curve
  • Manage dotfiles anywhere in your system
  • Integration with symlink/GNU stow setup

You could find out how git bare repository could be used for managing dotfiles here. Or a video explanation that helped me to get started. If you are currently using a symlink/GNU stow setup, checkout how to integrate dotbare with them here.

Demo

Why

It has always been a struggle for me to get started with managing dotfiles using version control, as tools like "GNU stow" really scares me off with all the symlinks, until I found out about using git bare repository for managing dotfiles, zero symlinks, minimal setup required while keeping dotfiles at the location they should be.

However, it has always lack some interactive experience as it does not provide any auto completion on git commands nor file paths by default. It is also a pain when migrating the setup over to another system as you will have to manually resolve all the git checkout issues.

dotbare solves the above problems by providing a series of scripts starts with a prefix f (e.g. dotbare fadd, dotbare flog etc) that will enable a interactive experience by processing all the git information and display it through fzf. dotbare also comes with the ability to integrate with GNU stow or any symlink set up as long as you are using git. It is easy to migrate to any system with minimal set up required.

Install

zsh

dotbare should work with any zsh plugin manager, below is only demonstration.

zinit

zinit light kazhala/dotbare

oh-my-zsh

  • Clone the repository in to oh-my-zsh plugins directory.

    git clone https://github.com/kazhala/dotbare.git $HOME/.oh-my-zsh/custom/plugins/dotbare
    
  • Activate the plugin in ~/.zshrc.

    plugins=( [plugins...] dotbare [plugins...] )
    

Antigen

antigen bundle kazhala/dotbare

Manual

  • Clone the repository (change ~/.dotbare to the location of your preference).

    git clone https://github.com/kazhala/dotbare.git ~/.dotbare
    
  • Put below into .zshrc.

    source ~/.dotbare/dotbare.plugin.zsh
    

bash

dotbare comes with a dotbare.plugin.bash which will enable both bash command line completion for dotbare commands and adding dotbare to your PATH.

  • Clone the repository (change ~/.dotbare to the location of your preference).

    git clone https://github.com/kazhala/dotbare.git ~/.dotbare
    
  • Put below into .bashrc or .bash_profile.

    source ~/.dotbare/dotbare.plugin.bash
    

others

  1. Clone the repository (change ~/.dotbare to the location of your preference).

    git clone https://github.com/kazhala/dotbare.git ~/.dotbare
    
  2. Add dotbare to your PATH.

    # This is only an example command for posix shell
    # If you are on fish, use the fish way to add dotbare to your path
    export PATH=$PATH:$HOME/.dotbare
    

    Or you could create a alias which point to dotbare executable.

    alias dotbare="$HOME/.dotbare/dotbare"
    

Getting started

Dependencies

  • Required dependency

    • git
    • fzf
    • bash(You don't need to run bash, but dotbare does require you have bash in your system)
  • Optional dependency

    • tree (Provide a directory tree view when finding directory)

      # if you are on macos
      brew install tree
      
    • bat, highlight, coderay or rougify (Syntax highlighting when previewing files)

    • delta, diff-so-fancy or any diff tools of your choice (Fancy git diff preview like in the screen shot)

Setup

  1. init git bare repository.

    Note: by default, dotbare finit will set up a bare repository in $HOME/.cfg, to customize location and various other settings, checkout customization

    dotbare finit
    
  2. add dotfiles you want to track.

    Treat dotbare as normal git commands.

    dotbare fadd -f
    # or
    dotbare add [FIELNAME]
    
    # add entire repository like .config directory
    dotbare fadd -d
    # or
    dotbare add [DIRECTORY]
    
  3. commit changes and push to remote.

    dotbare commit -m "First commit"
    dotbare remote add origin [URL]
    dotbare push -u origin master
    

Migration

Migrating from normal git bare repository

  1. follow the steps in install to install dotbare.

  2. check your current alias of git bare reference.

    # Below is an example alias, check yours for reference
    alias config=/usr/bin/git --git-dir=$HOME/.cfg --work-tree=$HOME
    
  3. set env variable for dotbare.

    export DOTBARE_DIR="$HOME/.cfg"
    export DOTBARE_TREE="$HOME"
    
  4. remove the original alias and use dotbare.

  5. optionally you could alias config to dotbare so you keep your muscle memory.

    alias config=dotbare
    
Keep your current setup but integrate dotbare
  1. follow the steps in install to install dotbare.

  2. set environment variable so that dotbare knows where to look for git information.

    # e.g. I have all my dotfiles stored in folder $HOME/.myworld and symlinks all of them to appropriate location.
    # export DOTBARE_DIR="$HOME/.myworld/.git"
    # export DOTBARE_TREE="$HOME/.myworld"
    export DOTBARE_DIR=<Path to your .git location>
    export DOTBARE_TREE=<Path to directory which contains all your dotfiles>
    
  3. Run dotbare anywhere in your system.

Note: with this method, you do not run dotbare finit -u [URL] when migrating to new system, you will do your normal migration steps and then do the above steps.

Complete migration

NOTE: There's an open issue where if you have more than 100 dotfiles tracked, this method would cause a crash during migration. Please don't use this method before the issue get resolved.

While bare method is great and easy, I recommend keeping your current symlink/GNU stow setup and integrate it with dotbare instead of a migration. If you are really happy with dotbare, as long as your remote repository resembles the structure of your home holder (reference what I mean in my repo), simply run the command below.

Disclaimer: I have not done nearly enough test on this as I don't personally use symlink/GNU stow setup, migrate this way with caution. I recommend you test this migration in docker, see Test-it-in-docker.

# dotbare will replace all symlinks with the original file and a bare repository will be created at $DOTBARE_DIR
dotbare finit -u [URL]

Migrating dotbare to a new system

  1. follow the steps in install to install dotbare.

  2. Optionally set env variable to customize dotbare location (checkout customization).

    export DOTBARE_DIR="$HOME/.cfg"
    export DOTBARE_TREE="$HOME"
    
  3. give dotbare your remote URL and let it handle the rest.

    dotbare finit -u https://github.com/kazhala/dotfiles.git
    

Test it in docker

When you are about to do migrations, I strongly suggest you give the migration a try in docker first. The dotbare image is based on alpine linux.

docker pull kazhala/dotbare:latest
docker container run -it --rm --name dotbare kazhala/dotbare:latest

migration demo

Customization

dotbare could be customized through modification of env variables.

Note: customization of fzf is not covered here, checkout their wiki.

DOTBARE_DIR

This is the location of the bare repository, dotbare will look for this directory and query git information or it will create this directory when initializing dotbare. Change this to location or rename the directory to your liking.

If you are using symlink/GNU stow setup, set this variable point to the .git folder within your dotfile directory.

# Default value
export DOTBARE_DIR="$HOME/.cfg"

DOTBARE_TREE

This is the working tree for the git bare repository, meaning this is where the version control will take place. I don't recommend changing this one unless ALL of your config file is in something like $XDG_CONFIG_HOME. If you are using symlink/GNU stow setup, set this variable to point to the folder containing all of your dotfiles.

# Default value
export DOTBARE_TREE="$HOME"

DOTBARE_BACKUP

This variable is used to determine where to store the backup of your files. It is used mainly by dotbare fbackup which will back up all of your tracked dotfiles into this location. It is also used by dotbare finit -u [URL], when there is checkout conflict, dotbare will automatically backup conflicted files to this location.

# Default value
export DOTBARE_BACKUP="${XDG_DATA_HOME:-$HOME/.local/share}/dotbare"

EDITOR

This is probably already set in your ENV. dotbare uses this variable to determine which editor to use when running dotbare fedit.

# Default value
export EDITOR="vim"

DOTBARE_KEY

This variable set default keybinds for fzf in dotbare. You could checkout a list of keybinds to set here.

# Default value
export DOTBARE_KEY="
  --bind=alt-a:toggle-all       # toggle all selection
  --bind=alt-j:jump             # label jump mode, sort of like vim-easymotion
  --bind=alt-0:top              # set cursor back to top
  --bind=alt-s:toggle-sort      # toggle sorting
  --bind=alt-t:toggle-preview   # toggle preview
"

DOTBARE_FZF_DEFAULT_OPTS

Customize fzf settings for dotbare. This is useful when you want a different fzf behavior from your normal system fzf settings.

# By default this variable is not set
# More settings checkout fzf man page and their wiki

DOTBARE_PREVIEW

This variable determines the preview command for file previews. By default, the preview is automatically determined using fall back (bat -> highlight -> coderay -> rougify -> cat). Set this variable to control the preview command if you have a specific preference or if you want extra flags/settings. Reference here.

# By default this value is not set, dotbare uses a fall back method to determine which command to use.
# Make sure to have "{}" included when customizing it, the preview script substitute "{}" for actual filename.
export DOTBARE_PREVIEW="cat -n {}"

DOTBARE_DIFF_PAGER

This variable controls the diff output pager in previews like dotbare flog, dotbare fadd etc. It will read the value of git config core.pager to determine the pager to use. If you have a specific preference for dotbare or have not set the global pager, you could use this variable to customize the diff preview.

# By default this value uses fall back (git config core.pager -> cat)
export DOTBARE_DIFF_PAGER="delta --diff-so-fancy --line-numbers"

Usage

A full list of dotbare commands and their usage are documented in wiki.

Custom Scripts

Detailed explanation of how to create custom scripts and the API of dotbare helper functions is documented over in wiki.

Changes

Latest changes are documented in CHANGELOG.md. View the upcoming changes in the CHANGELOG of dev branch.

Testing

dotbare is unit tested using bats. Mock tests are implemented using PATH override method. This documented in a dedicated README in tests folder for more readability and extensibility.

Not all functions have 100% coverage and lots of user interaction cannot be effectively tested, please fire up issues if something went wrong.

I've added AWSCodeBuild to CI/CD to build the docker image. It is mainly for my personal practice. If you are interested in what's happening in AWSCodeBuild you could checkout my cloudformation template.

Contributing

A CONTRIBUTING.md is coming.

Please help me out by pointing out things that I could improve. I've only been scripting for a few months and are still learning many new things every day. PR are always welcome and please fire up issues if something went wrong.

Leave a star :)

Coming up

  • Improve unit test with mocking
  • Support submodules during migration
  • Command line completion for dotbare in zsh
  • Command line completion for dotbare in bash
  • Command line completion for git commands
  • Man page
  • Installation method

Background

dotbare was initially part of my personal scripts, I had a hard time sharing those scripts and as the number of scripts grows, I feel like is more appropriate to make a dedicated project for it. I hope you find it useful and enjoy it, thanks!

Credit

  • credit to forgit for inspiration.
  • credit to fzf for fzf.
  • credit to OMZ for upgrading method.
  • credit to this post for step by step guide of setting up git bare repo.
  • credit to this video for introducing git bare repo.

Demo

You could find some more demo here asciicast