34

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

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
}

这目前似乎运作良好,尽管它只是经过非常轻微的测试。

4

2 回答 2

19

您可能可以使用该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或者可能不属于前两个类别的其他内容。

于 2013-08-14T03:49:18.827 回答
8

请注意,git 1.8.5 或 1.9(2013 年第四季度)将提供一种新方法来测试 ref 是否为标签。

使“ foo^{tag}”剥离标签到自身,即无操作,如果“ foo”不是标签,则失败。

如何测试一个版本是一个标签?(或“检查 git 名称是否为标签”?)

git rev-parse --verify v1.0^{tag}

比:test $(git cat-file -t v1.0) = tag“。

请参阅Richard Hansen的提交75aa26dabdb54a1d

剥离洋葱():添加支持<rev>^{tag}

通过取消引用来完成<rev>^{<type>}对象描述符系列,直到找到标记对象(如果无法找到则失败)。<rev>^{tag}<rev>

乍一看,这似乎不是很有用,因为提交、树和 blob 不能剥离到标签,而标签只会剥离到自身。
但是,这可用于确保<rev>命名标记对象:

$ git rev-parse --verify v1.8.4^{tag}
04f013d
$ git rev-parse --verify master^{tag}
error: master^{tag}: expected tag type, but the object dereferences to tree type
fatal: Needed a single revision

<rev>用户已经可以通过检查 ' ' 的输出来确保它是一个标签对象git cat-file -t <rev>,但是:

  • 用户可能期望<rev>^{tag}存在,因为<rev>^{commit},<rev>^{tree}<rev>^{blob}都存在
  • 这种语法在某些情况下更方便/自然

但是,正如mtraceur评论中提到的,这不适用于轻量级标签(请参阅“创建标签”),它只是对象(通常是提交对象)的名称。

您会收到如下错误:

预期的标记类型,但对象取消引用树类型

因为,使用轻量级标签,实际上会解析提交,而不是实际的标签。
来自“ Git Internals - Git References ”:

https://git-scm.com/book/en/v2/images/data-model-4.png

如果您在提交上制作轻量级标签, git rev-parse ^{tag} 实际上会解析和取消引用提交本身,而不是标签。

于 2013-09-23T14:09:38.070 回答