是否有任何特定的语法来引用转发提交(不使用它的SHA1)?

时间:2013-09-09 13:19:31

标签: git

我可以参考^~*number*的向后修订,例如319411a^HEAD~3

是否有任何特定的语法来引用转发提交(类似于上面的语法)?

询问是否可以简单地引用转发提交。我问是否可以参考正向修订而无需手动找到所需的修订版SHA1。

2 个答案:

答案 0 :(得分:2)

没有;但是,使用git rev-list然后进一步工作,就有可能找到指向给定提交的项目。您必须首先选择一些起点(可能是--all),然后排除目标转速及其父级:

git rev-list --all --not rev

这当然会产生很长的转速列表,其中很多都是无趣的,所以它需要进一步过滤:你想要那些转速的父级是 rev

这个shell脚本(没有错误检查等)只处理first-parent:

target=$(git rev-parse $1)
git rev-list --all --not $target |
    while read rev; do
        if [ $(git rev-parse --verify --quiet $rev^) = $target ]; then
            echo $rev
        fi
    done

但是如何从那里看中它应该是非常明显的(参见git rev-list的文档)。使用:

git rev-list -1 --parents $rev

将单个rev转换为“rev及其父项”列表,用于合并,例如:

set -- $(git rev-list -1 --parents $rev)
shift # discard the rev itself
echo there are $# parents and they are $*
for parent do
    if [ $parent = $target ]; then
        echo $rev has $target as a parent
    fi
done

编辑:在大型仓库中,您可以使用git branch --contains获得更好的起点(如RainerBlome in "referencing the child of a commit"所示。请注意,您需要解析指示当前分支的*,如果你有HEAD“分离”,“当前分支”是“无分支”,你可能想要添加HEAD作为起点。然后,git rev-list --parents | grep ...是一种快速查找所需引用的方法。我已经使用这些建议来提高性能等。

这是一个完整的脚本,也有一些错误检查;经过轻微测试。

#! /bin/sh
#
# git-rev-list-children.sh

find_branches()
{
        local target="$1"

        set -- $(git branch --contains $target |
            sed -e 's/^\* (.*)/HEAD/' -e 's/^[* ] //')
        case $# in
        0) echo "there are no branches containing $revname"; return 1;;
        esac
        echo $@
}

find_children()
{
        local target="$1"
        shift

        git rev-list --parents "$@" ^$target | grep " $target" |
            while read line; do
                set -- $line
                echo $1
            done
}

# add option parsing (--short?) here if desired
case $# in
0) echo "usage: git-rev-list-children <rev> ..." >&2; exit 1;;
esac

for revname do
        target=$(git rev-parse "$revname") || exit 1
        set -- $(find_branches "$revname" || exit 1)
        find_children "$target" "$@"
done

答案 1 :(得分:0)

Git提交对象只有父指针,遍历只是向后。提交可能会或可能不会有一个或多个“转发”提交。