在单个目录中的多个git仓库的Git命令-GIT_DIR

时间:2018-07-22 16:11:36

标签: bash git

我在StackOverflow上使用了this resource来弄清楚如何从两个git存储库中填充一个目录,在我的情况下是.org-git-workorg-git-personal(这是必需的,因此我可以使用一些对所有文件都放在一起很挑剔的软件,这样我就可以将个人资料和专业资料区分开来。

现在,我正在尝试创建别名以与该共享工作目录中的两个git存储库进行交互,但是由于某种原因,我无法在别名中传达GIT_DIR。任何人都可以纠正以下问题:

alias org-git-work='GIT_DIR=/foo/org/.work-org-git && echo $GIT_DIR && GIT_WORK_DIR=/foo/org && git'

当我尝试使用上述别名时,git仍会在.git中查找,而不是使用GIT_DIR的值:

org-git-work commit -m "Resource for preposterior sampling." bar.org
/foo/org/.work-org-git
fatal: not a git repository (or any of the parent directories): .git

...但是echo的输出似乎表明它设置正确。

1 个答案:

答案 0 :(得分:1)

通常是环境变量

您正在将环境变量与Shell变量合并。 (这并不奇怪,因为外壳程序本身在一定程度上会这样做。) environment 变量从外壳程序传递到外壳程序运行的程序中,而 shell 变量是不是。

要设置外壳变量,请在任何地方使用name=value

要在单个命令的持续时间内设置 environment 变量,请使用语法name=variable command

GIT_DIR=/foo/org/.work-org-git git ...

请勿使用:

GIT_DIR=/foo/.org/.work-org-git && git ...

,因为这只会设置一个 shell 变量。

为说明区别,我们可以使用python -c

$ python -c 'import os; print(os.getenv("FOO"))'
None
$ FOO=bar python -c 'import os; print(os.getenv("FOO"))'
bar
$ FOO=bar && python -c 'import os; print(os.getenv("FOO"))'
None

最初,没有FOO的环境设置。使用&&运算符 without 的语法,有一个,而&&运算符 with 使用的语法,它再次消失了。 / p>

要设置环境变量并使设置持久化,请使用export关键字。有几种方法可以做到这一点:

FOO=bar export foo

或:

export FOO=bar

或:

FOO=bar; export FOO

所有工作。明确导出变量后,还会导出对该变量的更改

$ export FOO=bar && python -c 'import os; print(os.getenv("FOO"))'
bar
$ python -c 'import os; print(os.getenv("FOO"))'
bar

删除环境变量,请使用unset

$ unset FOO
$ python -c 'import os; print(os.getenv("FOO"))'
None

Git的环境变量,特别是

您打算弄弄的两个变量是GIT_DIR(这里使用的两个变量之一)和GIT_WORK_TREE(不是GIT_WORK_DIR)。所以你真的想要:

GIT_DIR=path1 GIT_WORK_TREE=path2 git ...

您没有没有这样做:git前端命令具有参数--git-dir=path--work-tree=path,因此您可以这样写:< / p>

git --git-dir=path1 --work-tree=path2 ...

注意事项

Git实际上一次只能理解一个存储库,其中包含 every 提交和 every 文件的 every 快照。这个包含所有内容的单一存储库具有一(1)个标准的内置 index ,也称为其登台区域或有时称为缓存。该索引/暂存区索引/缓存一(1)个工作树。 1 尝试将两个单独的Git存储库提取到单个工作树中会引起很多麻烦,因为您将有两个存储库共享一个工作树,因此您将有两个单独的索引文件,它们都认为它们完全掌握该工作树中上发生的事情。

并不是说这行不通(它可以),只是您将在此设置中遇到麻烦。


1 在较新的Git版本(2.5+)中,您可以添加其他工作树,每个工作树都具有自己的私有索引/登台区域,尽管仍然存在各种错误(我绊倒了最近)。 Git在某种程度上还理解了 shallow 存储库,其中某些提交实际上有效地“丢失了”,并且它支持 sparse checkout ,但这两个都没有帮助。