Git存储库,git目录存储在别处

时间:2010-10-12 10:37:28

标签: git

我很抱歉,如果这是重复的,我搜索谷歌和SO,并找不到任何类似的东西,因为它是一个相当通用的搜索词集!

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

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

5 个答案:

答案 0 :(得分:8)

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

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

从那时起,您仍然必须提供--git-dir选项或设置GIT_DIR环境变量,以便git知道存储库的位置,因为工作树中根本没有git特定数据,但工作树将从git存储库配置中适当确定。

答案 1 :(得分:6)

您可以通过在工作树的根目录中创建名为.git的文件链接到任意位置的gitdir,其中包含以下内容:

gitdir: <path-to-gitdir>

当然,您需要先将原始.git目录移动到其外部位置。

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

当然,这样的.git文件仍然可以在工作树中看到,因此在您的情况下这种方法可能是不可接受的。但是,如果这样的文件被删除,则恢复是微不足道的(与.git目录不同)。

答案 2 :(得分:1)

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

但是,有可能:使用git-config你可以告诉git使用另一个目录,而不是包含.git的目录作为工作树的根目录。

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

git config core.worktree ../foo

../foofoo项目相对于.git目录的路径。

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

答案 3 :(得分: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

答案 4 :(得分:0)

我不知道这是否可行,我是VCS上的新手。

但是你可以告诉其他VCS忽略文件,因为CVS会生成.cvsignore文件:

.git
*ignore_me*

用于SVN使用

$ svn propset svn:ignore -F .cvsignore .

希望这有帮助。