我在StackOverflow上使用了this resource来弄清楚如何从两个git存储库中填充一个目录,在我的情况下是.org-git-work
和org-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
的输出似乎表明它设置正确。
答案 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的环境设置。使用 要设置环境变量并使设置持久化,请使用 或: 或: 所有工作。明确导出变量后,还会导出对该变量的更改: 要删除环境变量,请使用 您打算弄弄的两个变量是 您没有没有这样做: Git实际上一次只能理解一个存储库,其中包含 every 提交和 every 文件的 every 快照。这个包含所有内容的单一存储库具有一(1)个标准的内置 index ,也称为其登台区域或有时称为缓存。该索引/暂存区索引/缓存一(1)个工作树。 1 尝试将两个单独的Git存储库提取到单个工作树中会引起很多麻烦,因为您将有两个存储库共享一个工作树,因此您将有两个单独的索引文件,它们都认为它们完全掌握该工作树中上发生的事情。 并不是说这行不通(它可以),只是您将在此设置中遇到麻烦。 1 在较新的Git版本(2.5+)中,您可以添加其他工作树,每个工作树都具有自己的私有索引/登台区域,尽管仍然存在各种错误(我绊倒了最近)。 Git在某种程度上还理解了 shallow 存储库,其中某些提交实际上有效地“丢失了”,并且它支持 sparse checkout ,但这两个都没有帮助。&&
运算符 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 ...
注意事项