2010-10-12 196 views
9

如果这是一个重复,我已经搜索谷歌和SO,并找不到任何类似的东西,因为它是一个相当通用的搜索词集!Git仓库与git目录存储在其他地方

我想要的是将.git目录放在工作树之外。

我需要这样做,因为它是一个使用其他版本控制软件的项目内的“隐形”git存储库,不幸的是,它的设置方式与多个项目(我希望每个项目都是git存储库)一个根目录以及用于从项目目录中清除文件的构建脚本。到目前为止,我一直在对根目录进行版本控制,并忽略所有其他项目目录,因此其中一个项目是版本控制的,但我现在想要对另一个项目进行版本控制,并且显然不能在根目录中有多个git存储库(或者我可以?这将是一个很好的替代答案)。如果可能的话,将.git目录放在磁盘上的其他位置将是一个很好的解决方案。

+1

你不能设置其他版本控制软件来忽略.git目录吗?什么是其他VCS? – Vinzenz 2010-10-12 10:40:38

+0

是的,我为了这个问题简化了一下。这实际上是我们其他工具和构建过程中的一部分,它们喜欢清除事物;虽然我可以让VCS忽略.git目录,但不幸的是我不能用这些其他工具来做到这一点(并且不能修改它们以允许这样做)。 – 2010-10-12 12:34:12

+0

对不起,忘了说:VCS是...不正常。假设它是专有的。 – 2010-10-12 12:53:55

回答

8

您可以使用全局选项--git-dir为所有git命令明确指定git存储库的路径。当您通过init使用此选项时,通常会创建裸仓库,但如果您提供--work-tree,则可以使用“分离”工作树初始化非裸仓库。

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

从此,你仍然必须提供要么--git-dir选项或设置GIT_DIR环境变量,混帐知道哪里库是没有git的具体数据,在所有的工作树里面,但工作树将从git存储库配置中适当地确定。

+0

与其他答案类似,但是这个也设置了工作树,所以我不需要记住每次都要切换到根目录。尽管我也赞成其他人。非常感谢! – 2010-10-12 13:00:10

1

Git与其他几个VCS交互操作,因此这可能不是解决问题的最佳方法。

但是,有可能:使用git-config,您可以告诉git使用除包含.git之外的其他目录作为工作树的根目录。

如果您运行git init一个目录中的其他项目的根目录foo以上,那么你可以使用:

git config core.worktree ../foo 

哪里../foo是相对于你的.git目录foo项目的路径。

但是,使用相对路径,git工具只能在foo的父目录中工作,而不在树中的任何其他位置。通过使用绝对路径,您可以避免这种情况(但是如果您移动项目,则必须记住更改它)。

+0

这也适用于**修改后的工作树(如果你移动它) - 但是,奇怪的是,原始工作树目录需要存在(一个空的目录会做)。 – giraff 2012-11-16 10:56:33

0

我不知道这是否可能,我是一个VCSes新手。

但是你可以告诉其他VCS忽略文件,CVS做出.cvsignore文件:

.git 
*ignore_me* 

为SVN使用

$ svn propset svn:ignore -F .cvsignore . 

希望这有助于。

1

我不太确定这是否是一个好建议,但您可以将GIT_DIR环境变量设置为指向非裸Git目录。注意,在这个设置中,git无法找到最上层的工作目录,所以当你发出git命令时,你一定要确保它在正确的目录中。

mkdir foobar 
cd foobar 
git init 
export GIT_DIR=$PWD/.git 
cd .. 
mkdir wc 
cd wc 
echo foo > bar.txt 
git add . 
git commit 
6

您可以通过创建一个在工作树的根称为.git文件,包含链接到gitdir在任意位置如下:

gitdir: <path-to-gitdir> 

当然,你需要有第一个移动原始.git目录到其外部位置。

所有行为良好的git工具都会遵守这个规则,而不依赖于环境变量或操作系统特定的机制,如符号链接。您还应该能够将这些链接放置在目录层次结构中的任意位置,从而链接到多个存储库。

当然,这样的.git文件仍然可以在工作树中看到,所以这种方法在您的情况下可能是不可接受的。但是,如果这样的文件被删除,恢复就很简单了(不像.git目录)。