Provided by: vcsh_2.0.10-0.2_all bug

NAME

       vcsh - Version Control System for $HOME - multiple Git repositories in $HOME

SYNOPSIS

       vcsh [options] command

       vcsh clone [-b branch] url [repo]

       vcsh delete repo

       vcsh enter repo

       vcsh foreach [-g] git command

       vcsh help

       vcsh init repo

       vcsh list

       vcsh list-tracked [repo]

       vcsh list-untracked [-a] [-r] [repo]

       vcsh pull

       vcsh push

       vcsh rename repo newname

       vcsh run repo shell command

       vcsh status [repo]

       vcsh upgrade repo

       vcsh version

       vcsh which substring

       vcsh write-gitignore [repo]

       vcsh repo gitcommand

       vcsh repo

DESCRIPTION

       vcsh allows you to have several git(1) repositories, all maintaining their working trees in $HOME without
       clobbering  each  other.  That, in turn, means you can have one repository per config set (zsh, vim, ssh,
       etc), picking and choosing which configs you want to use on which machine.

       vcsh is using a technique called fake bare Git repositories, keeping $GIT_DIR in  a  different  directory
       from $GIT_WORK_TREE which is pointed to $HOME.

       The use of symlinks is not needed in this setup, making for a cleaner setup.

       vcsh was designed with mr(1) in mind so you might want to install it alongside vcsh. That being said, you
       can easily use vcsh without mr if you prefer.

       A  sample  configuration  for  vcsh and mr can be found at https://github.com/RichiH/vcsh_mr_template and
       used with vcsh clone https://github.com/RichiH/vcsh_mr_template mr.

       Please note that you can always use a path instead of a name for repo. This is needed to support  mr  and
       other scripts properly and of no concern to an interactive user.

OPTIONS

       -c     Source file prior to other configuration files

       -d     Enable debug mode

       -v     Enable verbose mode

COMMANDS

       clone  Clone an existing repository.

              If you need to clone a bundle of repositories, look into the post-clone-retired hook.

              You  can  also  use  a single git repository with several branches. Use the -b option to specify a
              branch at clone time, the default is master.

       commit Commit in all repositories

       delete Delete an existing repository.

       enter  Enter repository; spawn new $SHELL with $GIT_DIR set.

       foreach
              Execute git command for every vcsh repository.

              -g: Execute in general context.

       help   Display help.

       init   Initialize an empty repository.

       list   List all local vcsh repositories.

       list-tracked
              List all files tracked by vcsh.

              If you want to list files tracked by a specific repository, simply append  the  repository's  name
              last.

       list-tracked-by
              List files tracked by a repository.

              This is a legacy command; you should use list-tracked <repo> instead.

       list-untracked
              List all files NOT tracked by vcsh.

              -a: Show all files. By default, the git ls-files --exclude-standard is called.

              -r:  Recursive  mode.  By  default,  the  file list is shallow and stops at directory levels where
              possible.

              $repo: List files not tracked by this specific repository.

       pull   Pull from all vcsh remotes.

       push   Push to all vcsh remotes.

       rename Rename a repository.

       run    Run command with $GIT_DIR and $GIT_WORK_TREE set. Allows you to run any and all  commands  without
              any restrictions. Use with care.

              Please  note  that  there is a somewhat magic feature for run. Instead of repo it accepts path, as
              well. Anything that has a slash in it will be assumed to be a path. vcsh run will then operate  on
              this directory instead of the one normally generated from the repository's name. This is needed to
              support mr and other scripts properly and of no concern to an interactive user.

       status Show statuses of all/one vcsh repositories.

       upgrade
              Upgrade repository to currently recommended settings.

       version
              Print version information.

       which substring
              Find substring in name of any tracked file.

       write-gitignore
              Write  .gitignore.d/repo  via  git  ls-files.  If  repo  is  not specified but we're within a vcsh
              repository, use that.

       repo gitcommand
              Shortcut to run git commands on a repo. Will prepend git to gitcommand.

       repo   Shortcut to run vcsh enter <repo>.

ENVIRONMENT

       As noted earlier, vcsh will set $GIT_DIR and $GIT_WORK_TREE to the appropriate values for fake  bare  Git
       repositories.

CONFIG

       There are several ways to turn the various knobs on vcsh. In order of ascending precedence, they are:

       •   VARIABLE=foo vcsh

       •   </etc/vcsh/config>

       •   <$XDG_CONFIG_HOME/vcsh/config>

       •   vcsh -c <file>

       Please  note  that  those files are sourced. Any and all commands will be executed in the context of your
       shell.

       Interesting knobs you can turn:

       $VCSH_GITATTRIBUTES
              Can be none, or any other value.

              none will not maintain Git attributes in a special location.

              If set to any other value, repo-specific gitattributes files will be maintained.

              Defaults to none.

       $VCSH_GITIGNORE
              Can be exact, none, or recursive.

              exact will seed the repo-specific ignore file with all file and directory names which git ls-files
              returns.

              none will not write any ignore file.

              recursive will descend through all directories recursively additionally to the above.

              Defaults to exact.

       $VCSH_WORKTREE
              Can be absolute, or relative.

              absolute will set an absolute path; defaulting to $HOME.

              relative will set a path relative to $GIT_DIR.

              Defaults to absolute.

       Less interesting knobs you could turn:

       $VCSH_DEBUG
              Enter debug mode.

       $XDG_CONFIG_HOME
              As     specified      in      the      'XDG      Base      Directory      Specification',      see
              http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html

              Defaults to <$HOME/.config>.

       $VCSH_REPO_D
              The directory where repositories are read from and stored.

              Defaults to <$XDG_CONFIG_HOME/vcsh/repo.d>.

       $VCSH_HOOK_D
              The directory where hooks are read from.

              Defaults to <$XDG_CONFIG_HOME/vcsh/hooks-enabled>.

       $VCSH_BASE
              The directory where repositories are checked out to.

              Defaults to $HOME.

HOOK SYSTEM

       vcsh   provides   a   hook   system.   Hook   scripts   must  be  executable  and  should  be  placed  in
       <$XDG_CONFIG_HOME/vcsh/hooks-available>.    From    there,    they    can     be     soft-linked     into
       <$XDG_CONFIG_HOME/vcsh/hooks-enabled>; vcsh will only execute hooks that are in this directory.

       Hooks  follow  a simple format. pre-run will be run before anything is run. If you want to have more than
       one script for a certain hook, just append any kind of  string  to  order  them.  A  system  of  pre-run,
       <pre-run.10>,  <pre-run.20>  etc  is  suggested; other options would be pre-run-10 or <pre-run.sh>. A dot
       after the hook name is optional.

       If you want to create hooks for a  specific  vcsh  repository,  simply  prepend  the  repository's  name,
       followed  by  a  dot,  i.e.  <zsh.pre-run>. Otherwise, the same rules as above apply. The dot between the
       repository's name and the hook is mandatory, though.

       Available hooks are pre-clone,  post-clone,  post-clone-retired,  pre-command,  post-command,  pre-enter,
       post-enter,   pre-init,   post-init,   pre-pull,   post-pull,  pre-push,  post-push,  pre-run,  post-run,
       pre-upgrade, and post-upgrade. If you need more, vcsh is trivial to patch, but please let  upstream  know
       so we can ship them by default.

OVERLAY SYSTEM

       vcsh   also   provides   an   overlay   system.   Similar   to   hooks,  the  recommended  locations  are
       <$XDG_CONFIG_HOME/vcsh/overlays-available> and <$XDG_CONFIG_HOME/vcsh/overlays-enabled>.

       Overlays follow the same rules as hooks and you are free to overwrite any  and  all  functions.  Same  as
       hooks, you can use global or repository-specific overlays by using either <$VCSH_OVERLAY_D/$VCSH_COMMAND>
       or <$VCSH_OVERLAY_D/$VCSH_REPO_NAME.$VCSH_COMMAND>.

       Please  note  that  nothing stops you from, e.g. overwriting status() in <$VCSH_OVERLAY_D/commit>. As the
       overlays will be sourced and you are replacing  arbitrary  functions,  any  and  all  features  may  stop
       working, or you may even lose data.

       You have been warned.

DETAILED HOWTO AND FURTHER READING

       Manpages  are  often  short and sometimes useless to glean best practices from. While the author tried to
       avoid this in this case, manpages can not cover detailed howtos.

       This software also comes with a file called <README.md>. It contains various approaches to setting up and
       using vcsh. You can view the file it as plain text or render it into various other formats via Markdown.

       On Debian-based systems, this file can be found in </usr/share/doc/vcsh>.

SECURITY CONSIDERATIONS

       vcsh allows you to execute arbitrary commands via vcsh run. For example, adding a sudo(8) rule  for  vcsh
       would be pretty stupid.

       Additionally,  vcsh  will  source,  i.e.  execute,  all  files  listed in CONFIG. You can put any and all
       commands into these config files and they will be executed.

BUGS

       None are known at this time, but reports and/or patches are more than welcome.

INTEROPERABILITY

       If you rely on git submodule use git 1.7.12 or later. Earlier versions do not  clean  internal  variables
       properly before descending into submodules, resulting in unhappy end users.

HISTORY

       Like  most  people,  the  author  initially made do with a single repository for all config files, all of
       which were soft-linked into $HOME.

       Martin F. Krafft aka madduck came up with the concept of fake bare Git repositories.

       vcsh was initially written by madduck. This version is a re-implementation from scratch with a  lot  more
       features. madduck graciously agreed to let the author take over the name.

AUTHOR

       This manpage and vcsh itself were written by Richard "RichiH" Hartmann.

COPYRIGHT

       Copyright 2011-2015 Richard Hartmann richih@debian.org

       Licensed under the GNU GPL version 2 or higher.

       https://github.com/RichiH/vcsh

SEE ALSO

       git(1), mr(1)

                                                   April 2025                                            VCSH(1)