如何在libgit2中获取当前分支的名称?

时间:2012-08-26 18:41:58

标签: libgit2

我正在尝试使用libgit2来读取当前分支的名称。我必须做某种决心吗?

我尝试使用

git_branch_lookup

查找git_reference的{​​{1}},但结果为

HEAD

谢谢!

3 个答案:

答案 0 :(得分:8)

正在运行git branch -a未列出HEAD。在libgit2中,HEAD也不被视为有效分支。这只是参考

如果你想发现哪个引用是当前分支,那么你应该

  • 加载当前HEAD引用(尝试git_repository_head()便捷方法)
  • 确定其类型(使用git_reference_type()
  • 根据其类型(GIT_REF_SYMBOLICGIT_REF_OID)检索以下其中一项
    • 分支的名称(使用git_reference_symbolic_target()
    • 指向的提交(使用git_reference_target()

答案 1 :(得分:0)

当遇到这个确切的问题时,我没有发现现有的答案/评论有帮助。相反,我将 git_reference_lookup()git_reference_symbolic_target() 结合起来。

git_reference* head_ref;
git_reference_lookup(&head_ref, repo, "HEAD");
const char *symbolic_ref;
symbolic_ref = git_reference_symbolic_target(head_ref);
std::string result;
// Skip leading "refs/heads/" -- 11 chars.
if (symbolic_ref) result = &symbolic_ref[11];
git_reference_free(head_ref);

这感觉像是一个肮脏的黑客,但它是我管理过的最好的。 result 字符串要么以空结尾(例如分离头,没有检出分支)或包含检出分支的名称。符号目标归 ref 所有,因此在释放它之前将该值复制到字符串中!

答案 2 :(得分:0)

https://libgit2.org/libgit2/ex/HEAD/status.html 有一个例子。它基于方法 get_reference_shorthand。这应该给出分支名称而不是引用,因此不需要字符串操作,并且它也应该适用于分支和远程具有不同名称的边缘情况。

static void show_branch(git_repository *repo, int format)
{
  int error = 0;
  const char *branch = NULL;
  git_reference *head = NULL;

  error = git_repository_head(&head, repo);

  if (error == GIT_EUNBORNBRANCH || error == GIT_ENOTFOUND)
    branch = NULL;
  else if (!error) {
    branch = git_reference_shorthand(head);
  } else
    check_lg2(error, "failed to get current branch", NULL);

  if (format == FORMAT_LONG)
    printf("# On branch %s\n",
      branch ? branch : "Not currently on any branch.");
  else
    printf("## %s\n", branch ? branch : "HEAD (no branch)");

  git_reference_free(head);
}