Git仓库与git目录存储在其他地方
我很抱歉,如果这是一个重复的,我已经搜索谷歌和SO,并找不到任何类似的东西,因为它是一个相当通用的词搜索!
我想要的是将.git目录放在工作树之外。
我需要这样做,因为它是使用其他版本控制软件的项目中的“隐形”git存储库,不幸的是,它的设置方式是在一个根目录中有多个项目(我希望每个项目都是git存储库)并使用构建脚本来清除项目目录中的文件。 到目前为止,我一直在对根目录进行版本控制,并忽略所有其他项目目录,因此其中一个项目是版本控制的,但我现在想要对另一个项目进行版本控制,并且显然不能在根目录中有多个git存储库(或者我可以?这将是一个很好的替代答案)。 如果可能的话,将.git目录放在磁盘上的其他位置将是一个很好的解决方案。
你可以使用--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特定数据,但工作树将会从git存储库配置适当地确定。
您可以通过在工作树的根.git
中创建一个名为.git
的文件来链接到任意位置的gitdir,其中包含以下内容:
gitdir: <path-to-gitdir>
当然,您需要先将原始.git目录移至其外部位置。
所有行为良好的git工具都会遵守这一点,而不依赖于环境变量或特定于操作系统的机制,如符号链接。 您还应该能够将这些链接放置在目录层次结构中的任意位置,从而链接到多个存储库。
当然,这样的.git
文件仍然可以在工作树中看到,所以这种方法在您的情况下可能是不可接受的。 但是,如果这样的文件被删除,恢复.git
重要(与.git
目录不同)。
Git与其他几个VCS交互操作,因此这可能不是解决问题的最佳方法。
然而,这是可能的:使用git-config
你可以告诉git使用另一个目录,而不是包含.git
作为工作树的根目录。
如果你在其他项目的根目录foo
上面运行git init
一个目录,那么你可以使用:
git config core.worktree ../foo
其中../foo
是foo
项目相对于.git
目录的路径。
但是,使用相对路径, git
工具只能在foo
的父目录中工作,而不能在树中的任何其他位置工作。 通过使用绝对路径,您可以避免这种情况(但是如果您移动项目,则必须记住更改它)。