git使用什么机制来查找其存储库?

时间:2015-09-14 17:29:43

标签: linux git

我有几个git存储库。其中一个是在 $ PATH 中。今天,我不小心搬到了一个我认为有git存储库的目录,但没有一个。

cd <another_directory_without_.git>

所以,当我输入git status时,输出很混乱。

看来git在 $ PATH 中找到了存储库,所以在这种情况下,git在〜/ bin 中找到了存储库,它位于我的 PATH < / em>的

git是通过查找$ PATH来搜索存储库,还是有其他搜索机制在工作?

2 个答案:

答案 0 :(得分:2)

我找不到实际细节的确切参考,但我们可以从the documentation to the git repository variables推断出大部分内容。

Git按优先顺序查找其存储库:

  • --git-dir参数

  • 提供的目录中
  • GIT_DIR环境变量

  • 提供的目录中
  • 在子目录.git或当前目录

  • 在祖先目录的子目录.git中。环境变量GIT_CEILING_DIRECTORIESGIT_DISCOVERY_ACROSS_FILESYSTEMS对此设置了一些限制。

答案 1 :(得分:2)

根据git(1) manual page,Git在查找对象存储时会这样:

  1. 如果&#34; - git-dir&#34;指定了命令行选项,其值用于定位存储库。

  2. 如果GIT_DIR环境变量可用并设置其值,则用于定位存储库。

    请注意,在这两种情况下都没有搜索/启发式。

  3. 否则Git会尝试确定当前目录是否是 存储库 - 以防它是一个没有工作树的裸存储库。

    here解释了用于执行此任务的逻辑。引用它:

    测试我们是否在git目录下。 我们希望看到:

    - either an objects/ directory _or_ the proper
      GIT_OBJECT_DIRECTORY environment variable
    - a refs/ directory
    - either a HEAD symlink or a HEAD file that is formatted as
      a proper "ref:", or a regular file HEAD that has a properly
      formatted sha1 object name.
    
  4. 如果失败,Git会尝试找到一个名为&#34; .git&#34;的目录。在当前目录中。

    如果成功,它会使用上一步中的测试来验证它是否真的是它正在寻找的东西。

  5. 如果失败,它会上升一级 - 到父目录并再次尝试。

    最后两个步骤执行到类似POSIX的系统上的/或Windows上的驱动器的根目录(因此没有任何上升)。默认情况下,Git也不会跨越当前目录的文件系统边界。

  6. 如您所见,不涉及$PATH:此目录仅用于查找可执行程序,Git与之无关。