我有几个git存储库。其中一个是在 $ PATH 中。今天,我不小心搬到了一个我认为有git存储库的目录,但没有一个。
cd <another_directory_without_.git>
。
所以,当我输入git status
时,输出很混乱。
看来git在 $ PATH 中找到了存储库,所以在这种情况下,git在〜/ bin 中找到了存储库,它位于我的 PATH < / em>的
git是通过查找$ PATH来搜索存储库,还是有其他搜索机制在工作?
答案 0 :(得分:2)
我找不到实际细节的确切参考,但我们可以从the documentation to the git repository variables推断出大部分内容。
Git按优先顺序查找其存储库:
在--git-dir
参数
在GIT_DIR
环境变量
在子目录.git
或当前目录
在祖先目录的子目录.git
中。环境变量GIT_CEILING_DIRECTORIES
和GIT_DISCOVERY_ACROSS_FILESYSTEMS
对此设置了一些限制。
答案 1 :(得分:2)
根据git(1)
manual page,Git在查找对象存储时会这样:
如果&#34; - git-dir&#34;指定了命令行选项,其值用于定位存储库。
如果GIT_DIR
环境变量可用并设置其值,则用于定位存储库。
请注意,在这两种情况下都没有搜索/启发式。
否则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.
如果失败,Git会尝试找到一个名为&#34; .git&#34;的目录。在当前目录中。
如果成功,它会使用上一步中的测试来验证它是否真的是它正在寻找的东西。
如果失败,它会上升一级 - 到父目录并再次尝试。
最后两个步骤执行到类似POSIX的系统上的/
或Windows上的驱动器的根目录(因此没有任何上升)。默认情况下,Git也不会跨越当前目录的文件系统边界。
如您所见,不涉及$PATH
:此目录仅用于查找可执行程序,Git与之无关。