Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 用于单个目录中多个Git存储库的Git命令-Git_DIR_Bash_Git - Fatal编程技术网

Bash 用于单个目录中多个Git存储库的Git命令-Git_DIR

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 &

我在StackOverflow上使用了一个目录,这个目录是从两个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 ...