我发现git的奇怪行为--git-dir

  • 本文关键字:--git-dir 发现 git git
  • 更新时间 :
  • 英文 :


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

为什么--git-dir不能与git grep配合使用?

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

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

  1. Git应该在哪里找到存储库
  2. Git应该在哪里找到工作树

另一方面,--git-dir <path>告诉Git在哪里找到存储库,而--work-tree <path>告诉Git在哪里可以找到工作树。

当只使用-C(而不设置环境变量GIT_DIR)时,您会得到与更改自己的当前目录相同的效果:Git仍然会在当前目录中查找.git

使用--git-dir--work-tree时,只影响一次搜索。如果该搜索是相对的(在正常系统上不是以/开头,或在其他系统上不是驱动器号开头),则从当前工作目录开始,无论是什么。如果该搜索为绝对的


还有一个关键项:如果没有给出特定的存储库位置或工作树位置,则搜索是一种更通用的搜索。它从当前目录(可能由-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文件)。

    然而,如果失败了,我们将转到:

  3. /a/b/c/.git:如果存在,那就是存储库位置(请参见步骤2)。否则,请尝试:

  4. /a/b/.git:如果存在,则为存储库位置;否则:

  5. /a/.git:如果存在,那就是存储库位置;否则:

  6. /.git:如果存在,那就是存储库位置;否则:

  7. 失败:没有Git存储库。

但是只有在没有提供--git-dir的情况下才执行此搜索。如果给定--git-dir,则存储库必须存在;如果不存在,Git就会失败。

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

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

如果bar是一个裸存储库,那么--git-dir=bar/

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

最新更新