dotsync
dotfiles manager without symlinks

Getting Started
go install github.com/lufia/dotsync@latest
SYNOPSIS
$ dotsync repo [-w path]
$ dotsync install [-f] source [...] dest
$ dotsync changes
$ dotsync diff [path ...]
$ dotsync pull [-n]
$ dotsync push [-n] [path ...]
$ dotsync uninstall [-f] [path ...]
$ dotsync export
dotsync repo gets the source root path. If -w option is passed, it updates source root with path.
dotsync install links source to dest to manage changes. When -f option is passed, it overwrites dest even if file is already exists.
dotsync uninstall unlink and remove path. When -f option is passed, it removes path even if file is locally modified.
dotsync changes prints locally changed filenames.
dotsync diff prints locally changes.
dotsync pull applies all updates from sources. If -n option is passed, it prints filenames but it don't update them.
dotsync push updates sources with local changes. If -n option is passed, it prints filenames but it don't update them.
FILES
dotsync manages both sources root and state files as a repository where is stored under ~/.local/state/dotsync directory.
The source root is a path to the top of sources, all dotfiles will be copied from that directory. Typically it is managed by Git or other SCMs.
Every state file is named as a relative path from the source root of the source file. These are stored under store directory in the repository, and these contains three values: SHA256 hash of the source file, permission and destination path.
For example, if you link ~/src/dotfiles/dot.bashrc to ~/.bashrc and ~/src/dotfiles/lib/plumbing to ~/lib/plumbing, then the repository will be figured out:
% tree ~/.local/state/dotsync
dotsync─┬─repo
└─store─┬─dot.bashrc
└─lib───plumbing
% cat ~/.local/state/dotsync/repo
/home/xxx/src/dotfiles
% cat ~/.local/state/dotsync/store/dot.bashrc
5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03 644 /home/xxx/.bashrc