检索Git中特定提交的子提交列表
我想知道是否有一种有效的方法来检索给定提交的子级。 虽然在中讨论了一种方法,但它效率很低 我认为这将是在Git中完成的一件简单的事情,但显然不是检索Git中特定提交的子提交列表,git,Git,我想知道是否有一种有效的方法来检索给定提交的子级。 虽然在中讨论了一种方法,但它效率很低 我认为这将是在Git中完成的一件简单的事情,但显然不是 注意。git rev list可以显示子项,但这些子项必须可以从您提供的提交中访问。假设您希望显示从repo中的所有分支可以访问的所有子级,您可以使用 git rev-list --all --not $COMMIT^@ --children | grep "^$COMMIT" 这将输出一行,如下所示 $COMMIT $child1 $child2
注意。
git rev list
可以显示子项,但这些子项必须可以从您提供的提交中访问。假设您希望显示从repo中的所有分支可以访问的所有子级,您可以使用
git rev-list --all --not $COMMIT^@ --children | grep "^$COMMIT"
这将输出一行,如下所示
$COMMIT $child1 $child2 $child3 ...
为方便起见,您可以添加命令并将其转换为git别名:
children = "!f() { git rev-list --all --not $1^@ --children | grep $(git rev-parse $1); }; f" # reachable children of a ref
语法
$COMMIT^@
可能令人困惑,因此我将对此进行解释。希望$COMMIT
是不言自明的。然后是^@
,它将扩展到所引用提交的所有父级。所以$COMMIT^@
意味着“所有$COMMIT
的父母”。由于这遵循--not
标志,这将指示rev list
在命中$COMMIT
的任何父级后停止处理。这基本上只是一个优化,因为从$commit
可以访问的任何提交都不可能是子级
注意:这个答案的前一个版本说的是
tail-1
,而不是grep“^$COMMIT”
。这可能在一个简单的测试repo中起作用(这就是我最初这么说的原因),但不能保证git rev list最后会发出$COMMIT
,如果您有任何不包含$COMMIT的分支,我使用以下别名(基于:
- 无参数-给出
HEAD的所有子项
- 使用
commit ish
-给出该对象的所有子对象
顺便说一句,我知道gitk会完成这项工作,但我需要将其嵌入shell脚本中。因此,gitk是一个不可能的工具!@LeonardoPassos:好的,已删除。“可访问”是什么意思?@hellogoodbay“可访问”也就是说,如果你从一个给定的提交开始,然后遍历该提交的所有父级,然后遍历这些提交的所有父级,等等,你最终会命中所讨论的提交。为什么遍历父级而不是子级?@hellogoodbay,因为这不是“可到达的”意味着。此外,父项与子项没有任何直接链接。每次提交都将其父项的SHA嵌入到提交对象中,该对象用于计算提交的SHA。根据定义,提交不能嵌入其子项,并且父项无法访问子项。
# Get all children of current or specified commit-ish
children = "!bash -c 'c=${1:-HEAD}; set -- $(git rev-list --all --not \"$c\"^@ --children | grep $(git rev-parse \"$c\") ); shift; echo $*' -"