Provided by: yadm_1.03-1_all bug

NAME

       yadm - Yet Another Dotfiles Manager

SYNOPSIS

       yadm command [options]

       yadm git-command-or-alias [options]

       yadm init [-f] [-w directory]

       yadm clone url [-f] [-w directory]

       yadm config name [value]

       yadm config [-e]

       yadm list [-a]

       yadm encrypt

       yadm decrypt [-l]

       yadm alt

       yadm perms

DESCRIPTION

       yadm  is  a  tool  for  managing  a collection of files across multiple computers, using a
       shared Git repository.  In addition, yadm provides a feature to select alternate  versions
       of files based on the operation system or host name.  Lastly, yadm supplies the ability to
       manage a subset of secure files, which are encrypted  before  they  are  included  in  the
       repository.

COMMANDS

       git-command or git-alias
              Any  command  not  internally  handled  by  yadm  is passed through to git(1).  Git
              commands or aliases are invoked with the  yadm  managed  repository.   The  working
              directory for git commands will be the configured work-tree (usually $HOME).

              Dotfiles are managed by using standard git commands; add, commit, push, pull, etc.

              The  config  command  is  not  passed  directly through.  Instead use the gitconfig
              command (see below).

       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 yadm
              automatically processes alternates by default.   This  automatic  behavior  can  be
              disabled by setting the configuration yadm.auto-alt to "false".

       clone url
              Clone  a remote repository for tracking dotfiles.  After the contents of the remote
              repository have been fetched, a "merge" of origin/master is  attempted.   If  there
              are  conflicting  files  already present in the work-tree, this merge will fail and
              instead a "reset" of 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:

                     yadm reset --hard origin/master

              The  repository  is stored in $HOME/.yadm/repo.git.  By default, $HOME will be used
              as the work-tree, but this can be overridden with  the  -w  option.   yadm  can  be
              forced to overwrite an existing repository by providing the -f option.

       config This  command manages configurations for yadm.  This command works exactly they way
              git-config(1) does.  See the CONFIGURATION section for more details.

       decrypt
              Decrypt all  files  stored  in  $HOME/.yadm/files.gpg.   Files  decrypted  will  be
              relative  to  the  configured  work-tree (usually $HOME).  Using the -l option will
              list the files stored without extracting them.

       encrypt
              Encrypt all files matching the patterns  found  in  $HOME/.yadm/encrypt.   See  the
              ENCRYPTION section for more details.

       gitconfig
              Pass  options to the git config command. Since yadm already uses the config command
              to manage its own configurations, this command is  provided  as  a  way  to  change
              configurations  of  the  repository  managed  by yadm.  One useful case might be to
              configure the repository so untracked files are shown  in  status  commands.   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.

                     yadm gitconfig --unset status.showUntrackedFiles

       help   Print a summary of yadm commands.

       init   Initialize a new, empty repository for tracking dotfiles.  The repository is stored
              in $HOME/.yadm/repo.git.  By default, $HOME will be used as the work-tree, but this
              can  be overridden with the -w option.  yadm can be forced to overwrite an existing
              repository by providing the -f option.

       list   Print a list of files managed by yadm.  The -a option will cause all managed  files
              to  be  listed.   Otherwise,  the  list  will  only  include files from the current
              directory or below.

       perms  Update permissions  as  described  in  the  PERMISSIONS  section.   It  is  usually
              unnecessary  to  run  this  command, as yadm automatically processes permissions by
              default.  This automatic behavior can be  disabled  by  setting  the  configuration
              yadm.auto-perms to "false".

       version
              Print the version of yadm.

CONFIGURATION

       yadm  uses  a configuration file named $HOME/.yadm/config.  This file uses the same format
       as git-config(1).  Also, you can control the contents of the configuration  file  via  the
       yadm  config  command  (which  works  exactly  like  git-config).  For example, to disable
       alternates you can run the command:

              yadm config yadm.auto-alt false

       The following is the full list of supported configurations:

       yadm.auto-alt
              Disable the automatic linking described in the section  ALTERNATES.   If  disabled,
              you may still run yadm alt manually to create the alternate links.  This feature is
              enabled by default.

       yadm.auto-perms
              Disable the automatic permission changes described in the section PERMISSIONS.   If
              disabled,  you  may  still  run  yadm  perms  manually to update permissions.  This
              feature is enabled by default.

       yadm.ssh-perms
              Disable the permission  changes  to  $HOME/.ssh/*.   This  feature  is  enabled  by
              default.

       yadm.gpg-perms
              Disable  the  permission  changes  to  $HOME/.gnupg/*.   This feature is enabled by
              default.

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 operation system,
       host, or user.  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.
       yadm can detect files with names ending in:

              ## or ##OS or ##OS.HOSTNAME or ##OS.HOSTNAME.USER

       If there are any files managed by 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 yadm´s repository:

         - $HOME/path/example.txt##
         - $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", yadm will create a symbolic link which  looks  like
       this:

       $HOME/path/example.txt -> $HOME/path/example.txt##Darwin.host2

       However,  on  another Mackbook named "host3", yadm will create a symbolic link which looks
       like this:

       $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.

       If running on a Linux server named "host4", the link will be:

       $HOME/path/example.txt -> $HOME/path/example.txt##Linux

       If running on a Solaris server, the link use the default "##" version:

       $HOME/path/example.txt -> $HOME/path/example.txt##

       If  no  "##"  version exists and no files match the current OS/HOSTNAME/USER, then no link
       will be created.

       OS is determined by running uname -s, HOSTNAME by running hostname -s, and USER by running
       id -u -n.   yadm  will  automatically  create these links by default. This can be disabled
       using the yadm.auto-alt configuration.  Even if disabled, links can be manually created by
       running yadm alt.

ENCRYPTION

       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.  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 gpg(1) command is available.

       To  use this feature, a list of patterns must be created and saved as $HOME/.yadm/encrypt.
       This list of patterns should be relative to the configured work-tree (usually $HOME).  For
       example:

                  .ssh/*.key
                  .gnupg/*.gpg

       The  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
       $HOME/.yadm/files.gpg.   The patterns and files.gpg should be added to the yadm repository
       so they are available across multiple systems.

       To decrypt these files later, or on  another  system  run  yadm decrypt  and  provide  the
       correct  password.   After  files  are decrypted, permissions are automatically updated as
       described in the PERMISSIONS section.

       NOTE: It is recommended that you use a private repository when keeping confidential files,
       even though they are encrypted.

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, yadm will automatically update the  permissions  of  confidential  files.
       The "group" and "others" permissions will be removed from the following files:

       - $HOME/.yadm/files.gpg

       - All files matching patterns in $HOME/.yadm/encrypt

       - The SSH directory and files, .ssh/*

       - The GPG directory and files, .gnupg/*

       yadm  will  automatically  update  permissions  by default. This can be disabled using the
       yadm.auto-perms configuration.  Even if disabled, permissions can be manually  updated  by
       running yadm perms.  The SSH directory processing can be disabled using the yadm.ssh-perms
       configuration.

FILES

       $HOME/.yadm/config
              Configuration file for yadm.

       $HOME/.yadm/repo.git
              Git repository used by yadm.

       $HOME/.yadm/encrypt
              List of globs used for encrypt/decrypt

       $HOME/.yadm/files.gpg
              All files encrypted with yadm encrypt are stored in this file.

EXAMPLES

       yadm init
              Create an empty repo for managing files

       yadm add .bash_profile ; yadm commit
              Add .bash_profile to the Git index and create a new commit

       yadm remote add origin <url>
              Add a remote origin to an existing repository

       yadm push -u origin master
              Initial push of master to origin

       echo .ssh/*.key >> $HOME/.yadm/encrypt
              Add a new pattern to the list of encrypted files

       yadm encrypt ; yadm add ~/.yadm/files.gpg ; yadm commit
              Commit a new set of encrypted files

REPORTING BUGS

       Report issues or create pull requests at GitHub:

       https://github.com/TheLocehiliosan/yadm

AUTHOR

       Tim Byrne <sultan@locehilios.com>

SEE ALSO

       git(1), gpg(1)

       Other management tools which inspired the creation of yadm:

       homeshick <https://github.com/andsens/homeshick>

       vcsh <https://github.com/RichiH/vcsh>