Bash 用于单个目录中多个Git存储库的Git命令-Git_DIR
我在StackOverflow上使用了一个目录,这个目录是从两个git存储库填充的,在我的例子中是Bash 用于单个目录中多个Git存储库的Git命令-Git_DIR,bash,git,Bash,Git,我在StackOverflow上使用了一个目录,这个目录是从两个git存储库填充的,在我的例子中是.org git work和org git personal(这是必需的,这样我就可以使用一些软件,把所有文件放在一起,这样我就可以把个人和专业资料分开) 现在,我尝试使用别名与这个共享工作目录中的两个git存储库交互,但不知何故,我无法在别名中传递git\u DIR。任何人都可以纠正以下问题: alias org-git-work='GIT_DIR=/foo/org/.work-org-git &
.org git work
和org git personal
(这是必需的,这样我就可以使用一些软件,把所有文件放在一起,这样我就可以把个人和专业资料分开)
现在,我尝试使用别名与这个共享工作目录中的两个git存储库交互,但不知何故,我无法在别名中传递git\u DIR
。任何人都可以纠正以下问题:
alias org-git-work='GIT_DIR=/foo/org/.work-org-git && echo $GIT_DIR && GIT_WORK_DIR=/foo/org && git'
当我尝试使用上述别名时,git
仍在.git
中查找,而不是使用git\u 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
的输出似乎表明它设置正确。通常是环境变量
您正在将环境变量与shell变量合并。(这并不奇怪,因为shell本身在某种程度上会这样做。)环境变量从shell传递到shell运行的程序中,而shell变量则不是
要设置shell变量,请在任意位置使用name=value
要为单个命令的持续时间设置环境变量,请使用语法name=variable command
:
不要使用:
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没有环境设置。使用不带&&
运算符的语法,有一个,使用带&&
运算符的语法,它再次消失
要设置环境变量并保持设置,请使用export
关键字。有几种方法可以做到这一点:
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\u DIR
(这里使用的两个变量之一)和GIT\u WORK\u TREE
(而不是GIT\u WORK\u DIR
)。所以你真的想要:
GIT_DIR=path1 GIT_WORK_TREE=path2 git ...
您不必这样做:git
前端命令具有参数--git dir=path
和--work tree=path
,因此您可以编写:
git --git-dir=path1 --work-tree=path2 ...
警告
Git一次只理解一个存储库,它包含每个文件的每个提交和每个快照。这个包含所有内容的单一存储库有一(1)个标准内置索引,也称为暂存区,有时也称为缓存。这个索引/暂存区域索引/缓存一(1)个工作树。1试图将两个独立的Git存储库提取到一个工作树中会引起很多麻烦,因为两个存储库共享一个工作树,因此,您将有两个单独的索引文件,它们都认为自己完全掌握了工作树中发生的事情
这并不是说这不起作用(它可以),只是你将体验到这种设置带来的烦恼
1在较新的Git版本(2.5+)中,您可以添加额外的工作树,每个工作树都有自己的私有索引/暂存区域,尽管仍然存在各种错误(我最近被一个错误绊倒)。Git在某种程度上也理解一些提交实际上“丢失”的浅层存储库,它支持稀疏签出,但这两种方法都没有帮助。您可能没有导出变量。说
export GIT\u DIR=/foo/org/.work org GIT
。谢谢。我知道这是次优的。问题是我使用的移动应用程序需要访问两个repos值的东西(个人和工作待办事项列表),它们必须位于Dropbox上的同一目录中(因为移动应用程序无法处理任何其他内容)。所以,我所能做的可能只有一件让人烦恼的事。
$ unset FOO
$ python -c 'import os; print(os.getenv("FOO"))'
None
GIT_DIR=path1 GIT_WORK_TREE=path2 git ...
git --git-dir=path1 --work-tree=path2 ...