tags:

views:

74

answers:

5

Hi, I'm sorry if this is a duplicate, I've searched google and SO and couldn't find anything similar since it's a fairly generic set of words to search for!

What I want is to have the .git directory be outside of the working tree.

I need to do this because it's a 'stealth' git repository inside a project using other version control software, and unfortunately the way it is set up is with multiple projects (which I want to each be a git repository) inside one root directory, and with build scripts that like to purge files from the project directories. So far I've been versioning the root directory and ignoring all other project directories, so one of the projects was versioned, but I now want to version another project and clearly can't have multiple git repositories in the root directory (or can I? That would be a good alternative answer). Putting the .git directories elsewhere on disk would be a good solution, if it's possible.

+1  A: 

Git interoperates with several other VCSes so this may not be the best way to solve your problem.

However, it is possible: Using git-config you can tell git to use another directory, other than the one containing .git, as the root of the working tree.

If you run git init one directory above the root directory foo of the other project, then you could use:

git config core.worktree ../foo

Where ../foo is the path of the foo project relative to your .git directory.

However, with a relative path, the git tools will only work in the parent directory of foo, not anywhere else in the tree. By using an absolute path you avoid this (but have to remember to change it if you ever move your project).

Ben James
A: 

I do not know if that is possible, I'm quite a newbie on VCSes.

But you can tell the other VCS to ignore files, for CVS make a .cvsignore file:

.git
*ignore_me*

for SVN use

$ svn propset svn:ignore -F .cvsignore .

Hope this helps.

Frank
+3  A: 

You can specify the path to the git repository explicitly with the --git-dir global option for all git commands. When you use this option with init it usually creates a bare repository but if you supply --work-tree as well you can initialize a non-bare repository with a 'detached' working tree.

git --git-dir=/var/repo/one.git --work-tree=/var/work/one init

From then on, you still have to supply either the --git-dir option or set GIT_DIR environment variable so that git knows where the repository is as there is no git specific data at all inside the working tree, but the working tree will be determined appropriately from the git repository config.

Charles Bailey
Similar to the other answers but this one sets the work tree too so I don't need to remember to cd to the root every time. I've upvoted the others too though. Thanks very much!
Ben Hymers
+1  A: 

I'm not really sure if this is a good advice, but you can set the GIT_DIR environment variable to point to a non-bare git directory. Beware that in this setup git is not able to find the top work directory, so you must be sure to be in the correct directory when you issuing git commands.

mkdir foobar
cd foobar
git init
export GIT_DIR=$PWD/.git
cd ..
mkdir wc
cd wc
echo foo > bar.txt
git add .
git commit
Rudi
+1  A: 

You can link to a gitdir in an arbitrary location by creating a file called .git in the root of the work tree, containing the following:

gitdir: <path-to-gitdir>

Naturally you need to have first moved the original .git directory to its exterior location.

All well-behaved git tools will honour this, without relying on environment variables, or OS-specific mechanisms such as symlinks. You should also be able to place these links at arbitrary locations in your directory hierarchy, thereby linking to multiple repositories.

Of course, such .git files will still be visible in the work tree, so this approach may not be acceptable in your case. However, if such a file gets deleted it is trivial to restore (unlike a .git directory).

Jeremy