Git如何知道它在一个git仓库中

6

我对git是如何知道自己在git仓库中感兴趣。我最初的想法是它会一直向上爬文件夹结构到根目录(这可能涉及权限错误)。这个过程有没有被记录在文档中呢?

3个回答

6
“经验法则是Git只查找文件路径以查找.git目录,但这不是完全正确的。正如Edward Thomson所问的那样,对于没有.git目录的裸库怎么办呢?”
“以下是详细信息。它从setup_git_directory_gently_1开始搜索Git目录。”
“如果设置了或<--git-dir>,则使用该目录。否则,它将从当前工作目录或使用<-C>指定的路径开始搜索。”
  1. 如果存在一个带有第一行 gitdir: <path>.git 文件,它将使用该路径。
  2. 如果 .git/(非裸库)是 Git 目录,则使用该目录。
  3. 如果 ./(裸库)是 Git 目录,则使用该目录。
  4. 向上移动一个目录并重新开始,除非...
    1. 达到任何一个 GIT_CEILING_DIRECTORIES
    2. GIT_DISCOVERY_ACROSS_FILESYSTEM 不为 true 并且已经到达文件系统边界。

如果 is_git_directory 中的所有条件都成立,则它是 Git 目录。

  1. HEAD 包含一个语法上有效的引用。
  2. 存在一个可访问的 objects 目录,或者 GIT_OBJECT_DIRECTORY 设置为该目录。
  3. 存在一个可访问的 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目录中,则为非裸仓库。


嗨,区块头们!在区块世界里,今天是像海盗一样说话的日子!说真的,我在想:”yarblockos“是什么意思? - torek
@torek Appypolly loggies。这是nadsat语,所以你马儿会和任何cheepooka参考一起兔子跳舞。 - Schwern
啊哈。从来没有读过那本书(因为听说它和基于该书的电影都有极端暴力的描写,这不符合我的口味),但也许我应该读一下。 - torek

3

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

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

编辑:有两种可能的情况:你可能从工作树中开始,也可能从实际仓库中开始(比如在工作树顶部惯常保持的.git目录中)。我回答了“在工作树内部”的情况,Schwern回答了“在实际仓库内部”的情况,简而言之:是的,它会向上遍历目录嵌套,直到找到工作树或仓库。工作树有一个带有仓库的.git,仓库具有如该答案所述的refsobjectsHEAD


链接:https://git-scm.com/docs/git#Documentation/git.txt-codeGITDISCOVERYACROSSFILESYSTEMcode - NebulaFox

0
一个 Git 仓库是一个包含 .git 目录的文件夹。Git 可以递归向后查找,直到遇到该文件夹或无法再返回为止。

裸仓库怎么样? - Edward Thomson
@EdwardThomson 很好的问题。查看我的答案 - Schwern

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接