我正在尝试使用libgit2来读取当前分支的名称。我必须做某种决心吗?
我尝试使用
git_branch_lookup
查找git_reference
的{{1}},但结果为
HEAD
谢谢!
答案 0 :(得分:8)
正在运行git branch -a
未列出HEAD
。在libgit2中,HEAD
也不被视为有效分支。这只是参考。
如果你想发现哪个引用是当前分支,那么你应该
HEAD
引用(尝试git_repository_head()
便捷方法)git_reference_type()
)GIT_REF_SYMBOLIC
或GIT_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);
}