2012-06-11 72 views

回答

0

的图案基本上是:

sha1("tag " + datasize + "\0" + data) 

datagit cat-file输出。人们可以通过管道该输出产生这git-hash-object像这样:

git cat-file tag v0.30 | git hash-object -t tag --stdin 

而且相当于一个Perl的一行是:

git cat-file tag v0.30 | perl -MDigest::SHA1 -E '$/=undef;$_=<>;say Digest::SHA1->new->add("tag ".length()."\0".$_)->hex digest' 

看来,一个可以做同样的事情与任何只需将"tag "替换为适当的对象名即可:"blob ","tree ""commit "

0

这几乎是一样的,尽管提交对象前面的小标题是不同的。您可以使用git cat-file来查看实际的格式。

+0

啊,我看到'git cat-file'的输出返回实际散列的内容。 – theory

1

一个标签对象的内容如下:基于计算出的SHA1值文本

object <commit-sha1> 
type commit 
tag <tag-name> 
tagger <author-with-timestamp> 

<tag-message> 

我该如何在Git之外复制它(例如,在Perl或Python中)?

看看libgit2及其各种bindings

+0

太棒了。哪里?我发现[pygit2中的博客sha1代码](https://github.com/libgit2/pygit2/blob/master/test/utils.py#L54),但不是标签。我的ack-foo必须不足以支持libgit2 ... – theory

+0

没关系,我通过实验找出了它。看到我的答案。 – theory