git - 给定一个 git refname,我可以检测它是散列、标签还是分支?

标签 git

我正在编写一个脚本,该脚本将接受用作创建分支基础的规范。因此,它将具有如下内容:

git checkout -b $newbranch $startingpoint

现在,startingpoint 可以指定为分支名称、标签或 SHA1。

在脚本的后面,我需要根据 startingpoint 的实际情况做不同的事情。我原以为 git rev-parse 会给我这个信息,但我似乎无法随心所欲地改变它。

是否有 git 方式(最好是瓷器)来获取我寻找的信息?

更新

我使用 show-ref 信息来制作以下 shell 函数:

git_ref_type() {
    [ -n "$1" ] || die "Missing ref name"

    if git show-ref -q --verify "refs/heads/$1" 2>/dev/null; then
        echo "branch"
    elif git show-ref -q --verify "refs/tags/$1" 2>/dev/null; then
        echo "tag"
    elif git show-ref -q --verify "refs/remote/$1" 2>/dev/null; then
        echo "remote"
    elif git rev-parse --verify "$1^{commit}" >/dev/null 2>&1; then
        echo "hash"
    else
        echo "unknown"
    fi
    return 0
}

虽然只经过了非常轻微的测试,但目前看来效果不错。

最佳答案

您可能可以使用 show-ref 命令来完成(大部分)您想做的事情。给定一些字符串,如果它引用一个标签,那么...

git show-ref --verify refs/tags/$thestring

...将是真实的。如果是分支名称,那么...

git show-ref --verify refs/heads/$thestring

...将是真实的。如果字符串未通过这两项测试,则...

git rev-parse --verify "$thestring^{commit}"

...将告诉您它是否以其他方式引用提交(可能是完整的 SHA1、部分 SHA1、HEAD,或者可能是不属于前两个的其他内容类别。

关于git - 给定一个 git refname,我可以检测它是散列、标签还是分支?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18222634/

相关文章:

git - 忽略同一根目录中的多个文件夹

git:为一个空项目推送一个新的空分支?

git - 两个人在 git 中同时处理一个文件

git - 如何创建子分支?

windows - 笔记本电脑和 PC 之间的 git 服务器(MS Windows 7)

git - cap deploy 突然说身份验证失败

git - 如何在限制 ssh 的防火墙后面通过 https 访问 heroku git

django - 是什么导致 Django 中的 "Unknown command: ' makemigrations'"?

git - 删除 Git 跟踪的文件

git - 你如何在 Git 提交中搜索制表符?