Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.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 repo怎么可能只包含一个分支,而它的94个标记中的每一个都返回没有出现在分支中的文件?_Git_Github_Tags_Branch_Git Commit - Fatal编程技术网

一个特定的git repo怎么可能只包含一个分支,而它的94个标记中的每一个都返回没有出现在分支中的文件?

一个特定的git repo怎么可能只包含一个分支,而它的94个标记中的每一个都返回没有出现在分支中的文件?,git,github,tags,branch,git-commit,Git,Github,Tags,Branch,Git Commit,我在这个公开的GitHub repo中看到,只有一个分支main,它包含三个小文件和一个包含一个小文件的文件夹: 更新[文件夹] sys_ui_view_5bd975bd0fa03200cd674f8ce1050e7f.xml 自述文件 checksum.txt sys_app_6ead8e780f603200cd674f8ce1050ed1.xml 只有一个分支main,但有94个标记。每个标记都有两个与之关联的“资产”,这两个资产对于标记来说是唯一的。每个标记都有一个source

我在这个公开的GitHub repo中看到,只有一个分支main,它包含三个小文件和一个包含一个小文件的文件夹:

  • 更新[文件夹]
    • sys_ui_view_5bd975bd0fa03200cd674f8ce1050e7f.xml
  • 自述文件
  • checksum.txt
  • sys_app_6ead8e780f603200cd674f8ce1050ed1.xml
只有一个分支main,但有94个标记。每个标记都有两个与之关联的“资产”,这两个资产对于标记来说是唯一的。每个标记都有一个source code.zip和source code.tgz。在我看来,这些归档文件都是唯一的,其中包含一组唯一的文件。我所说的唯一性是指所有档案中的所有文件以及档案本身都是相互排斥的

我对git的理解是,每个提交都有一个唯一的标识符,它表示一个指针,指向所有先前块和当前块之间的更改。每个“文件”将始终是提交的一部分,并且每个提交必须始终至少在一个分支中。换句话说,任何提交都不能存在于分支之外,否则它就不是提交。标签只是回购状态的唯一书签。它也可能是某个时间点某个分支的状态


那么,标记如何表示完全位于任何分支之外的一组唯一文件呢?到目前为止,我能想到的唯一解释是1。我对git的理解是错误的或不完整的。2.GitHub在某种程度上扩展了git,我对GitHub的理解也是错误的或不完整的。

让我们从这个更正开始,它本身有点小,但很快就会被使用:

我对git的理解是,每个提交都有一个唯一的标识符

是:这是一个散列ID,当前为SHA-1散列

它表示一个指针,指向所有先前块和当前块之间的更改

否:每个提交保存元数据(如谁制作的以及何时制作的信息)和一个完整快照。没有提交保存更改(除非某个快照文件本身由表示更改的数据组成)。从技术上讲,即使快照本身也是间接的,通过元数据中的
行,但所有提交都要求只有一个

在(或返回)标签上:

每个标记都有两个与之关联的“资产”,这两个资产对于标记来说是唯一的。每个标记都有一个source code.zip和source code.tgz

这些可能是由GitHub动态生成的。标记名包含唯一标识符:散列ID。每个散列ID要么定位一个提交对象(使其成为一个“轻量级标记”,GitHub不会调用发布),要么定位一个标记对象(或带注释的标记对象)。带注释的标记对象保存元数据,该元数据的一部分通常是某个提交的哈希ID

那么,标记如何表示完全位于任何分支之外的一组唯一文件呢

回到分支机构:

每个“文件”都将始终是提交的一部分

不一定,但通常。Git将这些存储在部分中:树对象保存路径名组件,blob对象存储文件内容(由相同内容的每个用户共享)。这些对象也有散列ID。内容不一定是唯一的—例如,一个包含文字
。/symlink
的blob可能表示符号链接(通过以
模式120000
存储在树对象中的文件名)和文件内容(通过存储在某个树对象中的另一个文件名,但这次是以
模式100644
)。作为数据文件,这是一个末尾没有换行符的文件,但它是一个有效的数据文件

(事实上,我们可以计算它的散列:
。/symlink
的长度是10个字节,因此我们需要
blob 10\0../symlink
的SHA1和:

$ printf 'blob 10\0../symlink' | sha1
54f939943aafe4022f2d20855230e33cafe1a8f9
或:

因此,每个包含此内容的数据文件都具有此哈希ID。)

并且每次提交必须始终至少在一个分支中

没有;提交在零个或多个分支中。(啊哈:-)

要使提交位于分支中,必须可以从分支提示访问它。分支名称是
refs/heads/name
形式的引用,它保存提交对象的哈希ID。该提交对象的元数据包含任何直接前置或父提交的哈希ID,所有这些提交的传递闭包告诉我们哪些提交“在分支中”

然而,为了使提交保持活动状态,它只需要从任何引用都可以访问。标记名是
refs/tags/name
形式的引用。只要它们持有提交或命名提交的标记对象的散列ID,该提交及其所有前置项都将被保留


.tar和.zip文件将是GitHub使用
git archive
和标记的目标提交生成的文件。他们可能也会缓存这些东西,但这部分取决于GitHub。

谢谢torek。当我完全理解这一点时,我会把它标记为一个被接受的答案,但现在我已经把它投了赞成票。我可以看出您已经处理了元素(标记、分支、提交、blob、文件等)之间的每一点和每一种关系,我对此表示感谢。我可以看出GitHub基于git所做的事情与问题最关键的是提交在零个或多个分支中,但在“恰好一棵树”中有区别。我想了解一些内部信息。我知道git文档非常好,但是一天中只有这么多时间。
$ printf '../symlink' | git hash-object -t blob --stdin
54f939943aafe4022f2d20855230e33cafe1a8f9