Use git-global
to keep track of all the git repositories on your machine.
This is a Rust program that you can install with cargo install git-global
.
(To obtain cargo
and Rust, see https://rustup.rs.) Once installed, you can
optionally install the manpage with git global install-manpage
Once installed, you gain an extra git subcommand that you can run from anywhere
to check up on all your git repos: git global
. Use git global <subcommand>
to:
git global ahead
: show repos where branches contain commits that are not
present on any of the remotesgit global info
: show meta-information about git-global itself
(configuration, number of known repos, etc.)git global install-manpage
: (non-functional) attempt to install
git-global's manpagegit global list
: show list of all known reposgit global scan
: update the cache of known repos by searching your
filesystemgit global staged
: show status of the git index for repos with such changesgit global stashed
: show stashes for all repos that have themgit global status
: show git status -s
for all your repos with any changesgit global unstaged
: show status of the working directory for repos with
such changesIn addition to config-file-based options, there are a set of global command-line flags that take precedence:
--json
: Print subcommand results in a JSON format.--untracked
: Show untracked files in subcommand results, e.g., for the
status
, staged
, and unstaged
subcommands.--nountracked
: Don't show untracked files in subcommand results, e.g., for
the status
, staged
, and unstaged
subcommands.To change the default behavior of git-global
, you can do so with --- wait for
it --- git's global
configuration!
To set the root directory for repo discovery to something other than your home directory:
git config --global global.basedir /some/path
To add patterns to exclude while walking directories:
git config --global global.ignore .cargo,.vim,Library
The full list of configuration options supported in the global
section of
.gitconfig
is:
basedir
: The root directory for repo discovery (default: $HOME
)follow-symlinks
: Whether to follow symbolic links during repo discovery
(default: true
)same-filesystem
: Whether to stay on the same filesystem as basedir
during repo discovery
(on Unix or Windows only)
(default: true
on Windows or Unix, false
otherwise)ignore
: Comma-separated list of patterns to exclude while walking
directories (default: none)default-cmd
: The default subcommand to run if unspecified, i.e., when
running git global
(default: status
)show-untracked
: Whether to include untracked files in output (default:
true
)An up-to-date copy of the manpage lives in the repository at doc/git-global.1. To generate it from a local clone of the repo, run:
cargo run --bin generate-manpage --features=manpage > doc/git-global.1
The following are some ideas about future subcommands and features:
git global dirty
: show all repos that have changes of any kind
git global branched
: show all repos not on master
(TODO: or a different
default branch in .gitconfig)
git global duplicates
: show repos that are checked out to multiple places
git global remotes
: show all remotes (TODO: why? maybe filter by hostname?)
git global add <path>
: add a git repo to the cache that would not be found in a scan
git global ignore <path>
: ignore a git repo and remove it from the cache
git global ignored
: show which git repos are currently being ignored
git global monitor
: launch a daemon to watch git dirs with inotify
git global pull
: pull down changes from default tracking branch for clean repos
git global cd <fuzzy repo>
: change to the directory of the matched repo (#6)
stream results to STDOUT
as the come in (from git global status
, for
example, so we don't have to wait until they're all collected)
use locate .git
if the DB is populated, instead of walking the filesystem
make a Subcommand
trait
do concurrency generically, not just for the status
subcommand
ahead
subcommand work with corrupted references (#105). Thanks,
koalp!json
--> serde_json
.generate-manpage
binary and (non-functional) install-manpage
subcommand.ahead
subcommand - thanks, koalp!.dirs
and app_dirs
crates with directories
.staged
stashed
unstaged
default-cmd
show-untracked
follow-symlinks
same-filesystem
--untracked
--nountracked
true
by default. (Thanks, pka!)GitGlobalConfig
to Config
.GitGlobalResult
to Report
.get_repos
find_repos
, and cache_repos
functions to Config
.core
module into config
, repo
, and report
.