-vcsh(1) - manage config files in $HOME via fake bare git repositories
-=====================================================================
+vcsh(1) - Version Control System for $HOME - multiple Git repositories in $HOME
+===============================================================================
## SYNOPSIS
`vcsh` [<options>] <command>
-`vcsh` clone <url> [<repo>]
+`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
+`vcsh` list-tracked [<repo>]
+
+`vcsh` list-untracked [<-a>] [<-r>] [<repo>]
+
+`vcsh` pull
-`vcsh` list-tracked-by <repo>
+`vcsh` push
`vcsh` rename <repo> <newname>
`vcsh` run <repo> <shell command>
+`vcsh` status [<repo>]
+
`vcsh` upgrade <repo>
`vcsh` version
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>
+`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.
* 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>.
+* foreach:
+ Execute git command for every vcsh repository.
+
+ `-g`: Execute in general context.
+
* help:
Display help.
* 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.
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.
Find <substring> in name of any tracked file.
* write-gitignore:
- Write .gitignore.d/<repo> via git ls-files.
+ Write .gitignore.d/<repo> via `git ls-files`.
* <repo> <gitcommand>:
Shortcut to run `vcsh` on a repo. Will prepend `git` to <command>.
## ENVIRONMENT
As noted earlier, `vcsh` will set <$GIT_DIR> and <$GIT_WORK_TREE> to the
-appropriate values for fake bare git repositories.
+appropriate values for fake bare Git repositories.
## CONFIG
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>, <recursive>, or <none>.
+ 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.
- <none> will not write any ignore file.
-
Defaults to <exact>.
+* <$VCSH_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>:
same rules as above apply. The dot between the repository's name and the hook
is mandatory, though.
-Available hooks are <pre-enter>, <post-enter>, <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.
+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
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
+Martin F. Krafft aka madduck came up with the concept of fake bare Git
repositories.
vcsh was initally written by madduck. This version is a re-implementation from
## COPYRIGHT
-Copyright 2011-2012 Richard Hartmann <richih.mailinglist@gmail.com>
+Copyright 2011-2015 Richard Hartmann <richih@debian.org>
Licensed under the GNU GPL version 2 or higher.