这是我尝试过的一个例子:
cd /tmp
cargo new --bin foo
cd foo
cat > src/main.rs << EOF
extern crate git2;
use git2::{Repository, ObjectType};
fn main() {
let repo = Repository::open("/tmp/foo").unwrap();
let git_ref = repo.head().unwrap();
git_ref.peel(ObjectType::Tag).unwrap();
}
EOF
cargo add git2
git add .
git commit --message "foo"
git tag foo
cargo run
我感到 panic :
thread 'main' panicked at 'called
Result::unwrap()
on anErr
value: Error { code: -12, klass: 11, message: "the git_object of id \'33030777b0a6b61f631be64c3f1cb7d66b8f3082\' can not be successfully peeled into a tag (git_otype=4)." }', /checkout/src/libcore/result.rs:906:4
我错过了什么?
最佳答案
HEAD
通常不引用标签;它引用另一个引用(例如 refs/heads/master
),它引用一个提交,引用一个树。
剥离,据我理解,就是对被其他对象或引用所引用的对象进行解引用的过程。但是,由于 HEAD
不引用标记,因此您不能剥离 HEAD
并期望获得标记。
Git 有两个独立的标签 概念。 标签引用 只是refs/tags/
下的引用。 带注释的标签 是 Git 数据库中的对象,就像提交、树和 blob 一样。标记引用可以引用任何类型的对象,但通常它们会引用提交或标记对象。
无论您是在带注释的标签还是任何类型的标签之后,第一步都是相同的:您必须迭代 refs/tags/
中的引用并检查它们是否有任何剥离与 HEAD
剥离到相同的提交。如果您对带注释的标签特别感兴趣,可以检查标签引用是否剥离到标签对象。
关于git - 如何检查 HEAD 是否被标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47500612/