使用 .git 以外的目录

Using a directory other than .git

tl;dr:多个存储库相互叠加。我需要这个是有原因的。

我在 Perforce 中检查了一个大型项目,我厌倦了与架子打交道,如果没有大量的手工劳动就无法记录实验分支,并且无法大量恢复错误无法单独提交到中央存储库的代码。

因此,在 "official" Perforce 提交之间,我开始在同一工作中维护 Git 回购协议 space(因为我们的构建过程与 Perforce 愚蠢地集成)这可以然后有自己的分支,提交历史等等。

我面临的问题是,由于磁盘空间有限 space 和缓慢的下载速度,我经常被迫为多个任务重新使用 Perforce 结帐。这需要在 git 中的工作之间切换(否则根本不可能进行任何生产性工作)。但是,由于将 Perforce 与 git 同步会导致合并冲突,因此每个 git 签出仅管理一小部分文件,具体取决于手头的任务。当大量忽略所有其他文件并保持分支数量可管理时,这会出现问题。

我想在我的 P4 结帐的顶层维护一些独立的 .gits,因此需要能够指定“.git”的名称目录和“.git忽略”文件在调用时或通过环境变量显式显示。

不幸的是,由于 git 处理符号链接的方式,我无法将这些单独的回购与 P4 签出分开,而不必手动来回同步它们,这很容易出错。

有环境变量 GIT_DIRGIT_WORK_TREE 控制 git 命令将影响的回购和工作目录。 git 命令本身也有选项,称为 --work-tree--git-dir.

因此,您可以定义简单的 shell 别名来更改每个项目的环境:

alias work_on_foo='export GIT_DIR=mybigproject/.foo.git; export GIT_WORK_TREE=mybigproject'

shim 将所需选项附加到 git 命令:

alias foogit='git --git-dir=mybigproject/.foo.git --work-tree=mybigproject'

您可以查看我的 dotfiles 存储库,了解这两种方法的 examples,包括一些额外的逻辑,例如为某些 git 子命令添加特殊处理。

至于.gitignore,我不认为有一个env变量,但你可以使用info/exclude文件(它应该放在.git中)相同的目的(它具有相同的语法,只是不像 .gitignore 那样是存储库数据的一部分。或者,您可以使用名为 core.excludesfile 的 git 配置设置并在每个 .git/config 指向适当的文件。

我遇到了类似的情况,但是我结合使用了 git-p4 和 git workspaces.

但由于您的磁盘有限 space 问题,这听起来对您不起作用。如果您可以增加磁盘 space,那么您可以拥有一个 git 存储库和多个 git workspaces.