一个特定的git repo怎么可能只包含一个分支,而它的94个标记中的每一个都返回没有出现在分支中的文件?
我在这个公开的GitHub repo中看到,只有一个分支main,它包含三个小文件和一个包含一个小文件的文件夹:一个特定的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
- 更新[文件夹]
- sys_ui_view_5bd975bd0fa03200cd674f8ce1050e7f.xml
- 自述文件
- checksum.txt
- sys_app_6ead8e780f603200cd674f8ce1050ed1.xml
那么,标记如何表示完全位于任何分支之外的一组唯一文件呢?到目前为止,我能想到的唯一解释是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