【问题标题】:How to check if HEAD is tagged如何检查 HEAD 是否被标记
【发布时间】:2017-11-26 20:16:08
【问题描述】:

这是我尝试过的一个示例:

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

我感到恐慌:

线程'main'在Err值上的'称为Result::unwrap()时惊慌失措:错误{代码:-12,klass:11,消息:“ID为\'33030777b0a6b61f631be64c3f1cb7d66b8f3082\'的git_object无法成功剥离到一个标签(git_otype=4)。” }', /checkout/src/libcore/result.rs:906:4

我错过了什么?

【问题讨论】:

    标签: git rust


    【解决方案1】:

    HEAD 通常不指代标签;它指的是另一个 ref(例如refs/heads/master),它指的是一个提交,它指的是一棵树。

    Peeling,据我理解,是解引用其他对象或引用的对象的过程。但是,由于HEAD 不引用标签,因此您不能剥离HEAD 并期望获得标签。


    Git 有两个独立的标签 概念。 标签引用只是refs/tags/ 下的引用。 带注释的标签是 Git 数据库中的对象,就像提交、树和 blob 一样。标签引用可以引用任何类型的对象,但通常它们会引用提交或标签对象。

    无论您是在使用带注释的标签还是任何类型的标签,第一步都是相同的:您必须迭代 refs/tags/ 中的引用并检查它们中的任何一个是否与 HEAD 相同的提交剥去。如果您对带注释的标签特别感兴趣,可以检查标签引用是否剥离到标签对象。

    【讨论】:

      【解决方案2】:

      作为Francis Gagné says,您无法从提交中获取标签——您必须走另一条路。此外,一个提交可以有多个标签。适当的数据结构是提交引用到标记引用列表的映射:

      extern crate git2;
      
      use std::collections::BTreeMap;
      use git2::Repository;
      
      fn main() {
          let repo = Repository::open("/tmp/foo").unwrap();
          let tag_names = repo.tag_names(None).unwrap();
      
          let tag_and_refs = tag_names.iter()
              .flat_map(|name| name)
              .flat_map(|name| {
                  let full_tag = format!("refs/tags/{}", name);
                  repo.find_reference(&full_tag).map(|reference| (name, reference))
              });
      
          let mut refs_to_tags = BTreeMap::new();
          for (name, reference) in tag_and_refs {
              refs_to_tags.entry(reference).or_insert_with(Vec::new).push(name);
          }
      
          let git_ref = repo.head().unwrap();
      
          let tags = &refs_to_tags[&git_ref];
          println!("tags for HEAD: {:?}", tags);
      }
      

      这只处理轻量级标签,这是您的示例使用的。

      另见:

      【讨论】:

      • 为什么选择BTreeMap,而不是HashMap
      • @Tshepang 因为只有BTreeMap 可以编译。自己试试吧。
      猜你喜欢
      • 2015-08-01
      • 1970-01-01
      • 2014-10-01
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 2014-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多