代码之家  ›  专栏  ›  技术社区  ›  Robert P. Goldman chepner

一个目录中多个git存储库的git命令-git\u dir

  •  1
  • Robert P. Goldman chepner  · 技术社区  · 8 年前

    我用过 this resource 在StackOverflow上找出如何从两个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_目录 以下内容:

    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 回复  |  直到 8 年前
        1
  •  1
  •   torek    8 年前

    环境变量,通常

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

    要设置shell变量,请使用 name = value 任何地方。

    设置 环境 变量在单个命令的持续时间内,使用以下语法 name = variable command 以下内容:

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

    不要使用:

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

    因为这只会给 变量。

    为了说明区别,我们可以使用 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
    

    或:

    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 ,所以你可以写:

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

    警告

    git一次只能理解一个存储库,其中包含 每一个 承诺 每一个 的快照 每一个 文件这个包含所有内容的单一存储库有一(1)个标准内置 指数 ,也被称为 中转区 或者有时 隐藏物 . 此索引/暂存区域索引/缓存一(1)个工作树。 1个 尝试将两个独立的git存储库提取到一个工作树中会引起很多麻烦,因为您将有两个存储库共享同一个工作树,所以您将有两个独立的索引文件,它们都认为它们完全可以控制正在发生的事情。 在里面 那棵树。

    这并不是说这不起作用(它可以),只是你会在这个设置中遇到烦恼。


    在较新的git版本(2.5+)中,您可以添加额外的工作树,每个工作树都有自己的私有索引/暂存区域,尽管仍然存在各种错误(我最近遇到过一个)。Git在某种程度上也理解, 浅的 一些提交实际上“丢失”的存储库,并且它支持 稀疏签出 ,但这些都没有帮助。