我可以参考^
和~*number*
的向后修订,例如319411a^
或HEAD~3
。
是否有任何特定的语法来引用转发提交(类似于上面的语法)?
我不询问是否可以简单地引用转发提交。我问是否可以参考正向修订而无需手动找到所需的修订版SHA1。
答案 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提交对象只有父指针,遍历只是向后。提交可能会或可能不会有一个或多个“转发”提交。