微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

在这个公开可用的 GitHub 存储库 https://github.com/ServiceNow/devtraining-needit-quebec 中看到只有一个分支 main,其中包含三个小文件一个包含一个文件文件夹:

  • 更新[文件夹]
    • sys_ui_view_5bd975bd0fa03200cd674f8ce1050e7f.xml
  • README.md
  • 校验和.txt
  • sys_app_6ead8e780f603200cd674f8ce1050ed1.xml

只有一个分支,main,但是有94个标签。每个标签都与 2 个“资产”相关联,这些“资产”对于标签来说是独一无二的。每个标签都有一个代码 .zip 和源代码 .tgz。这些存档文件在我看来都是独一无二的,其中包含一组独特的文件。唯一是指所有档案中的所有文件和档案本身是相互排斥的。

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

那么,一个标签如何代表一组完全位于任何分支之外的独特文件?到目前为止我能想到的唯一解释是 1.我对 git 的理解是错误的或不完整的。 2. GitHub 以某种方式扩展了 git,我对 GitHub 的理解也是错误的或不完整的。

解决方法

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

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

是:这是一个哈希 ID,目前是 SHA-1 哈希。

它代表一个指针,指向所有先前块的总和与当前块之间的变化。

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

打开(或返回)标签:

每个标签都关联了 2 个“资产”,这些“资产”对于该标签来说是独一无二的。每个标签都有一个源代码 .zip 和源代码 .tgz。

这些很可能是 GitHub 即时生成的。标签名称包含唯一标识符:哈希 ID。每个哈希 ID 都定位一个提交对象(使其成为“轻量级标签”,GitHub 不会将其称为 release)或一个 标签对象(或注释标记对象)。一个带注释的标签对象包含元数据,这个元数据的一部分通常是某个提交的哈希 ID。

那么,一个标签如何代表一组完全位于任何分支之外的独特文件?

回到分支的东西:

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

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

(其实我们可以算出它的hash:../symlink的长度是十个字节,所以我们想要blob 10\0../symlink的SHA1和:

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

或:

$ printf '../symlink' | git hash-object -t blob --stdin
54f939943aafe4022f2d20855230e33cafe1a8f9

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

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

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

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

对于保持活动的提交,但是,它只需要可以从任何引用访问。标记名称是 refs/tags/name 形式的引用。只要它们持有提交的哈希 ID,或命名提交的标记对象的哈希 ID,该提交及其所有 前驱都会被保留。

.tar 和 .zip 文件是 GitHub 使用 git archive 和标签的目标提交制作的文件。他们也可以缓存这些东西,但这部分取决于 GitHub。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。