使用$git_DIR环境变量或--git DIR标志在同一目录中运行多个git repo是个坏主意吗?

使用$git_DIR环境变量或--git DIR标志在同一目录中运行多个git repo是个坏主意吗?,git,Git,我最近发现,在命令中设置$GIT\u DIR环境变量或使用--GIT DIR标记可以指定要在其中运行该命令的GIT存储库。这意味着您可以在目录树中有两个不同的.git目录,如果需要,可以将它们重命名为其他目录,并且仍然可以使用您喜欢的任何一个目录 一个问题是,您当前所在的目录将被视为您的工作目录。如果要从子目录或甚至不在工作树中的目录输入git命令,可以指定要与--work tree标志或$git\u work\u tree环境变量一起使用的工作目录 这打开了许多可能性。例如,您可以在主目录中有

我最近发现,在命令中设置
$GIT\u DIR
环境变量或使用
--GIT DIR
标记可以指定要在其中运行该命令的GIT存储库。这意味着您可以在目录树中有两个不同的
.git
目录,如果需要,可以将它们重命名为其他目录,并且仍然可以使用您喜欢的任何一个目录

一个问题是,您当前所在的目录将被视为您的工作目录。如果要从子目录或甚至不在工作树中的目录输入git命令,可以指定要与
--work tree
标志或
$git\u work\u tree
环境变量一起使用的工作目录

这打开了许多可能性。例如,您可以在主目录中有一个用于点文件的git repo,而在子目录中还有其他git repo用于其他工作


有没有理由不经常这样做?建议这样做吗?

更改工作目录的功能使同一存储库具有多个工作目录变得很容易。例如,如果您同时处理两个分支(例如,一个常规开发分支和一个错误修复分支),这是非常有用的

尝试为多个存储库共享同一工作目录是有问题的,因为两次提交不太可能共享一个工作目录。

正如您自己所指出的,这很有用,只是有点(或很多)麻烦,因为您还必须在各种情况下设置
$GIT\u WORK\u TREE
或使用
--WORK TREE
。还有一个问题是,对于每个存储库,无论工作树如何,都只有一个暂存区域,
$GIT\u DIR/index
。您也可以通过设置
$GIT\u INDEX\u FILE
来覆盖此选项

(下一部分的方向与您不同;为了完整起见,我将其包括在内。)


在较旧版本的Git中,有一个脚本试图简化此操作,而在Git版本2.5中,该脚本(大部分)被一个新命令取代,
Git worktree
,该命令允许您添加显式独立的工作树(每个工作树都位于不同的分支上,并进行检查以确保其保持不变)。Git知道如何自动处理这些问题,并自动为您处理
--Git dir
--work tree
,以及单独的索引文件。但是它有一些bug,正在进行修复;如果您打算大量使用它,我建议您至少在Git 2.6版之前不要使用它,最好是2.9版或其他最新版本。

如果多个回购协议添加了相同的文件,我会发现存在问题。但是,如果每个文件从未添加到多个repo,那么共享一个工作目录就可以了,对吗?我现在能想到的唯一问题是,每个repo都会有很多未跟踪的文件:另一个repo的跟踪文件。这是一个实际问题还是一个麻烦取决于您在工作流中经常使用的命令(
git add.
)。