在试图理解JGit: Retrieve tag associated with a git commit时,我在JGit邮件列表上找到了这个帖子: [jgit-dev] Commits and tags
在此主题中,他们引用org.eclipse.jgit.lib.Repository
的{{3}}方法:
剥去对带注释标签的可能没有剥离的引用。
我只能在Git文档中找到两个剥离提及:peel
和git-check-ref-format(1) Manual Page。
Git中的术语剥离是什么意思?它有用吗?它与洋葱有什么关系?
答案 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}
从提交转到树。