.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如何翻译符号引用,如master
heads
remotes
tags