我得到了git --git-dir的奇怪行为

时间:2017-10-16 04:39:33

标签: git

git -Cgit --git-dir之间有什么区别?

为什么--git-dir不能使用git grep

为什么有时git log --git-dir=$Path/.git有效,有时git log --git-dir=$Path/有效?

2 个答案:

答案 0 :(得分:2)

git -C <path>使Git将其当前工作目录移动到给定的<path>参数。这可能会影响两个搜索:

  1. Git应该在哪里找到存储库?
  2. Git应该在哪里找到工作树?
  3. 另一方面,--git-dir <path>告诉Git在哪里找到存储库,--work-tree <path>告诉Git在哪里找到工作树。

    仅使用-C(而不是设置环境变量GIT_DIR)时,您可以获得与更改当前目录相同的效果:Git仍将在当前查找.git 。目录

    使用--git-dir--work-tree时,只会影响一次搜索。如果该搜索是 relative (不是在理智的系统上以/开头,或是在其他系统上以驱动器号开头),则它从当前工作目录发生,无论是什么。如果该搜索是绝对(确实以/开头,或以例如Z:/开头),则当前工作目录与该搜索无关。

    还有一个关键项:如果没有给出特定的存储库位置或工作树位置,则搜索是一种更一般的搜索方式。它从当前目录开始(可能由-C修改)并向上工作,寻找.git目录。例如,假设起点为/a/b/c/d/e。 Git会寻找:

    1. /a/b/c/d/e/.git:如果存在,那就是存储库位置,工作树从这里开始。否则:
    2. /a/b/c/d/.git:如果存在,那就是存储库位置,工作树从这里开始。由于您位于该目录中的e/,因此如果顶级中存在..文件,则可能存在需要一个../README.md的文件,例如README.md。 / p>

      如果失败了,我们继续:

    3. /a/b/c/.git:如果存在,那就是存储库位置(参见步骤2)。否则,请尝试:
    4. /a/b/.git:如果存在,那就是存储库位置;否则:
    5. /a/.git:如果存在,那就是存储库位置;否则:
    6. /.git:如果存在,那就是存储库位置;否则:
    7. 失败:没有Git存储库。
    8. 只有在没有提供--git-dir 的情况下才会进行此搜索。如果给出--git-dir,则存储库必须存在;如果不存在,Git就会失败。

      某些命令(例如git log)可以在没有工作树的情况下工作。 (如果您使用这样的命令,可以使用--git-dir将其直接指向Git存储库,它甚至不需要拥有工作树:它可能是{{1如果您改为使用--bare在工作树中的某个位置设置当前工作目录,该命令将使用上面概述的“爬上-C”搜索方法。

答案 1 :(得分:1)

git -C foo --git-dir=bar相当于git --git-dir=foo/bar

如果bar是裸存储库,则为--git-dir=bar/

如果bar是非裸存储库,则为--git-dir=bar/.git