Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git没有在ref dir中包含所有分支文件,也没有在分支引用文件中维护提交id。为什么?_Git_Git Branch_Git Remote - Fatal编程技术网

git没有在ref dir中包含所有分支文件,也没有在分支引用文件中维护提交id。为什么?

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使用与分支名称相同的纯文本文件跟踪分支。这些文件存储在
.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>]