我对git
是如何知道自己在git仓库中感兴趣。我最初的想法是它会一直向上爬文件夹结构到根目录(这可能涉及权限错误)。这个过程有没有被记录在文档中呢?
我对git
是如何知道自己在git仓库中感兴趣。我最初的想法是它会一直向上爬文件夹结构到根目录(这可能涉及权限错误)。这个过程有没有被记录在文档中呢?
gitdir: <path>
的 .git
文件,它将使用该路径。.git/
(非裸库)是 Git 目录,则使用该目录。./
(裸库)是 Git 目录,则使用该目录。GIT_CEILING_DIRECTORIES
。GIT_DISCOVERY_ACROSS_FILESYSTEM
不为 true 并且已经到达文件系统边界。如果 is_git_directory
中的所有条件都成立,则它是 Git 目录。
HEAD
包含一个语法上有效的引用。objects
目录,或者 GIT_OBJECT_DIRECTORY 设置为该目录。refs
目录。如果它是Git目录且其父目录为.git
,则这是一个非裸的Git目录。
下面是最少的内容,可以让Git确认它找到了一个“Git目录”。
$ ls -lR
.:
total 4
-rw-r--r-- 1 schwern staff 27 Dec 29 14:50 HEAD
dr-xr-xr-x 2 schwern staff 64 Dec 29 14:50 objects
drwxr-xr-x 2 schwern staff 64 Dec 29 14:50 refs
./objects:
total 0
./refs:
total 0
$ cat HEAD
ref: refs/heads/yarblockos
可访问的对象
和引用
目录,以及一个具有语法上有效引用的HEAD文件。
如果这些内容在.git
目录中,则为非裸仓库。
就是这样。您还可以明确告诉它所有的部分在哪里,使用选项或环境变量。
完整的文档有点零散,您可以搜索git help git
查找“发现”,以在git
命令本身上找到--git-dir
选项,并在稍后,在GIT_DISCOVERY_ACROSS_FILESYSTEM
环境变量的文档下讨论其正常发现的精确规范,该变量用于扩展该发现的范围。
编辑:有两种可能的情况:你可能从工作树中开始,也可能从实际仓库中开始(比如在工作树顶部惯常保持的.git
目录中)。我回答了“在工作树内部”的情况,Schwern回答了“在实际仓库内部”的情况,简而言之:是的,它会向上遍历目录嵌套,直到找到工作树或仓库。工作树有一个带有仓库的.git
,仓库具有如该答案所述的refs
、objects
和HEAD
。
.git
目录的文件夹。Git 可以递归向后查找,直到遇到该文件夹或无法再返回为止。