代码之家  ›  专栏  ›  技术社区  ›  talles

是否有任何特定的语法可以引用前向提交(不使用它的SHA1)?

git
  •  3
  • talles  · 技术社区  · 12 年前

    我可以参考 ^ ~*number* 喜欢 319411a^ HEAD~3 .

    是否有任何特定的语法可以引用前向提交(类似于上面的语法)?

    我是 不是 询问是否可以简单地引用转发提交。我想知道是否可以在不手动查找所需修订SHA1的情况下参考正向修订。

    2 回复  |  直到 12 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

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

    git rev-list --all --not rev

    当然,这会产生一长串rev,其中许多都不感兴趣,因此需要进一步过滤:您需要rev的父级所在的rev rev .

    这个shell脚本(没有错误检查等)只处理第一个父级:

    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版本列表 ). 使用:

    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
    
        2
  •  0
  •   Tero Tilus    12 年前

    Git提交对象只有一个父指针,并且遍历只能向后进行。提交可能有也可能没有一个或多个“正向”提交。