I have a particular use case where I want to use Git on top of another version control system. The only problem I ran into is that the other VCS wanted to track the .git directory that Git creates for its own tracking purposes.
Rather than mess about with making the existing VCS ignore this directory, I set out to make Git store the .git directory somewhere else. Turns out it's pretty easy, but Git is fickle, and you have to set a couple environment variables rather than simply using --git-dir
or --work-tree
.
The bash script below creates a function named git
in your environment that shells out to the real Git binary. It will also attempt to create a new directory in your home directory (~/gitdirs
) to hold these new .git directories. This script also works in Git Bash!
# Store a reference to the Git binary
GIT_BIN=`which git`
# The function that runs when you type `git`
function git
{
# The location .git directories are stored in
gitdirroot=~/gitdirs
# Create that directory if it does not exist
if [ ! -d $gitdirroot ]; then
mkdir -p $gitdirroot
fi
# Use the current working directory as the .git directory name
gitdirname="$gitdirroot/`pwd | tr "/" '_'`"
# Set the two environment variables Git needs to use the new .git directory
export GIT_DIR=$gitdirname
export GIT_WORK_TREE=.
# Execute the Git command
$GIT_BIN $@
}