我感兴趣的是如何git真正知道它在 git 存储库中。我的第一个想法是它只是将文件夹结构爬到根目录(这可能涉及权限错误)。它在任何地方都有记录吗?
经验法则是 Git 只是查找文件路径来查找 .git 目录,但事实并非如此。正如 Edward Thomson 所问,没有 .git 目录的裸存储库怎么样?
这是血淋淋的细节。它从setup_git_directory_gently_1开始搜索 Git 目录。
如果设置了GIT_DIR或 ,--git-dir则使用它。否则,它将从当前工作目录或 . 给定的路径开始搜索-C。
.git 文件gitdir: <path>,它将使用该路径。.git/(非裸存储库)是 Git 目录,则它使用该目录。./(裸存储库)是 Git 目录,则它会使用该目录。GIT_CEILING_DIRECTORIES.GIT_DISCOVERY_ACROSS_FILESYSTEM事实并非如此,它已经触及文件系统边界。如果所有这些都为真,则它是一个 Git 目录,来自is_git_directory.
HEAD包含语法上有效的引用。objects目录,或者 GIT_OBJECT_DIRECTORY 设置的任何内容。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目录中,那么它就是一个非裸存储库。
就是这样。您还可以使用选项或环境变量明确告诉它所有部分的位置。
完整的文档是零散地拼写的,您可以搜索git help git“发现”来查找命令本身的--git-dir选项git,稍后,在GIT_DISCOVERY_ACROSS_FILESYSTEM环境变量的文档下讨论其正常发现的准确规范,该规范用于扩展该命令发现的范围。
编辑:有两种可能的情况:您可以从工作树内部开始,或者可以从实际存储库内部开始(就像通常保存在.git工作树顶部的目录中的存储库一样)。我回答了“在工作树内部”的情况,Schwern回答了“在存储库内部”的情况,tl;dr:是的,它会沿着目录嵌套向上走,直到找到工作树或存储库。工作树有一个.git,其中有一个存储库,一个存储库有refs和objects,HEAD如该答案中所述。
| 归档时间: |
|
| 查看次数: |
848 次 |
| 最近记录: |