gpt4 book ai didi

git - Git 中的 peel 是什么意思?

转载 作者:太空狗 更新时间:2023-10-29 12:46:08 25 4
gpt4 key购买 nike

试图理解JGit: Retrieve tag associated with a git commit ,我到达了 JGit 邮件列表上的这个线程: [jgit-dev] Commits and tags .

在此线程中,他们指的是 peel org.eclipse.jgit.lib.Repository方法:

Peel a possibly unpeeled reference to an annotated tag.

我只能在 Git 文档中找到两次关于剥离的提及:git-check-ref-format(1) Manual PageGit Internals - Maintenance and Data Recovery .

术语 peel 在 Git 中是什么意思?它有什么用?它与洋葱有什么关系?

最佳答案

您已经知道存储库中的每个对象都有一个唯一的 SHA-1,以及关联的类型和内容。 (从命令行,使用 git cat-file -t <em>sha1</em> 查看给定对象的类型,使用 git cat-file -p <em>sha1</em> 查看内容,可能应用了一些 pretty-print ,但格式通常相当原始。)

git 存储库中带注释的标记对象包含 SHA-1。 (我希望这部分是清楚且没有争议的。:-))

通常,带注释的标记对象内的 SHA-1(我们称其为“目标 ID”,因此命名为标记的“目标”的对象)是提交对象的 ID。在这种情况下,一切仍然非常清晰和简单。但如果不是呢?

特别是,一个带注释的标签的目标可能是另一个带注释的标签。如果是这种情况,您必须获取第二个带注释的标签,其中包含另一个目标 ID。你必须重复这个过程,一个标签一个标签地剥离,直到你到达一个非标签对象。理想情况下,这将是一次提交,但当然它可以是其余三种对象中的任何一种(尽管尚不清楚标记树或 blob 的含义;只有提交才有意义)。

这个“剥皮”过程被比作剥洋葱,这就是这个短语的来源。

请注意,如果您正在编写一个存储库健康检查程序,确保标签链不会循环可能是明智的(例如,如果标签 12345677654321 作为其目标,并且 7654321 是一个带注释的标签1234567 作为它的目标?)。 (编辑:正如 remram 在评论中指出的那样,这需要“破解”SHA-1。这意味着它在实践中几乎不可能发生,就像你不会得到一棵递归指向自身的树一样。)

编辑:如何制作指向另一个标签的标签:

... make a repo with a commit that can be tagged ...
$ git tag -a anno1 -m 'annotated tag'
$ git tag -a anno2 anno1 -m 'another tag'
$ git cat-file -p anno1
object d4ec8b2d465de0c087d645f52ba5040586b8ce0f
type commit
tag anno1
tagger Chris Torek <chris.torek@gmail.com> 1413933523 -0600

annotated tag
$ git cat-file -p anno2
object cd1e0637c348e46c645819ef6de36679052b4b7f
type tag
tag anno2
tagger Chris Torek <chris.torek@gmail.com> 1413934239 -0600

another tag

关于git - Git 中的 peel 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26492303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com