【问题标题】:simple ref vs lightweight tags in gitgit中的简单引用与轻量级标签
【发布时间】:2022-01-19 02:11:12
【问题描述】:

我目前正在尝试了解 git 的内部;我的问题是轻量级标签和简单 ref 有什么区别? 根据我到目前为止所读到的内容,轻量级标签实际上是一个带有标签名称的文件,其内容是一个对象ID [我猜是一个提交对象ID?]。在这个本书'git袖珍指南',作者说“一个simple ref直接指向一个object-id”;这就是我感到困惑的地方!在我看来,这些是相同的东西,但名称不同。 说轻量级标签是简单参考的特定版本是否正确?因为轻量级标签只能指向提交对象,而简单的 ref 不仅限于提交。

【问题讨论】:

  • 作者有没有a simple ref的例子?
  • @ElpieKay 是的; refs/tags/ 和 refs/heads/,分别保存标签和本地分支的名称。 git 引用在这些目录中[符号或简单]。

标签: git tags ref


【解决方案1】:

ref(或更长的变体,reference )是 Git 中的名称。引用的形式有很多种:

  • refs/heads/xyz分支名称 xyz;
  • refs/tags/xyz标签名称 xyz;
  • refs/remotes/origin/xyz 是您的 Git 用于名为 xyz 的分支的远程跟踪名称,如在您调用的其他 Git 存储库中所见 origin;

等等。

Git object 是四种对象类型之一:

  • blob 对象保存数据(例如文件内容或符号链接的目标);
  • 一个树对象在其中包含元组,其中mode告诉你hash是什么类型的Git对象> 指定并且 name 包含一个名称组件(目录或文件名);
  • 一个提交对象保存提交的元数据,它必须包含特定的标头(包括一个tree行,给出一个树对象的哈希ID:这是提交的快照);和
  • 标签对象带注释的标签对象包含标签数据,与提交一样,它必须包含特定的标头,包括提供哈希ID的object行标记对象(可以是四种对象类型中的任何一种,包括另一个带注释的标记)。

所有对象都有一个唯一的哈希 ID。此哈希 ID 充当简单 key-value database 中的键。 Git 将使用密钥来查找对象;您必须提供密钥(以某种方式)。如果你提供一个缩短的键——即一个键的前缀——Git 将查找由该前缀找到的所有对象;如果只找到一个,则假定它是正确的完整哈希 ID,然后我们从那里开始;如果找到多个,我们就有一个不明确的哈希 ID(可能是其中任何一个)。

所有 refs 必须包含一些现有的有效对象的哈希 ID。一些对象还包含哈希 ID;这些也必须是某些现有有效对象的哈希 ID。1

某些 ref 受限于它们可能包含的对象类型:特别是分支名称必须包含提交哈希 ID。由于远程跟踪名称是通过从其他 Git 存储库中读取分支名称来创建的(它应该遵守同样的一组约束),远程跟踪名称还应该包含一个提交哈希 ID。但是,标签名称可以包含四种内部对象类型中任何一种的哈希 ID。

轻量级标签refs/tags/* 形式的引用(因此是标签名称),它包含有效的哈希 ID,但它是用于内部 Git 对象的,不是 标签对象。 带注释的标记refs/tags/* 形式的引用,其中包含作为带注释的标记对象的对象的有效哈希 ID。

说轻量级标签是简单 ref 的特定版本是否正确?

大多数情况下,是的。轻量级标签是一个特定的 ref:以 refs/tags 开头(然后是斜线和更多名称字符)。但是,它还满足一个约束:in 中存储的哈希 ID 是 ref 是类型不是“带注释标签”的对象的哈希 ID。


1这种约束在所谓的部分克隆中有所放松。 (你可以有一个既浅又部分的克隆。)哈希 ID 应该是有效的,但在我们填充缺失的对象之前,我们无法判断它是否有效。

【讨论】:

    【解决方案2】:

    你是对的:轻量级标签一个简单的参考。

    它的主要特点是它存储在.git/refs/tags下,这是一个约定,表明git命令可以把它当作一个标签:

    • git tag --list会列出来,
    • git tag -d <tag_name> 会删除它,
    • 在某些情况下,git 会将名称 refs/tags/tag_name 缩短为 tag_name
    • 等等...

    与 refs 相关的其他主要约定是:

    • 分支存储在refs/heads
    • 远程引用(或远程分支)存储在refs/remotes/<remote_name>/

    这些引用也是简单的引用。


    一个非简单引用的例子是HEAD(存储在.git/HEAD)。

    你可以运行 cat .git/HEAD 来查看它的内容:如果你现在在一个分支上,你应该看到类似的东西:

    $ cat .git/HEAD
    ref: refs/heads/my_branch
    

    这称为符号引用,作用于HEAD(例如:git log HEAD)的命令会将HEAD“翻译”为my_branch

    【讨论】:

      猜你喜欢
      • 2012-04-25
      • 1970-01-01
      • 2011-10-17
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      • 2011-11-28
      相关资源
      最近更新 更多