.git/refs中的哪些目录具有特殊意义?

.git/refs中的哪些目录具有特殊意义?,git,Git,在.git/refs中,描述了三个目录: 另外,git replace目录replace。因此,至少这4个名称是已知的,并且对Git有特殊意义 但例如,在自己的存储库中为和更改的目录。(这只是一个例子,我没有问任何关于Gerrit的问题。)例如,我可以获取'changes'引用。Git会知道它们不是分支,也不是远程——它们是否像标签一样处理 Git一般如何理解.Git/refs中的“非标准”内容?什么是这样的用例?除了我上面列出的参考文献目录外,还有其他“标准”参考文献目录吗 Git通常如何理解

.git/refs
中,描述了三个目录:

另外,
git replace
目录
replace
。因此,至少这4个名称是已知的,并且对Git有特殊意义

但例如,在自己的存储库中为和更改的目录
。(这只是一个例子,我没有问任何关于Gerrit的问题。)例如,我可以获取'changes'引用。Git会知道它们不是分支,也不是远程——它们是否像标签一样处理

Git一般如何理解
.Git/refs
中的“非标准”内容?什么是这样的用例?除了我上面列出的参考文献目录外,还有其他“标准”参考文献目录吗

Git通常如何理解.Git/refs中的“非标准”内容

没有。它忽略了它们

.git
是一个目录树。与任何其他目录树一样,文件和目录名对git有意义。
.git/refs/
的每个顶级目录对
git
都有特定的含义

  • .git/refs/heads/
    包含分支头(即
    master
  • .git/refs/tags/
    包含标签(即
    v1.2.3
  • .git/refs/remotes/
    包含远程分支头(即
    origin/master
Git命令将遍历这些目录中的文件,以发现哪些分支、标记和远程可用。它知道什么时候需要,例如,它在
.git/refs/tags/
中查找标记

例如,
git branch
有效地列出了
.git/refs/heads/
及其子目录中的所有文件
git-tag-l
does
.git/refs/tags/
。而
git branch-r
does
.git/refs/remotes/
。注意,有类似的优化使得这不再那么简单

那里的任何东西
git
都不能使用。就像许多程序在主目录中放置文件和目录一样,它们都只关心自己的文件和目录


什么是这样的用例

你已经和Gerrit回答了你的问题。当第三方Git实用程序需要存储有关本地存储库的额外信息时,他们可以将其放入
.Git
中。与将
.gerrit
目录映射到代码树顶部不同,
.git
中的额外文件和目录被大多数其他实用程序忽略。如果您移动或复制repo目录,则
.git
中的额外Gerrit信息将随之出现

例如,当Gerrit想要存储其他类型的引用时,它可以将它们放在
.git/refs/changes/
.git/refs/For/
中,而不会干扰正常的
git
功能


除了我上面列出的参考文献目录外,还有其他“标准”参考文献目录吗


我怀疑是否有一个确定的列表,您可能需要扫描
git
的源代码才能找到它。有关已知目录的列表,请参阅。

我对这一点的看法与中的略有不同:没有任何目录具有特殊意义。相反,某些前缀字符串具有含义

Git关心的是引用,这些引用是以
refs/
开头的名称,符合。Git有时选择将这些名称存储为普通的文件路径名,有时则不是特别的
。Git/packed refs
将它们全部存储在一个简单的文本数据库文件中。将来,Git可能会在平面文件和/或目录树之外使用一个真实的数据库,或者使用它来代替平面文件和/或目录树。如果您坚持使用已发布的接口(如下所述),您可以避免将来的任何格式更改

Git本身中定义的前缀字符串是(我试图完成此列表,但我忘记了Schwern添加的至少一个前缀字符串,所以我添加了它:-):

  • refs/bisect/
    :关于正在进行的二分法的信息
  • refs/heads/
    :分支机构名称
  • refs/notes/
    :注释名称
  • refs/original/
    git filter branch
    使用它存储所有原始(预筛选操作)引用
  • refs/remotes/
    :远程跟踪名称
  • 参考/replace/
    :替换对象
  • refs/stash
    :隐藏的(单数)
  • refs/tags/
    :标记名称
所有其他名称都可用,至少在某些第三方扩展集成到Git中之前是如此

要编写引用,请使用。这可以创建、更新或删除对任何有效哈希ID的引用。要编写符号引用,请使用。这两个命令都将更新引用的reflog(如果存在),或者创建或删除它(如果合适)

要遍历所有引用,请使用。要在逻辑树结构中遍历特定引用,可以继续对每个引用使用
git
(它使用前缀和glob模式),或者使用一些更面向用户的命令(如
git branch
git tag
),或者使用
--branchs
--tags
,和/或
——例如,
git rev list的远程参数--no walk

如果要使用较低级别的操作,请注意,当前,
.git/refs
中存在的文件会覆盖平面文件
.git/packed refs
文件中存储的任何值。我怀疑,如果/当Git获得一个真正的引用数据库时,真正的数据库条目将覆盖所有其他条目,并且可能存在“这个名称以前存在,但现在不存在”的数据库条目类型代码。(如果数据库是高效的,它可能也会保存reflog条目,这将是允许“取消删除”旧引用的好方法。)

解释Git如何翻译符号引用,如
masterheads
remotes
tags