我很抱歉,如果这是重复的,我搜索谷歌和SO,并找不到任何类似的东西,因为它是一个相当通用的搜索词集!
我想要的是让.git目录在工作树之外。
我需要这样做,因为它是使用其他版本控制软件的项目中的'隐形'git存储库,不幸的是它的设置方式是多个项目(我希望每个项目都是一个git存储库)根目录,以及想要从项目目录中清除文件的构建脚本。到目前为止,我一直在对根目录进行版本控制并忽略所有其他项目目录,因此其中一个项目是版本化的,但我现在想要对另一个项目进行版本化,并且显然不能在根目录中有多个git存储库(或者我可以?那将是一个很好的替代答案)。如果可能的话,将.git目录放在磁盘上的其他地方将是一个很好的解决方案。
答案 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
../foo
是foo
项目相对于.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 .
希望这有帮助。