Git 中的剥离是什么意思?

问题描述 投票:0回答:2

在尝试理解JGit:检索与 git 提交相关的标签时,我在 JGit 邮件列表上找到了这个线程: [jgit-dev] 提交和标签

在此线程中,他们引用了 peel

org.eclipse.jgit.lib.Repository
 方法:

剥离对带注释标签的可能未剥离的引用。

我在 Git 文档中只能找到两次关于剥离的提及:git-check-ref-format(1) 手册页Git 内部 - 维护和数据恢复

Git 中术语“剥离”是什么意思?它有什么用? 它和洋葱有什么关系?

git terminology
2个回答
21
投票

您已经知道存储库中的每个对象都有一个唯一的 SHA-1,以及关联的类型和内容。 (在命令行中,使用

git cat-file -t sha1
查看给定对象的类型,使用
git cat-file -p sha1
查看内容,可能应用了一些漂亮的打印,但格式通常相当原始。)

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

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

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

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

请注意,如果您正在编写存储库运行状况检查器,那么确保标签链不会循环可能是明智的(例如,如果标签

1234567
7654321
作为其目标,并且
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 <[email protected]> 1413933523 -0600

annotated tag
$ git cat-file -p anno2
object cd1e0637c348e46c645819ef6de36679052b4b7f
type tag
tag anno2
tagger Chris Torek <[email protected]> 1413934239 -0600

another tag

5
投票

“剥离”是指取消引用,例如从带注释的标签对象的引用到它指向的提交上的引用。

该术语也用于

^{xxx}
语法的其他情况,例如使用
abc1234^{tree}
从提交到树。

© www.soinside.com 2019 - 2024. All rights reserved.