git没有在ref dir中包含所有分支文件,也没有在分支引用文件中维护提交id。为什么?
据我所知,GIT使用与分支名称相同的纯文本文件跟踪分支。这些文件存储在git没有在ref dir中包含所有分支文件,也没有在分支引用文件中维护提交id。为什么?,git,git-branch,git-remote,Git,Git Branch,Git Remote,据我所知,GIT使用与分支名称相同的纯文本文件跟踪分支。这些文件存储在.git\refs\remotes\origin中,用于远程跟踪远程分支,对于本地分支,这些文件位于.git\refs\heads 以下是git分支的输出: $ git branch -a joincolumn_issue * master remotes/origin/HEAD -> origin/master remotes/origin/joincolumn_issue remotes/origin
.git\refs\remotes\origin
中,用于远程跟踪远程分支,对于本地分支,这些文件位于.git\refs\heads
以下是git分支的输出:
$ git branch -a
joincolumn_issue
* master
remotes/origin/HEAD -> origin/master
remotes/origin/joincolumn_issue
remotes/origin/mappedBy
remotes/origin/master
remotes/origin/todelete
问题/问题的第一部分:正如您所看到的,git知道有几个远程分支。。。但是在看.git dir时,我没有看到所有的-
Samsh@Sambox MINGW64 /d/graphql-hibernate/.git/refs/remotes/origin (GIT_DIR!)
$ ls
HEAD joincolumn_issue
为什么其他分支的文件不存在。好啊除了joincolumn\u issue
之外的分支从未从远程签出。如果这是原因的话。好吧,如果是这样的话,那么git是如何以及从何处获得其他分支详细信息的(因为它在git branch-a
中列出了它们,它肯定不会为此查询轮询回购协议)
问题/问题的第二部分:
查看ref dir中文件的内容时-
Samsh@Sambox MINGW64 /d/graphql-hibernate/.git/refs/remotes/origin (GIT_DIR!)
$ cat joincolumn_issue
1950d716308e5063f1b8f28c2423166781335333
这与预期的一样,指向提交id。很好。但问题在于产量不足
$ cat HEAD
ref: refs/remotes/origin/master
HEAD指的是master,在.git
dir中没有这样的文件。因此,现在您了解了我的问题,我无法理解git如何在不知道/跟踪相关提交id的情况下找出master的提示
GIT使用与分支名称相同的纯文本文件跟踪分支
有时候,是的。有时候不,你不应该在意。为什么要检查.git/refs/heads/
文件?1
Git有一个名到散列ID映射的数据库,2个在某处。您可以使用git rev parse
程序3从名称中提取哈希ID
为您提供refs/heads/master
的哈希ID,即分支名称master
。对于每个ref(参见其文档),您可以使用git对部分或所有引用进行迭代
通常,可以使用更高级别的接口将名称设置为散列ID,例如,git branch
或git tag
;但是您可以使用git update ref直接编写数据库:
git update-ref [flags] refs/heads/master <new-hash> [<old-hash>]
git更新参考[flags]refs/heads/master[]
意味着存储新的散列;如果我提供了旧的散列,在进行更改之前,请确保名称映射到现有的散列ID
1也许是消沉、学习,或者只是单纯的固执。:-) 2实际上,在C代码中,Git有“后端”的概念,实现引用存储和加载。当前的“数据库”非常糟糕,由平面文件
.git/packed refs
或取自.git/refs/
的文件组成。平面文件“数据库”运行良好。例如,它分别存储名称master
和master
,因此这两个分支是不同的,正如Git所希望的那样,它们只是本地文件系统文件树“数据库”在某些系统上出现严重故障,无法创建名为master
和master
的文件。很明显,像GitHub这样的大型服务器提供商可以使用真正的数据库:一些存储库有数千个标记,处理平面文件和文件树,我们可以说,“不好”
3Rev parse不仅仅是在数据库中查找一个名称,它还可以做到这一点,所以为什么不使用它呢?非常详细。这是一个努力寻找引擎盖下,否则出于任何实际原因,我不认为最终用户将不得不担心这件事+1.
git update-ref [flags] refs/heads/master <new-hash> [<old-hash>]