Support Multiple Git Repositories in One Directory
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
bin Fix argment handling and quoting. Jan 9, 2014 Update Sep 16, 2014

git multi


git multi aims to provide a simple interface for interacting with multiple repositories in a single directory.

Why in heaven would you want to do that?

Because I am a sick, sick man. Get me help.

Also: I maintain two repositories in my ~ for dotfiles. You can see one at It is worth noting that git multi will work in any directory, it isn't specific to your home directory.

The other one is sup3r s3cr3t and contains things like pgp and ssh keys, IPs of internal servers, and a list of my victims. That one is tucked away into a private repository heavily safeguarded on my own server. The problem is that I still want them to be easy to use, and I want them to automatically (WITHOUT symlinks) update my home directory.

You may have other (dangerous) reasons. This plugin COULD BE dangerous. I should not be held responsible for your git fuckups. For example, being in your home directory and running git clean -f -x might delete all your files.

How does this work

It's pretty simple, actually. Git supports setting a work_tree config setting which tells it where the files are actually located. Add with that git_dir and you can do dirty things like this.

This system stores the git repository in .git-multi/$name.

Neat! How do I use it?

Also pretty simple.

Adding a repository

Easy peasy!

git multi add grahamc

That intializes the structure, clones it to .git-multi/grahamc/ and checks it out into your current directory.

Working with the repository

The idea here is git multi doesn't have to create a new interface for all the git commands.

git multi work grahamc

That command drops you in to a bash shell with $GIT_WORK_TREE and $GIT_DIR set to the proper directory.

Running git status will show you everything you need to know. git commit push pull and whatever you like to your hearts content.

Hey! Why doesn't $repoA show $repoB files as un-tracked?

Because when you do git multi work (or git multi run, which is like the plumbing of this command) we automatically iterate over your other repositories and fill out $repoA's info/exclude file with the files other repositories track.

Because we're nice.