2015-07-14 21:39:52 +00:00
|
|
|
." vim: set spell so=8:
|
2016-01-09 03:47:17 +00:00
|
|
|
.TH yadm 1 "08 January 2016" "1.03"
|
2015-07-14 12:48:47 +00:00
|
|
|
.SH NAME
|
|
|
|
yadm \- Yet Another Dotfiles Manager
|
|
|
|
.SH SYNOPSIS
|
2015-07-14 21:39:52 +00:00
|
|
|
.B yadm
|
|
|
|
.I command
|
|
|
|
.RI [ options ]
|
|
|
|
|
|
|
|
.B yadm
|
|
|
|
.I git-command-or-alias
|
|
|
|
.RI [ options ]
|
|
|
|
|
|
|
|
.B yadm
|
|
|
|
init
|
|
|
|
.RB [ -f ]
|
2015-08-29 15:22:41 +00:00
|
|
|
.RB [ -w
|
|
|
|
.IR directory ]
|
2015-07-14 21:39:52 +00:00
|
|
|
|
|
|
|
.B yadm
|
|
|
|
.RI clone " url
|
|
|
|
.RB [ -f ]
|
|
|
|
.RB [ -w
|
|
|
|
.IR directory ]
|
|
|
|
|
|
|
|
.B yadm
|
|
|
|
.RI config " name
|
|
|
|
.RI [ value ]
|
|
|
|
|
|
|
|
.B yadm
|
|
|
|
config
|
|
|
|
.RB [ -e ]
|
|
|
|
|
|
|
|
.B yadm
|
|
|
|
list
|
|
|
|
.RB [ -a ]
|
|
|
|
|
|
|
|
.BR yadm " encrypt
|
|
|
|
|
|
|
|
.BR yadm " decrypt
|
2015-07-17 01:57:53 +00:00
|
|
|
.RB [ -l ]
|
2015-07-14 21:39:52 +00:00
|
|
|
|
|
|
|
.BR yadm " alt
|
|
|
|
|
|
|
|
.BR yadm " perms
|
2015-07-14 12:48:47 +00:00
|
|
|
.SH DESCRIPTION
|
2015-07-14 21:39:52 +00:00
|
|
|
.B yadm
|
|
|
|
is a tool for managing a collection of files across multiple computers,
|
|
|
|
using a shared Git repository.
|
|
|
|
In addition,
|
|
|
|
.B yadm
|
|
|
|
provides a feature to select alternate versions of files
|
|
|
|
based on the operation system or host name.
|
|
|
|
Lastly,
|
|
|
|
.B yadm
|
|
|
|
supplies the ability to manage a subset of secure files, which are
|
|
|
|
encrypted before they are included in the repository.
|
|
|
|
.SH COMMANDS
|
|
|
|
.TP
|
|
|
|
.IR git-command " or " git-alias
|
|
|
|
Any command not internally handled by
|
|
|
|
.B yadm
|
|
|
|
is passed through to
|
|
|
|
.BR git (1).
|
|
|
|
Git commands or aliases are invoked with the
|
|
|
|
.B yadm
|
|
|
|
managed repository.
|
|
|
|
The working directory for git commands will be the configured
|
|
|
|
.IR work-tree " (usually
|
|
|
|
.IR $HOME ).
|
|
|
|
|
|
|
|
Dotfiles are managed by using standard
|
|
|
|
.B git
|
|
|
|
commands;
|
|
|
|
.IR add ,
|
|
|
|
.IR commit ,
|
|
|
|
.IR push ,
|
|
|
|
.IR pull ,
|
|
|
|
etc.
|
|
|
|
|
|
|
|
.RI The " config
|
|
|
|
command is not passed directly through.
|
|
|
|
Instead use the
|
|
|
|
.I gitconfig
|
|
|
|
command (see below).
|
|
|
|
.TP
|
|
|
|
.B alt
|
|
|
|
Create symbolic links for any managed files matching the naming rules describe in the ALTERNATES section.
|
|
|
|
It is usually unnecessary to run this command, as
|
|
|
|
.B yadm
|
|
|
|
automatically processes alternates by default.
|
|
|
|
This automatic behavior can be disabled by setting the configuration
|
|
|
|
.I yadm.auto-alt
|
|
|
|
to "false".
|
|
|
|
.TP
|
|
|
|
.BI clone " url
|
|
|
|
Clone a remote repository for tracking dotfiles.
|
|
|
|
After the contents of the remote repository have been fetched, a "merge" of
|
|
|
|
.I origin/master
|
|
|
|
is attempted.
|
|
|
|
If there are conflicting files already present in the
|
|
|
|
.IR work-tree ,
|
|
|
|
this merge will fail and instead a "reset" of
|
|
|
|
.I origin/master
|
|
|
|
will be done.
|
|
|
|
It is up to the user to resolve these conflicts,
|
|
|
|
but if the desired action is to have the contents in the repository overwrite the existing files,
|
|
|
|
then a "hard reset" should accomplish that:
|
|
|
|
|
|
|
|
.RS
|
|
|
|
.RS
|
|
|
|
yadm reset --hard origin/master
|
|
|
|
.RE
|
|
|
|
.RE
|
|
|
|
.IP
|
|
|
|
The repository is stored in
|
|
|
|
.IR $HOME/.yadm/repo.git .
|
|
|
|
By default,
|
|
|
|
.I $HOME
|
|
|
|
will be used as the
|
|
|
|
.IR work-tree ,
|
|
|
|
but this can be overridden with the
|
|
|
|
.BR -w " option.
|
|
|
|
.B yadm
|
|
|
|
can be forced to overwrite an existing repository by providing the
|
|
|
|
.BR -f " option.
|
|
|
|
.TP
|
|
|
|
.B config
|
|
|
|
This command manages configurations for
|
|
|
|
.BR yadm .
|
|
|
|
This command works exactly they way
|
|
|
|
.BR git-config (1)
|
|
|
|
does.
|
|
|
|
See the CONFIGURATION section for more details.
|
|
|
|
.TP
|
|
|
|
.B decrypt
|
|
|
|
Decrypt all files stored in
|
|
|
|
.IR $HOME/.yadm/files.gpg .
|
|
|
|
Files decrypted will be relative to the configured
|
|
|
|
.IR work-tree " (usually
|
|
|
|
.IR $HOME ).
|
2015-07-17 01:57:53 +00:00
|
|
|
Using the
|
|
|
|
.B -l
|
|
|
|
option will list the files stored without extracting them.
|
2015-07-14 21:39:52 +00:00
|
|
|
.TP
|
|
|
|
.B encrypt
|
|
|
|
Encrypt all files matching the patterns found in
|
|
|
|
.IR $HOME/.yadm/encrypt .
|
|
|
|
See the ENCRYPTION section for more details.
|
|
|
|
.TP
|
|
|
|
.B gitconfig
|
|
|
|
Pass options to the
|
|
|
|
.B git config
|
|
|
|
command. Since
|
|
|
|
.B yadm
|
|
|
|
already uses the
|
|
|
|
.I config
|
|
|
|
command to manage its own configurations,
|
|
|
|
this command is provided as a way to change configurations of the repository managed by
|
|
|
|
.BR yadm .
|
2015-07-26 15:59:13 +00:00
|
|
|
One useful case might be to configure the repository so untracked files are shown in status commands.
|
|
|
|
.B yadm
|
|
|
|
initially configures its repository so that untracked files are not shown.
|
|
|
|
If you wish use the default git behavior (to show untracked files and directories), you can remove this configuration.
|
2015-07-14 21:39:52 +00:00
|
|
|
|
|
|
|
.RS
|
|
|
|
.RS
|
2015-07-26 15:59:13 +00:00
|
|
|
yadm gitconfig --unset status.showUntrackedFiles
|
2015-07-14 21:39:52 +00:00
|
|
|
.RE
|
|
|
|
.RE
|
|
|
|
.TP
|
|
|
|
.B help
|
|
|
|
Print a summary of
|
|
|
|
.BR yadm " commands.
|
|
|
|
.TP
|
|
|
|
.B init
|
|
|
|
Initialize a new, empty repository for tracking dotfiles.
|
|
|
|
The repository is stored in
|
|
|
|
.IR $HOME/.yadm/repo.git .
|
|
|
|
By default,
|
|
|
|
.I $HOME
|
|
|
|
will be used as the
|
|
|
|
.IR work-tree ,
|
|
|
|
but this can be overridden with the
|
|
|
|
.BR -w " option.
|
|
|
|
.B yadm
|
|
|
|
can be forced to overwrite an existing repository by providing the
|
|
|
|
.BR -f " option.
|
|
|
|
.TP
|
|
|
|
.B list
|
|
|
|
Print a list of files managed by
|
|
|
|
.BR yadm .
|
|
|
|
.RB The " -a
|
|
|
|
option will cause all managed files to be listed.
|
|
|
|
Otherwise, the list will only include files from the current directory or below.
|
|
|
|
.TP
|
|
|
|
.B perms
|
|
|
|
Update permissions as described in the PERMISSIONS section.
|
|
|
|
It is usually unnecessary to run this command, as
|
|
|
|
.B yadm
|
|
|
|
automatically processes permissions by default.
|
|
|
|
This automatic behavior can be disabled by setting the configuration
|
|
|
|
.I yadm.auto-perms
|
|
|
|
to "false".
|
|
|
|
.TP
|
|
|
|
.B version
|
|
|
|
Print the version of
|
|
|
|
.BR yadm .
|
|
|
|
.SH CONFIGURATION
|
|
|
|
.B yadm
|
|
|
|
uses a configuration file named
|
|
|
|
.IR $HOME/.yadm/config .
|
|
|
|
This file uses the same format as
|
|
|
|
.BR git-config (1).
|
|
|
|
Also, you can control the contents of the configuration file
|
|
|
|
via the
|
|
|
|
.B yadm config
|
|
|
|
command (which works exactly like
|
|
|
|
.BR git-config ).
|
|
|
|
For example, to disable alternates you can run the command:
|
|
|
|
|
|
|
|
.RS
|
|
|
|
yadm config yadm.auto-alt false
|
|
|
|
.RE
|
|
|
|
|
|
|
|
The following is the full list of supported configurations:
|
|
|
|
.TP
|
|
|
|
.B yadm.auto-alt
|
|
|
|
Disable the automatic linking described in the section ALTERNATES.
|
|
|
|
If disabled, you may still run
|
|
|
|
.B yadm alt
|
|
|
|
manually to create the alternate links.
|
|
|
|
This feature is enabled by default.
|
|
|
|
.TP
|
|
|
|
.B yadm.auto-perms
|
|
|
|
Disable the automatic permission changes described in the section PERMISSIONS.
|
|
|
|
If disabled, you may still run
|
|
|
|
.B yadm perms
|
|
|
|
manually to update permissions.
|
|
|
|
This feature is enabled by default.
|
|
|
|
.TP
|
|
|
|
.B yadm.ssh-perms
|
|
|
|
Disable the permission changes to
|
|
|
|
.IR $HOME/.ssh/* .
|
|
|
|
This feature is enabled by default.
|
2015-08-07 12:18:22 +00:00
|
|
|
.TP
|
|
|
|
.B yadm.gpg-perms
|
|
|
|
Disable the permission changes to
|
|
|
|
.IR $HOME/.gnupg/* .
|
|
|
|
This feature is enabled by default.
|
2015-07-14 21:39:52 +00:00
|
|
|
.SH ALTERNATES
|
|
|
|
When managing a set of files across different systems, it can be useful to have
|
|
|
|
an automated way of choosing an alternate version of a file for a different
|
2016-01-09 03:43:23 +00:00
|
|
|
operation system, host, or user.
|
2015-07-14 21:39:52 +00:00
|
|
|
.B yadm
|
|
|
|
implements a feature which will automatically create a symbolic link to
|
|
|
|
the appropriate version of a file, as long as you follow a specific naming
|
|
|
|
convention.
|
|
|
|
.B yadm
|
2015-07-19 17:06:51 +00:00
|
|
|
can detect files with names ending in:
|
2015-07-14 21:39:52 +00:00
|
|
|
|
|
|
|
.RS
|
2016-01-09 03:43:23 +00:00
|
|
|
.BR ## " or " ##OS " or " ##OS.HOSTNAME " or " ##OS.HOSTNAME.USER
|
2015-07-14 21:39:52 +00:00
|
|
|
.RE
|
|
|
|
|
|
|
|
If there are any files managed by
|
|
|
|
.BR yadm \'s
|
|
|
|
repository which match this naming convention,
|
|
|
|
symbolic links will be created for the most appropriate version.
|
|
|
|
This may best be demonstrated by example. Assume the following files are managed by
|
|
|
|
.BR yadm \'s
|
|
|
|
repository:
|
|
|
|
|
2015-07-19 17:06:51 +00:00
|
|
|
- $HOME/path/example.txt##
|
2015-07-14 21:39:52 +00:00
|
|
|
- $HOME/path/example.txt##Darwin
|
|
|
|
- $HOME/path/example.txt##Darwin.host1
|
|
|
|
- $HOME/path/example.txt##Darwin.host2
|
|
|
|
- $HOME/path/example.txt##Linux
|
|
|
|
- $HOME/path/example.txt##Linux.host1
|
|
|
|
- $HOME/path/example.txt##Linux.host2
|
|
|
|
|
|
|
|
If running on a Macbook named "host2",
|
|
|
|
.B yadm
|
|
|
|
will create a symbolic link which looks like this:
|
|
|
|
|
|
|
|
.IR $HOME/path/example.txt " -> " $HOME/path/example.txt##Darwin.host2
|
|
|
|
|
|
|
|
However, on another Mackbook named "host3",
|
|
|
|
.B yadm
|
|
|
|
will create a symbolic link which looks like this:
|
|
|
|
|
|
|
|
.IR $HOME/path/example.txt " -> " $HOME/path/example.txt##Darwin
|
|
|
|
|
|
|
|
Since the hostname doesn't match any of the managed files, the more generic version is chosen.
|
|
|
|
|
2015-07-19 17:06:51 +00:00
|
|
|
If running on a Linux server named "host4", the link will be:
|
2015-07-14 21:39:52 +00:00
|
|
|
|
|
|
|
.IR $HOME/path/example.txt " -> " $HOME/path/example.txt##Linux
|
|
|
|
|
2015-07-19 17:06:51 +00:00
|
|
|
If running on a Solaris server, the link use the default "##" version:
|
2015-07-14 21:39:52 +00:00
|
|
|
|
2015-07-19 17:06:51 +00:00
|
|
|
.IR $HOME/path/example.txt " -> " $HOME/path/example.txt##
|
|
|
|
|
2016-01-09 03:43:23 +00:00
|
|
|
If no "##" version exists and no files match the current OS/HOSTNAME/USER, then no link will be created.
|
2015-07-19 17:06:51 +00:00
|
|
|
|
|
|
|
OS is determined by running
|
|
|
|
.BR uname\ -s ,
|
2016-01-09 03:43:23 +00:00
|
|
|
HOSTNAME by running
|
|
|
|
.BR hostname\ -s ,
|
|
|
|
and USER by running
|
|
|
|
.BR id\ -u\ -n .
|
2015-07-14 21:39:52 +00:00
|
|
|
.B yadm
|
|
|
|
will automatically create these links by default. This can be disabled using the
|
|
|
|
.I yadm.auto-alt
|
|
|
|
configuration.
|
|
|
|
Even if disabled, links can be manually created by running
|
|
|
|
.BR yadm\ alt .
|
|
|
|
.SH ENCRYPTION
|
2015-08-07 12:18:22 +00:00
|
|
|
It can be useful to manage confidential files, like SSH or GPG keys, across
|
|
|
|
multiple systems. However, doing so would put plain text data into a Git
|
|
|
|
repository, which often resides on a public system.
|
2015-07-14 21:39:52 +00:00
|
|
|
.B yadm
|
|
|
|
implements a feature which can make it easy to encrypt and decrypt a set of
|
|
|
|
files so the encrypted version can be maintained in the Git repository.
|
|
|
|
This feature will only work if the
|
|
|
|
.BR gpg (1)
|
|
|
|
command is available.
|
|
|
|
|
|
|
|
To use this feature, a list of patterns must be created and saved as
|
|
|
|
.IR $HOME/.yadm/encrypt .
|
|
|
|
This list of patterns should be relative to the configured
|
|
|
|
.IR work-tree " (usually
|
|
|
|
.IR $HOME ).
|
|
|
|
For example:
|
|
|
|
|
|
|
|
.RS
|
2015-08-07 12:18:22 +00:00
|
|
|
.ssh/*.key
|
|
|
|
.gnupg/*.gpg
|
2015-07-14 21:39:52 +00:00
|
|
|
.RE
|
|
|
|
|
|
|
|
The
|
|
|
|
.B yadm encrypt
|
|
|
|
command will find all files matching the patterns, and prompt for a password. Once a
|
|
|
|
password has confirmed, the matching files will be encrypted and saved as
|
|
|
|
.IR $HOME/.yadm/files.gpg .
|
|
|
|
The patterns and files.gpg should be added to the
|
|
|
|
.B yadm
|
|
|
|
repository so they are available across multiple systems.
|
|
|
|
|
|
|
|
To decrypt these files later, or on another system run
|
|
|
|
.BR yadm\ decrypt
|
|
|
|
and provide the correct password.
|
|
|
|
After files are decrypted, permissions are automatically updated as described
|
|
|
|
in the PERMISSIONS section.
|
|
|
|
|
2015-07-17 07:29:20 +00:00
|
|
|
.BR NOTE :
|
2015-07-19 18:01:52 +00:00
|
|
|
It is recommended that you use a private repository when keeping confidential
|
|
|
|
files, even though they are encrypted.
|
2015-07-14 21:39:52 +00:00
|
|
|
.SH PERMISSIONS
|
|
|
|
When files are checked out of a Git repository, their initial permissions are
|
|
|
|
dependent upon the user's umask. This can result in confidential files with lax permissions.
|
|
|
|
|
|
|
|
To prevent this,
|
|
|
|
.B yadm
|
|
|
|
will automatically update the permissions of confidential files.
|
|
|
|
The "group" and "others" permissions will be removed from the following files:
|
|
|
|
|
|
|
|
.RI - " $HOME/.yadm/files.gpg
|
|
|
|
|
|
|
|
- All files matching patterns in
|
|
|
|
.I $HOME/.yadm/encrypt
|
|
|
|
|
|
|
|
- The SSH directory and files,
|
|
|
|
.I .ssh/*
|
|
|
|
|
2015-08-07 12:18:22 +00:00
|
|
|
- The GPG directory and files,
|
|
|
|
.I .gnupg/*
|
|
|
|
|
2015-07-14 21:39:52 +00:00
|
|
|
.B yadm
|
|
|
|
will automatically update permissions by default. This can be disabled using the
|
|
|
|
.I yadm.auto-perms
|
|
|
|
configuration.
|
|
|
|
Even if disabled, permissions can be manually updated by running
|
|
|
|
.BR yadm\ perms .
|
|
|
|
The SSH directory processing can be disabled using the
|
|
|
|
.I yadm.ssh-perms
|
|
|
|
configuration.
|
|
|
|
.SH FILES
|
|
|
|
.TP
|
|
|
|
.I $HOME/.yadm/config
|
|
|
|
Configuration file for
|
|
|
|
.BR yadm .
|
|
|
|
.TP
|
|
|
|
.I $HOME/.yadm/repo.git
|
|
|
|
Git repository used by
|
|
|
|
.BR yadm .
|
|
|
|
.TP
|
|
|
|
.I $HOME/.yadm/encrypt
|
|
|
|
List of globs used for encrypt/decrypt
|
|
|
|
.TP
|
|
|
|
.I $HOME/.yadm/files.gpg
|
|
|
|
All files encrypted with
|
|
|
|
.B yadm encrypt
|
|
|
|
are stored in this file.
|
|
|
|
.SH EXAMPLES
|
|
|
|
.TP
|
|
|
|
.B yadm init
|
|
|
|
Create an empty repo for managing files
|
|
|
|
.TP
|
|
|
|
.B yadm add .bash_profile ; yadm commit
|
|
|
|
Add
|
|
|
|
.I .bash_profile
|
|
|
|
to the Git index and create a new commit
|
|
|
|
.TP
|
|
|
|
.B yadm remote add origin <url>
|
|
|
|
Add a remote origin to an existing repository
|
|
|
|
.TP
|
|
|
|
.B yadm push -u origin master
|
|
|
|
Initial push of master to origin
|
|
|
|
.TP
|
|
|
|
.B echo ".ssh/*.key" >> $HOME/.yadm/encrypt
|
|
|
|
Add a new pattern to the list of encrypted files
|
|
|
|
.TP
|
|
|
|
.B yadm encrypt ; yadm add ~/.yadm/files.gpg ; yadm commit
|
|
|
|
Commit a new set of encrypted files
|
2015-07-14 12:48:47 +00:00
|
|
|
.SH REPORTING BUGS
|
2015-07-14 21:39:52 +00:00
|
|
|
Report issues or create pull requests at GitHub:
|
|
|
|
|
|
|
|
https://github.com/TheLocehiliosan/yadm
|
2015-07-14 12:48:47 +00:00
|
|
|
.SH AUTHOR
|
2015-07-14 21:39:52 +00:00
|
|
|
Tim Byrne <sultan@locehilios.com>
|
|
|
|
.SH SEE ALSO
|
|
|
|
|
|
|
|
.BR git (1),
|
|
|
|
.BR gpg (1)
|
|
|
|
|
|
|
|
Other management tools which inspired the creation of
|
|
|
|
.BR yadm :
|
|
|
|
|
|
|
|
.BR homeshick " <https://github.com/andsens/homeshick>
|
2015-07-14 12:48:47 +00:00
|
|
|
|
2015-07-14 21:39:52 +00:00
|
|
|
.BR vcsh " <https://github.com/RichiH/vcsh>
|