给定git refname,我可以检测它是散列,标记还是分支?

Chr*_*and 24 git

我正在编写一个脚本,该脚本将采用用作创建分支的基础的规范.因此,它会有这样的东西:

git checkout -b $newbranch $startingpoint
Run Code Online (Sandbox Code Playgroud)

现在,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
}
Run Code Online (Sandbox Code Playgroud)

这似乎现在很好用,虽然它只是经过了非常轻微的测试.

lar*_*sks 15

您可以使用该show-ref命令(主要)执行您想要的操作.给定一些字符串,如果它引用了一个标签,那么......

git show-ref --verify refs/tags/$thestring
Run Code Online (Sandbox Code Playgroud)

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

git show-ref --verify refs/heads/$thestring
Run Code Online (Sandbox Code Playgroud)

......将是真的.如果字符串失败了那两个测试,那么......

git rev-parse --verify "$thestring^{commit}"
Run Code Online (Sandbox Code Playgroud)

...会告诉你它是否引用了一个提交(可能是一个完整的SHA1,一个部分SHA1 HEAD,或者可能是其他不属于前两个类别的东西).

  • 我认为这会让我走上我想要的道路。在激励案例中,我认为我真正需要区分的是分支……和其他任何东西(因为标签只是特定提交的名称)。因此, <code>show-ref --verify refs/heads/$thestring</code> 应该可以满足我的需求。我会试试看。 (2认同)

Von*_*onC 7

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

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

如何测试修订是一个标签?(或"检查git名称是否为标签"?)

git rev-parse --verify v1.0^{tag}
Run Code Online (Sandbox Code Playgroud)

比以下更方便:test $(git cat-file -t v1.0) = tag".

见提交75aa26dabdb54a1d,由理查德·汉森:

peel_onion():添加支持 <rev>^{tag}

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

乍一看,这似乎不太有用,因为提交,树木和斑点不能剥到标签上,而标签只会剥离自己.
但是,这可以用于确保<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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这似乎只适用于带注释的标签,而不适用于轻量级标签。 (4认同)