剥离在Git中意味着什么?

时间:2014-10-21 17:06:06

标签: git

在试图理解JGit: Retrieve tag associated with a git commit时,我在JGit邮件列表上找到了这个帖子: [jgit-dev] Commits and tags

在此主题中,他们引用org.eclipse.jgit.lib.Repository的{​​{3}}方法:

  

剥去对带注释标签的可能没有剥离的引用。

我只能在Git文档中找到两个剥离提及:peelgit-check-ref-format(1) Manual Page

Git中的术语剥离是什么意思?它有用吗?它与洋葱有什么关系?

2 个答案:

答案 0 :(得分:9)

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

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

通常,带注释的标签对象内的SHA-1将其称为" target-ID",并且该对象因此命名为" target"标记的 - 是提交对象的ID。在这种情况下,一切仍然非常清晰和简单。但是,如果它不是呢?

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

这"剥离"这个过程已被比作剥洋葱,以及短语的来源。

请注意,如果您正在编写存储库运行状况检查程序,那么确保标记链不循环可能是明智的(例如,如果标记1234567具有7654321为它的目标,而7654321是带有1234567作为目标的带注释标记?)。 (编辑:正如雷拉姆在评论中指出的那样,这需要"打破" 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

答案 1 :(得分:2)

“剥离”是指解除引用,例如从ref到注释标记对象到它指向的提交的ref。

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