You have a lot of version control repositories. Sometimes you want to
update them all at once. Or push out all your local changes. You use
special command lines in some repositories to implement specific workflows.
Myrepos provides a `mr` command, which is a tool to manage all your version
control repositories.

## getting started

All you need to get started is some already checked out repos.
These could be using git, or bzr, mercurial or darcs, or many other version
control systems. Doesn't matter, they're all supported!

Inside each of your repositories, run `mr register`.
That sets up a `~/.mrconfig` file listing your repositories.

Now you can run `mr update` in your home directory, and it'll update
every one of your repositories that you've registered with myrepos.

Want to update repositories in parallel? `mr -j5 update` will run 5
concurrent jobs!

If you run `mr update` inside a repository, it'll only act on that
repository. In general, any `mr` command runs recursively over any
repository located somewhere in or under the current directory.

You can also run `mr commit`, `mr push`, `mr status`, `mr diff`, and a lot
of other commands. These work no matter which version control system is
used for a repository. Of course, you can still use the native version
control commands too.

Oh, and you can abbreviate any command to any unambiguous abbreviation.
`mr up`, `mr pu`, etc.

Now, maybe you find that you always want to update one repository using
`git pull --rebase`, instead of the default `git pull` that `mr update` runs.
No problem: The `~/.mrconfig` file makes it easy to override the command
run for any repository. It's like a `Makefile` for repositories.

	[foo]
	checkout = git@github.com:joeyh/foo.git
	update = git pull --rebase

You can make up your own commands too:

	[bar]
	# This repository has an upstream, which I've forked;
	# set up a remote on checkout.
	checkout =
		git clone git@github.com:joeyh/bar.git
		cd bar
		git remote add upstream git@github.com:barbar/bar.git
	# make `mr zap` integrate from upstream
	zap =
		git pull upstream
		git merge upstream/master
		git push origin master

You can even define commands globally, so `mr` can use them in all repositories.

	[DEFAULT]
	# Teach mr how to `mr gc` in git repos.
	git_gc = git gc "$@"

This only scratches the surface of the ways you can use myrepos to automate
and manage your repositories!

Some more examples of things it can do include:

* Update a repository no more frequently than once every twelve hours.
* Run an arbitrary command before committing to a repository.
* Remember actions that failed due to a laptop being offline, so they
  can be retried when it comes back online.
* Combine several related repositories into a single logical repository,
  with its own top-level `.mrconfig` file that lists them and can be
  chain loaded from `~/.mrconfig`.
* Manage your whole home directory in version control.
  (See [VCS-Home](https://vcs-home.branchable.com/))

## extensions

* [drupal](https://github.com/wimleers/mr-drupal): simple way to manage drupal websites
* [freeze](https://bitbucket.org/mforbes/mmfhg#rst-header-mr-un-freeze): record and restore VCS revision details

## related software

* [repo](https://android.googlesource.com/tools/repo): git repository management tool
* [kas](https://github.com/siemens/kas): bitbake repository management tool
* [VCS](http://www.greenend.org.uk/rjk/vcs/): a wrapper for version control systems
* [vcstool](https://github.com/dirk-thomas/vcstool): work with multiple repositories
* [vcstools](https://github.com/vcstools/vcstools): Python API wrapping version control systems
* [rosinstall](https://github.com/vcstools/rosinstall): source code workspace management tool
* [vcs-repo-mgr](https://github.com/xolox/python-vcs-repo-mgr): version control repository manager
* [go-vcs](https://github.com/Masterminds/vcs): version control repository management for Golang

## news

[[!inline pages="news/* and !*/Discussion" show="4" archive=yes]]

[[!sidebar content="""
[[Install]]  
[[Todo]]  
[[Forum]]  
"""]]
