git 如何知道它在 git 存储库中

Neb*_*Fox 7 git

我感兴趣的是如何git真正知道它在 git 存储库中。我的第一个想法是它只是将文件夹结构爬到根目录(这可能涉及权限错误)。它在任何地方都有记录吗?

Sch*_*ern 6

经验法则是 Git 只是查找文件路径来查找 .git 目录,但事实并非如此。正如 Edward Thomson 所问,没有 .git 目录的裸存储库怎么样?

这是血淋淋的细节。它从setup_git_directory_gently_1开始搜索 Git 目录。

如果设置了GIT_DIR或 ,--git-dir则使用它。否则,它将从当前工作目录或 . 给定的路径开始搜索-C

  1. 如果存在第一行的.git 文件gitdir: <path>,它将使用该路径。
  2. 如果.git/(非裸存储库)是 Git 目录,则它使用该目录。
  3. 如果./(裸存储库)是 Git 目录,则它会使用该目录。
  4. 上移一个目录并重新开始,除非...
    1. 它已经击中了任何GIT_CEILING_DIRECTORIES.
    2. GIT_DISCOVERY_ACROSS_FILESYSTEM事实并非如此,它已经触及文件系统边界。

如果所有这些都为真,则它是一个 Git 目录,来自is_git_directory.

  1. HEAD包含语法上有效的引用。
  2. 有一个可访问的objects目录,或者 GIT_OBJECT_DIRECTORY 设置的任何内容。
  3. 有一个可访问的refs目录。

如果它是一个 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
Run Code Online (Sandbox Code Playgroud)

可访问的objects目录refs,以及具有语法有效引用的 HEAD 文件。

如果它位于.git目录中,那么它就是一个非裸存储库。


jth*_*ill 3

就是这样。您还可以使用选项或环境变量明确告诉它所有部分的位置。

完整的文档是零散地拼写的,您可以搜索git help git“发现”来查找命令本身的--git-dir选项git,稍后,在GIT_DISCOVERY_ACROSS_FILESYSTEM环境变量的文档下讨论其正常发现的准确规范,该规范用于扩展该命令发现的范围。

编辑:有两种可能的情况:您可以从工作树内部开始,或者可以从实际存储库内部开始(就像通常保存在.git工作树顶部的目录中的存储库一样)。我回答了“在工作树内部”的情况,Schwern回答了“在存储库内部”的情况,tl;dr:是的,它会沿着目录嵌套向上走,直到找到工作树或存储库。工作树有一个.git,其中有一个存储库,一个存储库有refsobjectsHEAD如该答案中所述。